b93904526c
## What The one-off worker container boot is billed to whichever test resolves the fixture first. This moves it into a `beforeAll` with its own timeout. ## Why vitest runs the fixture chain *inside* the test timer: ```js // @vitest/runner 4.1.7 setFn(task, withTimeout(...withFixtures(handler)..., timeout, ...)) ``` There is no `fixtureTimeout`. So booting Postgres (plus `CREATE DATABASE`, schema push, ClickHouse and Redis) lands on the first test and consumes a budget sized for test work. That is why losing the image pre-pull on fork PRs was fatal rather than merely slower: the extra ~10s crossed the 60s cap. Since fork time is roughly internal + 10s and forks exceed 60s, internal runs were already clearing that cap by under 10s — a latent flake regardless of forks. ## How `withWarmup` wraps each fixture family and lazily registers a `beforeAll` on first touch, with its own generous timeout. Registration is lazy so only files that actually use a family pay for it — `@internal/testcontainers` is imported by hundreds of test files, many of which only need Redis. It registers once per file, since `isolate` gives each file a fresh module registry. Eight families are wrapped. `isolatedRedisTest`, `replicationContainerTest` and `postgresAndRedisTest` are deliberately untouched: they use per-test containers by design, so there is no one-off boot to hoist. No test file or CI changes, and it applies to every package using these fixtures. ## Verification Proven by mutation. `src/warmup.test.ts` runs container tests under a deliberately tight cap: | | Result | | --- | --- | | with the warm-up | passes | | warm-up neutered | fails, `Test timed out` | It is kept as a regression test — without it, unwrapping a fixture would break nothing visibly. `triggerFailedTask.call.test.ts`, one of the five shard casualties, passes locally in 20.4s. ## Also here `@internal/testcontainers` had no `test` script, so `turbo run test --filter "@internal/*"` skipped the package and its existing `heteroDedicated.test.ts` never ran in CI. Adding the script (matching the sibling packages') runs both files; verified green through turbo exactly as CI invokes it.
33 lines
829 B
JSON
33 lines
829 B
JSON
{
|
|
"name": "@internal/testcontainers",
|
|
"private": true,
|
|
"version": "0.0.1",
|
|
"main": "./src/index.ts",
|
|
"types": "./src/index.ts",
|
|
"exports": {
|
|
".": "./src/index.ts",
|
|
"./webapp": "./src/webapp.ts",
|
|
"./sequencer": {
|
|
"types": "./src/sequencer.d.cts",
|
|
"default": "./src/sequencer.cjs"
|
|
}
|
|
},
|
|
"dependencies": {
|
|
"@clickhouse/client": "^1.11.1",
|
|
"@trigger.dev/database": "workspace:*",
|
|
"ioredis": "~5.6.0"
|
|
},
|
|
"devDependencies": {
|
|
"@internal/run-ops-database": "workspace:*",
|
|
"@testcontainers/postgresql": "^11.14.0",
|
|
"@testcontainers/redis": "^11.14.0",
|
|
"std-env": "^3.9.0",
|
|
"testcontainers": "^11.14.0",
|
|
"tinyexec": "^0.3.0"
|
|
},
|
|
"scripts": {
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "vitest --sequence.concurrent=false --no-file-parallelism"
|
|
}
|
|
}
|