Three of the six Vitest projects ran on Vitest's own testTimeout: 5000 and five on its hookTimeout/teardownTimeout: 10000, and all 788 Testing Library waits in the web unit project ran on asyncUtilTimeout: 1000. None of those numbers was chosen here, and all of them were sized for an idle machine rather than for three or four concurrent worktree sessions each running a full local:gate on eight cores. #2292, #2278, #2250, #1942 and #1742 were each that class, diagnosed one site at a time. This is the complement of #1596, not a retreat from it: every fix that issue produced stands, and no race is hidden here. What changes is that a correct, deterministic test is no longer cut off by a budget nobody picked. - vitest.shared.mts exports frozen TIMEOUTS / INTEGRATION_TIMEOUTS; all six projects spread one of them, clients/launcher importing the shared module for the first time to do so. - Both web projects configure Testing Library's asyncUtilTimeout. The storybook one needs its own setup file, deliberately outside .storybook/ and free of setProjectAnnotations so the automatic preview-annotation provisioning (#1898) is untouched. - 28 per-suite restatements of the integration project's own budget are gone, so raising the shared value now moves every site under it. The handful that genuinely differ — cross-process lock contention, a full OAuth round trip — keep their budget as a named constant that says why. - AppRenderer's waitFor no longer asks for exactly its enclosing budget, which it could never win (#2292's shape); cli's e2e child timer drops below the project budget so the bound carrying the diagnostic is the one that fires. - The transition auto-settle's slack term is named RAF_SLACK_MS and raised; the term derived from HEADER_ANIM_MS is untouched. The two answer to different things and must not be scaled as one number. - The 19 Playwright budgets scattered across three web smokes become four named constants in scripts/lib/browser-timeouts.mjs. scripts/verify-test-timeouts.mjs resolves each project through Vitest itself and asserts the budgets, the asyncUtilTimeout sites, and that retry stays unset. It was observed red against the pre-change config: unit/tui/launcher at testTimeout 5000, five projects at hookTimeout 10000, both asyncUtilTimeout sites unmet. Closes #2323 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PsmUAZ6aLUAFqenjJKSSRp Signed-off-by: cliffhall <cliff@futurescale.com>
50 lines
1.9 KiB
TypeScript
50 lines
1.9 KiB
TypeScript
import path from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
import { defineConfig } from "vitest/config";
|
|
import { TIMEOUTS, vitestSharedPaths } from "../../vitest.shared.mts";
|
|
|
|
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
const { projectResolve } = vitestSharedPaths(dirname);
|
|
|
|
export default defineConfig({
|
|
resolve: projectResolve,
|
|
test: {
|
|
globals: false,
|
|
environment: "node",
|
|
include: ["__tests__/**/*.test.{ts,tsx}"],
|
|
setupFiles: ["./__tests__/setup.ts"],
|
|
// Shared budgets (#2323). Ink renders through React, so every assertion
|
|
// here waits on a React commit under v8 instrumentation — the shape behind
|
|
// the poll-budget raises in #1742 and #1942.
|
|
...TIMEOUTS,
|
|
coverage: {
|
|
provider: "v8",
|
|
reporter: ["text", "html", "json-summary"],
|
|
// The entire React surface — App.tsx, every Ink component, and the
|
|
// useSelectableList hook — is under the gate via ink-testing-library
|
|
// renderer tests (#1501): components mount through the ink-scroll-view /
|
|
// ink-form passthrough doubles in __tests__/helpers/, App.tsx mounts
|
|
// against a controllable mock of the @inspector/core surface, and
|
|
// keypresses are driven through stdin. No React-surface exclusions
|
|
// remain; all new logic under src/ is automatically held to the gate.
|
|
include: ["src/**/*.{ts,tsx}"],
|
|
exclude: [
|
|
// Pure re-export + type alias of core's server resolver (no runtime
|
|
// statements of its own — the logic is measured in core via the web
|
|
// suite). tui-servers.test.ts still exercises it behaviorally; it's
|
|
// excluded here only so it doesn't surface as a misleading 0/0 row.
|
|
"src/tui-servers.ts",
|
|
"**/*.test.ts",
|
|
"**/*.test.tsx",
|
|
"**/*.d.ts",
|
|
],
|
|
thresholds: {
|
|
perFile: true,
|
|
lines: 90,
|
|
statements: 90,
|
|
functions: 90,
|
|
branches: 90,
|
|
},
|
|
},
|
|
},
|
|
});
|