diff --git a/.changeset/silver-bananas-kick.md b/.changeset/silver-bananas-kick.md new file mode 100644 index 0000000000..b678f403a4 --- /dev/null +++ b/.changeset/silver-bananas-kick.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Serialize test database shutdown, and add logging diff --git a/packages/backend-test-utils/src/database/TestDatabases.ts b/packages/backend-test-utils/src/database/TestDatabases.ts index 6ff1a2e6f7..45d2899dbb 100644 --- a/packages/backend-test-utils/src/database/TestDatabases.ts +++ b/packages/backend-test-utils/src/database/TestDatabases.ts @@ -276,19 +276,28 @@ export class TestDatabases { private async shutdown() { const instances = [...this.instanceById.values()]; - await Promise.all( - instances.map(async ({ stopContainer, connections }) => { + this.instanceById.clear(); + + for (const { stopContainer, connections, databaseManager } of instances) { + for (const connection of connections) { try { - await Promise.all(connections.map(c => c.destroy())); - } catch { - // ignore + await connection.destroy(); + } catch (error) { + console.warn(`TestDatabases: Failed to destroy connection`, { + connection, + error, + }); } - try { - await stopContainer?.(); - } catch { - // ignore - } - }), - ); + } + + try { + await stopContainer?.(); + } catch (error) { + console.warn(`TestDatabases: Failed to stop container`, { + databaseManager, + error, + }); + } + } } } diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts index 5bf05cda98..fe3c050e69 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts @@ -36,7 +36,6 @@ import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; import { TaskScheduler } from '@backstage/backend-tasks'; jest.setTimeout(60_000); -jest.useFakeTimers(); const testFactRetriever: FactRetriever = { id: 'test_factretriever', @@ -203,30 +202,36 @@ describe('FactRetrieverEngine', () => { }); } - const handler = jest.fn(); - engine = await createEngine( - databaseId, - insertCallback, - () => {}, - undefined, - { ...testFactRetriever, handler }, - ); - await engine.schedule(); - const job = await engine.getJobRegistration(testFactRetriever.id); - expect(job.cadence!!).toEqual(defaultCadence); + jest.useFakeTimers(); - await engine.triggerJob(job.factRetriever.id); - jest.advanceTimersByTime(5000); + try { + const handler = jest.fn(); + engine = await createEngine( + databaseId, + insertCallback, + () => {}, + undefined, + { ...testFactRetriever, handler }, + ); + await engine.schedule(); + const job = await engine.getJobRegistration(testFactRetriever.id); + expect(job.cadence!!).toEqual(defaultCadence); - const handlerParam = await new Promise(resolve => - handler.mockImplementation(resolve), - ); + await engine.triggerJob(job.factRetriever.id); + jest.advanceTimersByTime(5000); - await expect(handlerParam).toEqual( - expect.objectContaining({ - entityFilter: testFactRetriever.entityFilter, - }), - ); + const handlerParam = await new Promise(resolve => + handler.mockImplementation(resolve), + ); + + await expect(handlerParam).toEqual( + expect.objectContaining({ + entityFilter: testFactRetriever.entityFilter, + }), + ); + } finally { + jest.useRealTimers(); + } }, ); });