serialize test db shutdown

Signed-off-by: Fredrik Adelöw <freben@gmail.com>
This commit is contained in:
Fredrik Adelöw
2023-09-18 14:31:19 +02:00
parent 474cd71ab8
commit eb1594da58
3 changed files with 53 additions and 34 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-test-utils': patch
---
Serialize test database shutdown, and add logging
@@ -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,
});
}
}
}
}
@@ -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();
}
},
);
});