diff --git a/test/vitest-projects-config.test.ts b/test/vitest-projects-config.test.ts index d4e0f7619e69..42daabca0e55 100644 --- a/test/vitest-projects-config.test.ts +++ b/test/vitest-projects-config.test.ts @@ -38,6 +38,7 @@ import { fullSuiteVitestShards } from "./vitest/vitest.test-shards.mjs"; import { createUiVitestConfig } from "./vitest/vitest.ui.config.ts"; import { createUnitFastFakeTimersVitestConfig } from "./vitest/vitest.unit-fast-fake-timers.config.ts"; import { createUnitFastIsolatedVitestConfig } from "./vitest/vitest.unit-fast-isolated.config.ts"; +import unitFastRootConfig from "./vitest/vitest.unit-fast-root.config.ts"; import { createUnitFastVitestConfig } from "./vitest/vitest.unit-fast.config.ts"; import { createUnitVitestConfig } from "./vitest/vitest.unit.config.ts"; @@ -279,6 +280,14 @@ describe("projects vitest config", () => { expect(testConfig.runner).toBeUndefined(); }); + it("keeps root-matrix unit-fast files on the cross-file cleanup runner", () => { + const testConfig = requireTestConfig(unitFastRootConfig); + expect(testConfig.isolate).toBe(false); + expect(normalizeConfigPath(testConfig.runner)).toBe("test/non-isolated-runner.ts"); + expect(rootVitestProjects).toContain("test/vitest/vitest.unit-fast-root.config.ts"); + expect(rootVitestProjects).not.toContain("test/vitest/vitest.unit-fast.config.ts"); + }); + it("isolates forced unit-fast files from shared module caches", () => { const config = createUnitFastIsolatedVitestConfig(); const testConfig = requireTestConfig(config); diff --git a/test/vitest/vitest.config.ts b/test/vitest/vitest.config.ts index 5de738b11913..58337e6dceb7 100644 --- a/test/vitest/vitest.config.ts +++ b/test/vitest/vitest.config.ts @@ -37,7 +37,7 @@ export const rootVitestProjects = [ ...agentVitestProjectConfigs, "test/vitest/vitest.daemon.config.ts", "test/vitest/vitest.media.config.ts", - "test/vitest/vitest.unit-fast.config.ts", + "test/vitest/vitest.unit-fast-root.config.ts", "test/vitest/vitest.unit-fast-isolated.config.ts", "test/vitest/vitest.unit-fast-fake-timers.config.ts", "test/vitest/vitest.plugin-sdk-light.config.ts", diff --git a/test/vitest/vitest.unit-fast-root.config.ts b/test/vitest/vitest.unit-fast-root.config.ts new file mode 100644 index 000000000000..0b5bc7422dfb --- /dev/null +++ b/test/vitest/vitest.unit-fast-root.config.ts @@ -0,0 +1,5 @@ +// Root-matrix unit-fast config preserves cross-file cleanup when CLI filters bypass lane ownership. +import { nonIsolatedRunnerPath } from "./vitest.shared.config.ts"; +import { createUnitFastVitestConfig } from "./vitest.unit-fast.config.ts"; + +export default createUnitFastVitestConfig(process.env, { runner: nonIsolatedRunnerPath }); diff --git a/test/vitest/vitest.unit-fast.config.ts b/test/vitest/vitest.unit-fast.config.ts index b048ddb19e2a..ab11e54c20ed 100644 --- a/test/vitest/vitest.unit-fast.config.ts +++ b/test/vitest/vitest.unit-fast.config.ts @@ -10,7 +10,7 @@ import { export function createUnitFastVitestConfig( env: Record = process.env, - options: { argv?: string[] } = {}, + options: { argv?: string[]; runner?: string } = {}, ) { const sharedTest = sharedVitestConfig.test ?? {}; const includeFromEnv = loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env); @@ -27,7 +27,7 @@ export function createUnitFastVitestConfig( ...sharedTest, name: "unit-fast", isolate: false, - runner: undefined, + runner: options.runner, // Env isolation only (no shared-setup mocks): membership is auto-curated, // so tests must never read the developer's real config/state. setupFiles: [resolveRepoRootPath("test/setup.env.ts")],