From 3610c8ffb9abe1b60732cd05fb0003c0aa3816a9 Mon Sep 17 00:00:00 2001 From: Josh Dover Date: Tue, 11 Feb 2020 07:46:57 -0700 Subject: [PATCH] =?UTF-8?q?[7.x]=20Ensure=20http=20interceptors=20are=20sh?= =?UTF-8?q?ares=20across=20lifecycle=20met=E2=80=A6=20(#57264)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/public/core_system.ts | 2 +- src/core/public/http/http_service.test.ts | 29 ++++++++++++++++++++++- src/core/public/http/http_service.ts | 13 +++++++--- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/core/public/core_system.ts b/src/core/public/core_system.ts index 5fb12ec154952..5c10d89459128 100644 --- a/src/core/public/core_system.ts +++ b/src/core/public/core_system.ts @@ -211,7 +211,7 @@ export class CoreSystem { const injectedMetadata = await this.injectedMetadata.start(); const uiSettings = await this.uiSettings.start(); const docLinks = await this.docLinks.start({ injectedMetadata }); - const http = await this.http.start({ injectedMetadata, fatalErrors: this.fatalErrorsSetup! }); + const http = await this.http.start(); const savedObjects = await this.savedObjects.start({ http }); const i18n = await this.i18n.start(); const fatalErrors = await this.fatalErrors.start(); diff --git a/src/core/public/http/http_service.test.ts b/src/core/public/http/http_service.test.ts index f95d25d116976..a40fcb06273dd 100644 --- a/src/core/public/http/http_service.test.ts +++ b/src/core/public/http/http_service.test.ts @@ -25,13 +25,40 @@ import { fatalErrorsServiceMock } from '../fatal_errors/fatal_errors_service.moc import { injectedMetadataServiceMock } from '../injected_metadata/injected_metadata_service.mock'; import { HttpService } from './http_service'; +describe('interceptors', () => { + afterEach(() => fetchMock.restore()); + + it('shares interceptors across setup and start', async () => { + fetchMock.get('*', {}); + const injectedMetadata = injectedMetadataServiceMock.createSetupContract(); + const fatalErrors = fatalErrorsServiceMock.createSetupContract(); + const httpService = new HttpService(); + + const setup = httpService.setup({ fatalErrors, injectedMetadata }); + const setupInterceptor = jest.fn(); + setup.intercept({ request: setupInterceptor }); + + const start = httpService.start(); + const startInterceptor = jest.fn(); + start.intercept({ request: startInterceptor }); + + await setup.get('/blah'); + expect(setupInterceptor).toHaveBeenCalledTimes(1); + expect(startInterceptor).toHaveBeenCalledTimes(1); + + await start.get('/other-blah'); + expect(setupInterceptor).toHaveBeenCalledTimes(2); + expect(startInterceptor).toHaveBeenCalledTimes(2); + }); +}); + describe('#stop()', () => { it('calls loadingCount.stop()', () => { const injectedMetadata = injectedMetadataServiceMock.createSetupContract(); const fatalErrors = fatalErrorsServiceMock.createSetupContract(); const httpService = new HttpService(); httpService.setup({ fatalErrors, injectedMetadata }); - httpService.start({ fatalErrors, injectedMetadata }); + httpService.start(); httpService.stop(); expect(loadingServiceMock.stop).toHaveBeenCalled(); }); diff --git a/src/core/public/http/http_service.ts b/src/core/public/http/http_service.ts index 567cdd310cbdf..8965747ba6837 100644 --- a/src/core/public/http/http_service.ts +++ b/src/core/public/http/http_service.ts @@ -35,6 +35,7 @@ interface HttpDeps { export class HttpService implements CoreService { private readonly anonymousPaths = new AnonymousPathsService(); private readonly loadingCount = new LoadingCountService(); + private service?: HttpSetup; public setup({ injectedMetadata, fatalErrors }: HttpDeps): HttpSetup { const kibanaVersion = injectedMetadata.getKibanaVersion(); @@ -42,7 +43,7 @@ export class HttpService implements CoreService { const fetchService = new Fetch({ basePath, kibanaVersion }); const loadingCount = this.loadingCount.setup({ fatalErrors }); - return { + this.service = { basePath, anonymousPaths: this.anonymousPaths.setup({ basePath }), intercept: fetchService.intercept.bind(fetchService), @@ -56,10 +57,16 @@ export class HttpService implements CoreService { put: fetchService.put.bind(fetchService), ...loadingCount, }; + + return this.service; } - public start(deps: HttpDeps) { - return this.setup(deps); + public start() { + if (!this.service) { + throw new Error(`HttpService#setup() must be called first!`); + } + + return this.service; } public stop() {