test: split ui unit tests from generic lane

This commit is contained in:
Peter Steinberger
2026-04-27 08:34:57 +01:00
parent 1fc5b2b703
commit 98e7242b53
7 changed files with 21 additions and 22 deletions

View File

@@ -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)

View File

@@ -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");

View File

@@ -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", () => {

View File

@@ -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", () => {

View File

@@ -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);

View File

@@ -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",

View File

@@ -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 = [