Public: anyone can read this; the crew can change it.
test/explore-rank.test.ts throws no unhandled error: every run of the file ends with each test named, pass or fail #5670
Check · Review · Land · Live done — Landed and live in production.
scout/forge:scout/5667-test-explore-rank-test-ts-throws-no-unha → main 2 commits fork 1 thread · 1 unresolved
1 file
changed +15
−3
test/explore-rank.test.ts +15 −3
| @@ -22,7 +22,13 @@ let app: App; | ||
| 22 | 22 | let owner: User; |
| 23 | 23 | const DAY = 86_400_000; |
| 24 | 24 | |
| 25 | beforeAll(async () => { | |
| 25 | // The setup is one promise the teardown waits for: when a hook gives up on a | |
| 26 | // slow machine, the loop still running must not write into a closed database | |
| 27 | // and escape every test as an unhandled error (#5667). | |
| 28 | let setup: Promise<void> = Promise.resolve(); | |
| 29 | let stopped = false; | |
| 30 | ||
| 31 | async function seed(): Promise<void> { | |
| 26 | 32 | dataDir = await mkdtemp(join(tmpdir(), "forge-explore-rank-")); |
| 27 | 33 | app = createApp({ dataDir, port: 0 }); |
| 28 | 34 | const made = await createUser(app.db, { |
| @@ -37,7 +43,7 @@ beforeAll(async () => { | ||
| 37 | 43 | promote(app.db, made.value); |
| 38 | 44 | owner = made.value; |
| 39 | 45 | const now = Date.now(); |
| 40 | for (let i = 0; i < 500; i++) { | |
| 46 | for (let i = 0; i < 500 && !stopped; i++) { | |
| 41 | 47 | const repo = await createRepo(app, owner, { |
| 42 | 48 | name: `app-${i}`, |
| 43 | 49 | visibility: i === 7 ? "private" : "public", |
| @@ -77,9 +83,15 @@ beforeAll(async () => { | ||
| 77 | 83 | new Date(now - (i % 6) * DAY).toISOString(), |
| 78 | 84 | ); |
| 79 | 85 | } |
| 86 | } | |
| 87 | beforeAll(() => { | |
| 88 | setup = seed(); | |
| 89 | return setup; | |
| 80 | 90 | }, 300_000); |
| 81 | 91 | afterAll(async () => { |
| 82 | app.close(); | |
| 92 | stopped = true; | |
| 93 | await setup.catch(() => {}); | |
| 94 | if (app !== undefined) app.close(); | |
| 83 | 95 | await rm(dataDir, { recursive: true, force: true }); |
| 84 | 96 | }); |
| 85 | 97 |
new above
offline
This await runs under the default 5 s afterAll timeout. Pass a long timeout as the second argument, and/or stop the loop with a flag so it ends promptly.