From 07342778df3f4b4484f72ef808541d9c97fc6140 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 2 Dec 2022 11:27:12 +0100 Subject: [PATCH 01/11] backend-app-api,backend-test-api: hook up shutdown hook to stop method Co-authored-by: Johan Haals Signed-off-by: Patrik Oldsberg --- packages/backend-app-api/api-report.md | 2 ++ .../src/wiring/BackendInitializer.ts | 22 ++++++++++++ .../src/wiring/BackstageBackend.ts | 6 ++-- packages/backend-app-api/src/wiring/types.ts | 1 + packages/backend-test-utils/api-report.md | 3 +- .../src/next/wiring/TestBackend.test.ts | 35 +++++++++++++++++-- .../src/next/wiring/TestBackend.ts | 28 ++++++++++++--- 7 files changed, 87 insertions(+), 10 deletions(-) diff --git a/packages/backend-app-api/api-report.md b/packages/backend-app-api/api-report.md index 5008b1efe1..6cbb992ef8 100644 --- a/packages/backend-app-api/api-report.md +++ b/packages/backend-app-api/api-report.md @@ -26,6 +26,8 @@ export interface Backend { add(feature: BackendFeature): void; // (undocumented) start(): Promise; + // (undocumented) + stop(): Promise; } // @public (undocumented) diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index c86cd8382d..5a5f65a5a9 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -17,8 +17,10 @@ import { BackendFeature, ExtensionPoint, + lifecycleServiceRef, ServiceRef, } from '@backstage/backend-plugin-api'; +import { BackendLifecycleImpl } from '../services/implementations/lifecycleService'; import { BackendRegisterInit, ServiceHolder, @@ -165,4 +167,24 @@ export class BackendInitializer { return orderedRegisterInits; } + + async stop(): Promise { + if (!this.#started) { + throw new Error('Backend has not started'); + } + this.#started = false; + + const lifecycleService = await this.#serviceHolder.get( + lifecycleServiceRef, + 'root', + ); + + // TODO(Rugvip): :D + const lifecycle = (lifecycleService as any)?.lifecycle; + if (lifecycle instanceof BackendLifecycleImpl) { + await lifecycle.shutdown(); + } else { + throw new Error('Unexpected lifecycle service implementation'); + } + } } diff --git a/packages/backend-app-api/src/wiring/BackstageBackend.ts b/packages/backend-app-api/src/wiring/BackstageBackend.ts index 1d76161bfe..c53f47b685 100644 --- a/packages/backend-app-api/src/wiring/BackstageBackend.ts +++ b/packages/backend-app-api/src/wiring/BackstageBackend.ts @@ -36,7 +36,7 @@ export class BackstageBackend implements Backend { await this.#initializer.start(); } - // async stop(): Promise { - // await this.#initializer.stop(); - // } + async stop(): Promise { + await this.#initializer.stop(); + } } diff --git a/packages/backend-app-api/src/wiring/types.ts b/packages/backend-app-api/src/wiring/types.ts index 40ce6aa1ae..3e1acce08e 100644 --- a/packages/backend-app-api/src/wiring/types.ts +++ b/packages/backend-app-api/src/wiring/types.ts @@ -28,6 +28,7 @@ import { BackstageBackend } from './BackstageBackend'; export interface Backend { add(feature: BackendFeature): void; start(): Promise; + stop(): Promise; } export interface BackendRegisterInit { diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 2fe4ed31d3..3df3f3cb21 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -3,6 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { Backend } from '@backstage/backend-app-api'; import { BackendFeature } from '@backstage/backend-plugin-api'; import { ExtensionPoint } from '@backstage/backend-plugin-api'; import { Knex } from 'knex'; @@ -23,7 +24,7 @@ export function setupRequestMockHandlers(worker: { export function startTestBackend< TServices extends any[], TExtensionPoints extends any[], ->(options: TestBackendOptions): Promise; +>(options: TestBackendOptions): Promise; // @alpha (undocumented) export interface TestBackendOptions< diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts index 164e06d3b5..b87e157477 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts @@ -19,6 +19,7 @@ import { createExtensionPoint, createServiceFactory, createServiceRef, + lifecycleServiceRef, } from '@backstage/backend-plugin-api'; import { startTestBackend } from './TestBackend'; @@ -31,7 +32,7 @@ describe('TestBackend', () => { const extensionPoint3 = createExtensionPoint({ id: 'b3' }); const extensionPoint4 = createExtensionPoint({ id: 'b4' }); const extensionPoint5 = createExtensionPoint({ id: 'b5' }); - await startTestBackend({ + const backend = await startTestBackend({ services: [ // @ts-expect-error [extensionPoint1, { a: 'a' }], @@ -58,6 +59,7 @@ describe('TestBackend', () => { ], }); expect(1).toBe(1); + await backend.stop(); }); it('should start the test backend', async () => { @@ -87,11 +89,40 @@ describe('TestBackend', () => { }, }); - await startTestBackend({ + const backend = await startTestBackend({ services: [sf], features: [testModule()], }); expect(testFn).toHaveBeenCalledWith('winning'); + await backend.stop(); + }); + + it('should stop the test backend', async () => { + const shutdownSpy = jest.fn(); + + const testModule = createBackendModule({ + moduleId: 'test.module', + pluginId: 'test', + register(env) { + env.registerInit({ + deps: { + lifecycle: lifecycleServiceRef, + }, + async init({ lifecycle }) { + lifecycle.addShutdownHook({ fn: shutdownSpy }); + }, + }); + }, + }); + + const backend = await startTestBackend({ + services: [], + features: [testModule()], + }); + + expect(shutdownSpy).not.toHaveBeenCalled(); + await backend.stop(); + expect(shutdownSpy).toHaveBeenCalled(); }); }); diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index 677ba930cc..9c9427e332 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -14,7 +14,13 @@ * limitations under the License. */ -import { createSpecializedBackend } from '@backstage/backend-app-api'; +import { + Backend, + createSpecializedBackend, + lifecycleFactory, + loggerFactory, + rootLoggerFactory, +} from '@backstage/backend-app-api'; import { ServiceFactory, ServiceRef, @@ -47,11 +53,17 @@ export interface TestBackendOptions< features?: BackendFeature[]; } +const defaultServiceFactories = [ + rootLoggerFactory(), + loggerFactory(), + lifecycleFactory(), +]; + /** @alpha */ export async function startTestBackend< TServices extends any[], TExtensionPoints extends any[], ->(options: TestBackendOptions): Promise { +>(options: TestBackendOptions): Promise { const { services = [], extensionPoints = [], @@ -69,17 +81,23 @@ export async function startTestBackend< service: ref, deps: {}, factory: async () => async () => impl, - }); + })(); } return createServiceFactory({ service: ref, deps: {}, factory: async () => impl, - }); + })(); } return serviceDef as ServiceFactory; }); + for (const factory of defaultServiceFactories) { + if (!factories.some(f => f.service === factory.service)) { + factories.push(factory); + } + } + const backend = createSpecializedBackend({ ...otherOptions, services: factories, @@ -101,4 +119,6 @@ export async function startTestBackend< } await backend.start(); + + return backend; } From 52a9bd35c7b3f87e6038a01b0968335709090454 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 2 Dec 2022 14:01:28 +0100 Subject: [PATCH 02/11] backend-test-utils: automatically stop backends after test Co-authored-by: Johan Haals Signed-off-by: Patrik Oldsberg --- .../src/wiring/BackendInitializer.ts | 2 +- packages/backend-test-utils/api-report.md | 2 ++ .../src/next/wiring/TestBackend.test.ts | 7 ++-- .../src/next/wiring/TestBackend.ts | 32 +++++++++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index 5a5f65a5a9..c3e2a3fa3d 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -170,7 +170,7 @@ export class BackendInitializer { async stop(): Promise { if (!this.#started) { - throw new Error('Backend has not started'); + return; } this.#started = false; diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 3df3f3cb21..90a315f745 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -31,6 +31,8 @@ export interface TestBackendOptions< TServices extends any[], TExtensionPoints extends any[], > { + // (undocumented) + autoStop?: boolean; // (undocumented) extensionPoints?: readonly [ ...{ diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts index b87e157477..383a182db2 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts @@ -32,7 +32,7 @@ describe('TestBackend', () => { const extensionPoint3 = createExtensionPoint({ id: 'b3' }); const extensionPoint4 = createExtensionPoint({ id: 'b4' }); const extensionPoint5 = createExtensionPoint({ id: 'b5' }); - const backend = await startTestBackend({ + await startTestBackend({ services: [ // @ts-expect-error [extensionPoint1, { a: 'a' }], @@ -59,7 +59,6 @@ describe('TestBackend', () => { ], }); expect(1).toBe(1); - await backend.stop(); }); it('should start the test backend', async () => { @@ -89,13 +88,12 @@ describe('TestBackend', () => { }, }); - const backend = await startTestBackend({ + await startTestBackend({ services: [sf], features: [testModule()], }); expect(testFn).toHaveBeenCalledWith('winning'); - await backend.stop(); }); it('should stop the test backend', async () => { @@ -119,6 +117,7 @@ describe('TestBackend', () => { const backend = await startTestBackend({ services: [], features: [testModule()], + autoStop: false, }); expect(shutdownSpy).not.toHaveBeenCalled(); diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index 9c9427e332..dbb4cff59a 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -51,6 +51,7 @@ export interface TestBackendOptions< }, ]; features?: BackendFeature[]; + autoStop?: boolean; } const defaultServiceFactories = [ @@ -59,6 +60,8 @@ const defaultServiceFactories = [ lifecycleFactory(), ]; +const backendInstances = new Array(); + /** @alpha */ export async function startTestBackend< TServices extends any[], @@ -68,6 +71,7 @@ export async function startTestBackend< services = [], extensionPoints = [], features = [], + autoStop = true, ...otherOptions } = options; @@ -103,6 +107,10 @@ export async function startTestBackend< services: factories, }); + if (autoStop) { + backendInstances.push(backend); + } + backend.add({ id: `---test-extension-point-registrar`, register(reg) { @@ -122,3 +130,27 @@ export async function startTestBackend< return backend; } + +let registered = false; +function registerTestHooks() { + if (typeof afterEach !== 'function') { + return; + } + if (registered) { + return; + } + registered = true; + + afterEach(async () => { + for (const backend of backendInstances) { + try { + await backend.stop(); + } catch (error) { + console.error(`Failed to stop backend after test, ${error}`); + } + } + backendInstances.length = 0; + }); +} + +registerTestHooks(); From afa3bf5657745deed1518bd38c7d4b4cf39ad7de Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 2 Dec 2022 14:03:24 +0100 Subject: [PATCH 03/11] changesets: added changeset for backend-test-utils auto stop Co-authored-by: Johan Haals Signed-off-by: Patrik Oldsberg --- .changeset/green-moose-leave.md | 5 +++++ .changeset/nasty-colts-cough.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/green-moose-leave.md create mode 100644 .changeset/nasty-colts-cough.md diff --git a/.changeset/green-moose-leave.md b/.changeset/green-moose-leave.md new file mode 100644 index 0000000000..23e4b6878f --- /dev/null +++ b/.changeset/green-moose-leave.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Backends started with `startTestBackend` are now automatically stopped after the each test, unless the `autoStop` option is set to `false`. diff --git a/.changeset/nasty-colts-cough.md b/.changeset/nasty-colts-cough.md new file mode 100644 index 0000000000..5dd098ec27 --- /dev/null +++ b/.changeset/nasty-colts-cough.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Added `.stop()` method to `Backend`. From 1f2edda7c3b5663fff4995b53e4dbfb41296e804 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 2 Dec 2022 16:37:50 +0100 Subject: [PATCH 04/11] backend-app-api: text Signed-off-by: Patrik Oldsberg --- packages/backend-app-api/src/wiring/BackendInitializer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index c3e2a3fa3d..dca4a08b8e 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -179,7 +179,7 @@ export class BackendInitializer { 'root', ); - // TODO(Rugvip): :D + // TODO(Rugvip): Find a better way to do this const lifecycle = (lifecycleService as any)?.lifecycle; if (lifecycle instanceof BackendLifecycleImpl) { await lifecycle.shutdown(); From e507d9dbb76747cc23e7d099f3f0f88b8c75a66b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 2 Dec 2022 16:41:00 +0100 Subject: [PATCH 05/11] backend-test-utils: switch autoStop option to use afterEach | never Signed-off-by: Patrik Oldsberg --- packages/backend-test-utils/api-report.md | 2 +- .../backend-test-utils/src/next/wiring/TestBackend.test.ts | 2 +- packages/backend-test-utils/src/next/wiring/TestBackend.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index 90a315f745..b791f90726 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -32,7 +32,7 @@ export interface TestBackendOptions< TExtensionPoints extends any[], > { // (undocumented) - autoStop?: boolean; + autoStop?: 'afterEach' | 'never'; // (undocumented) extensionPoints?: readonly [ ...{ diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts index 383a182db2..21200fe281 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts @@ -117,7 +117,7 @@ describe('TestBackend', () => { const backend = await startTestBackend({ services: [], features: [testModule()], - autoStop: false, + autoStop: 'never', }); expect(shutdownSpy).not.toHaveBeenCalled(); diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index dbb4cff59a..a273e879ce 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -51,7 +51,7 @@ export interface TestBackendOptions< }, ]; features?: BackendFeature[]; - autoStop?: boolean; + autoStop?: 'afterEach' | 'never'; } const defaultServiceFactories = [ @@ -71,7 +71,7 @@ export async function startTestBackend< services = [], extensionPoints = [], features = [], - autoStop = true, + autoStop = 'afterEach', ...otherOptions } = options; From bb41a58c6abb1962c727e63aebf399ee4ee37f16 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 2 Dec 2022 16:43:54 +0100 Subject: [PATCH 06/11] fix coreServices conflicts Signed-off-by: Patrik Oldsberg --- packages/backend-app-api/src/wiring/BackendInitializer.ts | 4 ++-- .../backend-test-utils/src/next/wiring/TestBackend.test.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index dca4a08b8e..c423096d36 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -17,7 +17,7 @@ import { BackendFeature, ExtensionPoint, - lifecycleServiceRef, + coreServices, ServiceRef, } from '@backstage/backend-plugin-api'; import { BackendLifecycleImpl } from '../services/implementations/lifecycleService'; @@ -175,7 +175,7 @@ export class BackendInitializer { this.#started = false; const lifecycleService = await this.#serviceHolder.get( - lifecycleServiceRef, + coreServices.lifecycle, 'root', ); diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts index 21200fe281..417dfa0477 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts @@ -19,7 +19,7 @@ import { createExtensionPoint, createServiceFactory, createServiceRef, - lifecycleServiceRef, + coreServices, } from '@backstage/backend-plugin-api'; import { startTestBackend } from './TestBackend'; @@ -105,7 +105,7 @@ describe('TestBackend', () => { register(env) { env.registerInit({ deps: { - lifecycle: lifecycleServiceRef, + lifecycle: coreServices.lifecycle, }, async init({ lifecycle }) { lifecycle.addShutdownHook({ fn: shutdownSpy }); From deaa069b76a69da21e9c4067be33f1da69373e1c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 14 Dec 2022 11:27:19 +0100 Subject: [PATCH 07/11] backend-app-api: do not allow backends to be restarted MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Co-authored-by: Johan Haals Signed-off-by: Patrik Oldsberg --- packages/backend-app-api/src/wiring/BackendInitializer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts index c423096d36..c8da028f26 100644 --- a/packages/backend-app-api/src/wiring/BackendInitializer.ts +++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts @@ -172,7 +172,6 @@ export class BackendInitializer { if (!this.#started) { return; } - this.#started = false; const lifecycleService = await this.#serviceHolder.get( coreServices.lifecycle, From 73a8f69d62076750efc8a2fd59292b2d9300e5e8 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 14 Dec 2022 11:27:43 +0100 Subject: [PATCH 08/11] backend-test-utils: only clean up test backends after all tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Co-authored-by: Johan Haals Signed-off-by: Patrik Oldsberg --- packages/backend-test-utils/api-report.md | 2 -- .../src/next/wiring/TestBackend.test.ts | 33 ++++++++++++++++++- .../src/next/wiring/TestBackend.ts | 16 ++++----- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/packages/backend-test-utils/api-report.md b/packages/backend-test-utils/api-report.md index b791f90726..3df3f3cb21 100644 --- a/packages/backend-test-utils/api-report.md +++ b/packages/backend-test-utils/api-report.md @@ -31,8 +31,6 @@ export interface TestBackendOptions< TServices extends any[], TExtensionPoints extends any[], > { - // (undocumented) - autoStop?: 'afterEach' | 'never'; // (undocumented) extensionPoints?: readonly [ ...{ diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts index 417dfa0477..3cc8507df3 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.test.ts @@ -23,6 +23,38 @@ import { } from '@backstage/backend-plugin-api'; import { startTestBackend } from './TestBackend'; +// This bit makes sure that test backends are cleaned up properly +let globalTestBackendHasBeenStopped = false; +beforeAll(async () => { + await startTestBackend({ + services: [], + features: [ + createBackendModule({ + moduleId: 'test.module', + pluginId: 'test', + register(env) { + env.registerInit({ + deps: { lifecycle: coreServices.lifecycle }, + async init({ lifecycle }) { + lifecycle.addShutdownHook({ + fn() { + globalTestBackendHasBeenStopped = true; + }, + }); + }, + }); + }, + })(), + ], + }); +}); + +afterAll(() => { + if (!globalTestBackendHasBeenStopped) { + throw new Error('Expected backend to have been stopped'); + } +}); + describe('TestBackend', () => { it('should get a type error if service implementation does not match', async () => { type Obj = { a: string; b: string }; @@ -117,7 +149,6 @@ describe('TestBackend', () => { const backend = await startTestBackend({ services: [], features: [testModule()], - autoStop: 'never', }); expect(shutdownSpy).not.toHaveBeenCalled(); diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index a273e879ce..7dbcf439dc 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -51,7 +51,6 @@ export interface TestBackendOptions< }, ]; features?: BackendFeature[]; - autoStop?: 'afterEach' | 'never'; } const defaultServiceFactories = [ @@ -60,7 +59,7 @@ const defaultServiceFactories = [ lifecycleFactory(), ]; -const backendInstances = new Array(); +const backendInstancesToCleanUp = new Array(); /** @alpha */ export async function startTestBackend< @@ -71,7 +70,6 @@ export async function startTestBackend< services = [], extensionPoints = [], features = [], - autoStop = 'afterEach', ...otherOptions } = options; @@ -107,9 +105,7 @@ export async function startTestBackend< services: factories, }); - if (autoStop) { - backendInstances.push(backend); - } + backendInstancesToCleanUp.push(backend); backend.add({ id: `---test-extension-point-registrar`, @@ -141,15 +137,15 @@ function registerTestHooks() { } registered = true; - afterEach(async () => { - for (const backend of backendInstances) { + afterAll(async () => { + for (const backend of backendInstancesToCleanUp) { try { await backend.stop(); } catch (error) { - console.error(`Failed to stop backend after test, ${error}`); + console.error(`Failed to stop backend after tests, ${error}`); } } - backendInstances.length = 0; + backendInstancesToCleanUp.length = 0; }); } From 2dbe5f00c545258f11da01741c3b3362ed4bc7d8 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 14 Dec 2022 18:00:32 +0100 Subject: [PATCH 09/11] changesets: update changeset to reflect startTestBackend updates Signed-off-by: Patrik Oldsberg --- .changeset/green-moose-leave.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/green-moose-leave.md b/.changeset/green-moose-leave.md index 23e4b6878f..df6ff04d82 100644 --- a/.changeset/green-moose-leave.md +++ b/.changeset/green-moose-leave.md @@ -2,4 +2,4 @@ '@backstage/backend-test-utils': patch --- -Backends started with `startTestBackend` are now automatically stopped after the each test, unless the `autoStop` option is set to `false`. +Backends started with `startTestBackend` are now automatically stopped after all tests have run. From 341927c47e84b4e67251e0ae3ede3f14b5af8f07 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 14 Dec 2022 18:00:51 +0100 Subject: [PATCH 10/11] backend-test-utils: stop all running test instances concurrently Signed-off-by: Patrik Oldsberg --- .../src/next/wiring/TestBackend.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index 7dbcf439dc..5558a74ca1 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -138,13 +138,15 @@ function registerTestHooks() { registered = true; afterAll(async () => { - for (const backend of backendInstancesToCleanUp) { - try { - await backend.stop(); - } catch (error) { - console.error(`Failed to stop backend after tests, ${error}`); - } - } + await Promise.all( + backendInstancesToCleanUp.map(async backend => { + try { + await backend.stop(); + } catch (error) { + console.error(`Failed to stop backend after tests, ${error}`); + } + }), + ); backendInstancesToCleanUp.length = 0; }); } From 5a18e01bfa18d9bc5f622faf99ec53d5e6bec36a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 14 Dec 2022 22:52:38 +0100 Subject: [PATCH 11/11] backend-test-utils: check afterEach -> afterAll Signed-off-by: Patrik Oldsberg --- packages/backend-test-utils/src/next/wiring/TestBackend.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts index 5558a74ca1..1d401bbf6f 100644 --- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts @@ -129,7 +129,7 @@ export async function startTestBackend< let registered = false; function registerTestHooks() { - if (typeof afterEach !== 'function') { + if (typeof afterAll !== 'function') { return; } if (registered) {