From 73a8f69d62076750efc8a2fd59292b2d9300e5e8 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 14 Dec 2022 11:27:43 +0100 Subject: [PATCH] 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; }); }