diff --git a/docs/help/testing.md b/docs/help/testing.md index 62020aeca2f..4480345a8b9 100644 --- a/docs/help/testing.md +++ b/docs/help/testing.md @@ -443,7 +443,7 @@ Think of the suites as “increasing realism” (and increasing flakiness/cost): - Command: `pnpm test` - Config: untargeted runs use the `vitest.full-*.config.ts` shard set and may expand multi-project shards into per-project configs for parallel scheduling -- Files: core/unit inventories under `src/**/*.test.ts`, `packages/**/*.test.ts`, `test/**/*.test.ts`, and the whitelisted `ui` node tests covered by `vitest.unit.config.ts` +- Files: core/unit inventories under `src/**/*.test.ts`, `packages/**/*.test.ts`, and `test/**/*.test.ts`; UI unit tests run in the dedicated `unit-ui` shard - Scope: - Pure unit tests - In-process integration tests (gateway auth, routing, tooling, parsing, config) diff --git a/test/vitest-projects-config.test.ts b/test/vitest-projects-config.test.ts index 3d84a922659..d3d6a405e48 100644 --- a/test/vitest-projects-config.test.ts +++ b/test/vitest-projects-config.test.ts @@ -140,21 +140,21 @@ describe("projects vitest config", () => { ]); }); - it("keeps the root ui lane aligned with the isolated jsdom setup", () => { + it("keeps the root ui lane aligned with the shared jsdom setup", () => { const config = createUiVitestConfig(); expect(config.test.environment).toBe("jsdom"); - expect(config.test.isolate).toBe(true); - expect(config.test.runner).toBeUndefined(); + expect(config.test.isolate).toBe(false); + expect(normalizeConfigPath(config.test.runner)).toBe("test/non-isolated-runner.ts"); const setupFiles = normalizeConfigPaths(config.test.setupFiles); expect(setupFiles).not.toContain("test/setup-openclaw-runtime.ts"); expect(setupFiles).toContain("ui/src/test-helpers/lit-warnings.setup.ts"); expect(config.test.deps?.optimizer?.web?.enabled).toBe(true); }); - it("keeps the unit-ui shard aligned with the isolated jsdom setup", () => { + it("keeps the unit-ui shard aligned with the shared jsdom setup", () => { expect(unitUiConfig.test?.environment).toBe("jsdom"); - expect(unitUiConfig.test?.isolate).toBe(true); - expect(unitUiConfig.test?.runner).toBeUndefined(); + expect(unitUiConfig.test?.isolate).toBe(false); + expect(normalizeConfigPath(unitUiConfig.test?.runner)).toBe("test/non-isolated-runner.ts"); const setupFiles = normalizeConfigPaths(unitUiConfig.test?.setupFiles); expect(setupFiles).not.toContain("test/setup-openclaw-runtime.ts"); expect(setupFiles).toContain("ui/src/test-helpers/lit-warnings.setup.ts"); diff --git a/test/vitest-scoped-config.test.ts b/test/vitest-scoped-config.test.ts index 9cee32e5ea2..f3c9d65f637 100644 --- a/test/vitest-scoped-config.test.ts +++ b/test/vitest-scoped-config.test.ts @@ -327,8 +327,8 @@ describe("scoped vitest configs", () => { } expect(defaultUiConfig.test?.pool).toBe("threads"); - expect(defaultUiConfig.test?.isolate).toBe(true); - expect(defaultUiConfig.test?.runner).toBeUndefined(); + expect(defaultUiConfig.test?.isolate).toBe(false); + expect(normalizeConfigPath(defaultUiConfig.test?.runner)).toBe("test/non-isolated-runner.ts"); }); it("keeps the process lane off the openclaw runtime setup", () => { diff --git a/test/vitest-unit-config.test.ts b/test/vitest-unit-config.test.ts index 99dba3abec1..e86c9fcfd62 100644 --- a/test/vitest-unit-config.test.ts +++ b/test/vitest-unit-config.test.ts @@ -78,6 +78,13 @@ describe("unit vitest config", () => { it("keeps acp and ui tests out of the generic unit lane", () => { const unitConfig = createUnitVitestConfig({}); expect(unitConfig.test?.exclude).toEqual(expect.arrayContaining(["extensions/**", "test/**"])); + expect(unitConfig.test?.include).not.toEqual( + expect.arrayContaining([ + "ui/src/ui/app-chat.test.ts", + "ui/src/ui/chat/**/*.test.ts", + "ui/src/ui/views/chat.test.ts", + ]), + ); }); it("narrows the active include list to CLI file filters when present", () => { diff --git a/test/vitest-unit-paths.test.ts b/test/vitest-unit-paths.test.ts index 3e6d459725d..d09874eee53 100644 --- a/test/vitest-unit-paths.test.ts +++ b/test/vitest-unit-paths.test.ts @@ -3,8 +3,8 @@ import { bundledPluginFile } from "./helpers/bundled-plugin-paths.js"; import { isUnitConfigTestFile } from "./vitest/vitest.unit-paths.mjs"; describe("isUnitConfigTestFile", () => { - it("accepts unit-config src tests", () => { - expect(isUnitConfigTestFile("ui/src/ui/views/channels.test.ts")).toBe(true); + it("accepts unit-config package tests", () => { + expect(isUnitConfigTestFile("packages/plugin-package-contract/src/index.test.ts")).toBe(true); }); it("rejects files excluded from the unit config", () => { @@ -31,8 +31,8 @@ describe("isUnitConfigTestFile", () => { expect(isUnitConfigTestFile("test/extension-test-boundary.test.ts")).toBe(false); expect(isUnitConfigTestFile("src/agents/pi-embedded-runner.test.ts")).toBe(false); expect(isUnitConfigTestFile("src/commands/onboard.test.ts")).toBe(false); - expect(isUnitConfigTestFile("ui/src/ui/views/channels.test.ts")).toBe(true); - expect(isUnitConfigTestFile("ui/src/ui/views/chat.test.ts")).toBe(true); + expect(isUnitConfigTestFile("ui/src/ui/views/channels.test.ts")).toBe(false); + expect(isUnitConfigTestFile("ui/src/ui/views/chat.test.ts")).toBe(false); expect(isUnitConfigTestFile("ui/src/ui/views/other.test.ts")).toBe(false); expect(isUnitConfigTestFile("src/infra/git-commit.live.test.ts")).toBe(false); expect(isUnitConfigTestFile("src/infra/git-commit.e2e.test.ts")).toBe(false); diff --git a/test/vitest/vitest.config.ts b/test/vitest/vitest.config.ts index 4a922d7d326..dffe2ddb031 100644 --- a/test/vitest/vitest.config.ts +++ b/test/vitest/vitest.config.ts @@ -11,6 +11,7 @@ export { resolveDefaultVitestPool, resolveLocalVitestMaxWorkers, resolveLocalVit export const rootVitestProjects = [ "test/vitest/vitest.unit.config.ts", + "test/vitest/vitest.unit-ui.config.ts", "test/vitest/vitest.infra.config.ts", "test/vitest/vitest.boundary.config.ts", "test/vitest/vitest.contracts-channel-surface.config.ts", diff --git a/test/vitest/vitest.unit-paths.mjs b/test/vitest/vitest.unit-paths.mjs index 1b005c2905e..2287afee3d7 100644 --- a/test/vitest/vitest.unit-paths.mjs +++ b/test/vitest/vitest.unit-paths.mjs @@ -5,15 +5,6 @@ export const unitTestIncludePatterns = [ "src/**/*.test.ts", "packages/**/*.test.ts", "test/**/*.test.ts", - "ui/src/ui/app-chat.test.ts", - "ui/src/ui/chat/**/*.test.ts", - "ui/src/ui/views/agents-utils.test.ts", - "ui/src/ui/views/channels.test.ts", - "ui/src/ui/views/chat.test.ts", - "ui/src/ui/views/dreams.test.ts", - "ui/src/ui/views/usage-render-details.test.ts", - "ui/src/ui/controllers/agents.test.ts", - "ui/src/ui/controllers/chat.test.ts", ]; export const boundaryTestFiles = [