diff --git a/test/scripts/ci-node-test-plan.test.ts b/test/scripts/ci-node-test-plan.test.ts index 265565595cde..73fd616529b1 100644 --- a/test/scripts/ci-node-test-plan.test.ts +++ b/test/scripts/ci-node-test-plan.test.ts @@ -11,6 +11,7 @@ import { expectNoNodeFsScans } from "../../src/test-utils/fs-scan-assertions.js" import { listGitTrackedFiles, sortRepoPaths, toRepoPath } from "../../src/test-utils/repo-files.js"; import { commandsLightTestFiles } from "../vitest/vitest.commands-light-paths.mjs"; import { createPluginsVitestConfig } from "../vitest/vitest.plugins.config.ts"; +import { createToolingVitestConfig } from "../vitest/vitest.tooling.config.ts"; type VitestTestConfig = { dir?: string; @@ -81,6 +82,21 @@ function listMatchedTestFiles(config: VitestConfig): string[] { .toSorted((a, b) => a.localeCompare(b)); } +function listAllToolingTestFiles(): string[] { + const originalArgv = process.argv; + try { + process.argv = originalArgv.slice(0, 2); + return listMatchedTestFiles( + createToolingVitestConfig({ + ...process.env, + OPENCLAW_VITEST_INCLUDE_FILE: undefined, + }), + ); + } finally { + process.argv = originalArgv; + } +} + function isGatewayServerTestFile(file: string): boolean { return ( file.startsWith("src/gateway/") && @@ -164,7 +180,7 @@ describe("scripts/lib/ci-node-test-plan.mjs", () => { compact: true, }); - expect(compact.length).toBeLessThan(40); + expect(compact).toHaveLength(20); expect(compact.every((shard) => Array.isArray(shard.groups))).toBe(true); expect(compact.some((shard) => shard.requiresDist)).toBe(true); expect( @@ -174,7 +190,11 @@ describe("scripts/lib/ci-node-test-plan.mjs", () => { ).toBe(true); expect( compact - .flatMap((shard) => shard.groups.flatMap((group) => group.includePatterns ?? [])) + .flatMap((shard) => + shard.groups.flatMap((group) => + group.shard_name.startsWith("core-tooling-") ? [] : (group.includePatterns ?? []), + ), + ) .toSorted((a, b) => a.localeCompare(b)), ).toEqual( base.flatMap((shard) => shard.includePatterns ?? []).toSorted((a, b) => a.localeCompare(b)), @@ -213,15 +233,32 @@ describe("scripts/lib/ci-node-test-plan.mjs", () => { ); const wholeGroupCounts = smallWholeJobs.map((shard) => shard.groups.length); expect(Math.max(...wholeGroupCounts) - Math.min(...wholeGroupCounts)).toBeLessThanOrEqual(1); - const toolingJob = smallWholeJobs.find((shard) => - shard.groups.some((group) => group.shard_name === "core-tooling"), + expect( + smallWholeJobs.some((shard) => + shard.groups.some((group) => group.shard_name === "core-tooling"), + ), + ).toBe(false); + expect( + smallWholeJobs + .flatMap((shard) => shard.groups) + .find((group) => group.shard_name === "core-tooling-isolated"), + ).toEqual( + expect.objectContaining({ + configs: ["test/vitest/vitest.tooling-isolated.config.ts"], + }), ); - const tuiPtyJob = smallWholeJobs.find((shard) => - shard.groups.some((group) => group.shard_name === "core-runtime-tui-pty"), - ); - expect(toolingJob).toBeDefined(); - expect(tuiPtyJob).toBeDefined(); - expect(toolingJob?.checkName).not.toBe(tuiPtyJob?.checkName); + const toolingGroups = compact + .flatMap((shard) => shard.groups) + .filter((group) => /^core-tooling-\d+$/u.test(group.shard_name)); + const toolingFiles = toolingGroups.flatMap((group) => group.includePatterns ?? []); + expect(toolingGroups).toHaveLength(3); + expect( + toolingGroups.every((group) => group.configs[0] === "test/vitest/vitest.tooling.config.ts"), + ).toBe(true); + const toolingGroupSizes = toolingGroups.map((group) => group.includePatterns?.length ?? 0); + expect(Math.max(...toolingGroupSizes) - Math.min(...toolingGroupSizes)).toBeLessThanOrEqual(1); + expect(new Set(toolingFiles).size).toBe(toolingFiles.length); + expect(toolingFiles.toSorted((a, b) => a.localeCompare(b))).toEqual(listAllToolingTestFiles()); }); it("splits the slow core unit shards while keeping paired source/security coverage", () => { diff --git a/test/scripts/ci-workflow-guards.test.ts b/test/scripts/ci-workflow-guards.test.ts index e1f571d5e2ec..bf9b35cb2fc4 100644 --- a/test/scripts/ci-workflow-guards.test.ts +++ b/test/scripts/ci-workflow-guards.test.ts @@ -1857,7 +1857,7 @@ describe("ci workflow guards", () => { expect(JSON.stringify(preflightJob.steps)).toContain("timeout_minutes: shard.timeoutMinutes"); expect(manifestStep.run).toContain( - 'shard.groups?.some((group) => group.shard_name === "core-tooling")', + 'shard.groups?.some((group) => group.shard_name.startsWith("core-tooling"))', ); expect(nodeTestJob["timeout-minutes"]).toBe("${{ matrix.timeout_minutes || 60 }}"); expect(runStep.env.OPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS).toBe("300000");