From dd8f49104045bb8310b4639db553a552abe4db8b Mon Sep 17 00:00:00 2001 From: Shakker Date: Thu, 4 Jun 2026 19:34:23 +0100 Subject: [PATCH] test: expose changed fallback skip metadata --- scripts/test-projects.test-support.d.mts | 18 ++++++++++---- scripts/test-projects.test-support.mjs | 30 +++++++++++++++++++----- test/scripts/test-projects.test.ts | 28 ++++++++++++++++++++++ 3 files changed, 66 insertions(+), 10 deletions(-) diff --git a/scripts/test-projects.test-support.d.mts b/scripts/test-projects.test-support.d.mts index f15b36562a3d..49a9427f5ee0 100644 --- a/scripts/test-projects.test-support.d.mts +++ b/scripts/test-projects.test-support.d.mts @@ -20,6 +20,12 @@ export type ChangedTestTargetOptions = { broad?: boolean; }; +export type ChangedTestTargetPlan = { + mode: "none" | "broad" | "targets"; + targets: string[]; + skippedBroadFallbackPaths?: string[]; +}; + export const DEFAULT_TEST_PROJECTS_VITEST_NO_OUTPUT_TIMEOUT_MS: string; export const DEFAULT_TEST_PROJECTS_VITEST_NO_OUTPUT_HEARTBEAT_MS: string; @@ -49,10 +55,14 @@ export function resolveChangedTargetArgs( export function resolveChangedTestTargetPlan( changedPaths: string[], options?: ChangedTestTargetOptions, -): { - mode: "none" | "broad" | "targets"; - targets: string[]; -}; +): ChangedTestTargetPlan; + +export function resolveChangedTestTargetPlanForArgs( + args: string[], + cwd?: string, + listChangedPaths?: (baseRef: string, cwd: string) => string[], + options?: ChangedTestTargetOptions, +): ChangedTestTargetPlan | null; export function listFullExtensionVitestProjectConfigs(): string[]; diff --git a/scripts/test-projects.test-support.mjs b/scripts/test-projects.test-support.mjs index d14e61611826..9f1463a55c13 100644 --- a/scripts/test-projects.test-support.mjs +++ b/scripts/test-projects.test-support.mjs @@ -1789,6 +1789,7 @@ export function resolveChangedTestTargetPlan(changedPaths, options = {}) { const useBroadFallback = options.broad ?? shouldUseBroadChangedTargets(env); const skipImportGraph = changedLanes.lanes.all && !useBroadFallback; const targets = []; + const skippedBroadFallbackPaths = []; for (const changedPath of changedPaths) { const preciseTargets = resolvePreciseChangedTestTargets(changedPath, { ...options, @@ -1803,6 +1804,7 @@ export function resolveChangedTestTargetPlan(changedPaths, options = {}) { if (useBroadFallback) { return { mode: "broad", targets: [] }; } + skippedBroadFallbackPaths.push(changedPath); continue; } if (isRoutableChangedTarget(changedPath)) { @@ -1812,7 +1814,11 @@ export function resolveChangedTestTargetPlan(changedPaths, options = {}) { if (useBroadFallback && changedLanes.extensionImpactFromCore) { targets.push("extensions"); } - return { mode: "targets", targets: [...new Set(targets)] }; + const plan = { mode: "targets", targets: [...new Set(targets)] }; + if (skippedBroadFallbackPaths.length > 0) { + plan.skippedBroadFallbackPaths = [...new Set(skippedBroadFallbackPaths)]; + } + return plan; } export function listFullExtensionVitestProjectConfigs() { @@ -1827,20 +1833,32 @@ export function resolveChangedTargetArgs( cwd = process.cwd(), listChangedPaths = listChangedPathsFromGit, options = {}, +) { + const plan = resolveChangedTestTargetPlanForArgs(args, cwd, listChangedPaths, options); + if (!plan) { + return null; + } + if (plan.mode === "broad") { + return null; + } + return plan.targets; +} + +export function resolveChangedTestTargetPlanForArgs( + args, + cwd = process.cwd(), + listChangedPaths = listChangedPathsFromGit, + options = {}, ) { const baseRef = extractChangedBaseRef(args); if (!baseRef) { return null; } const changedPaths = listChangedPaths(baseRef, cwd); - const plan = resolveChangedTestTargetPlan(changedPaths, { + return resolveChangedTestTargetPlan(changedPaths, { cwd, ...options, }); - if (plan.mode === "broad") { - return null; - } - return plan.targets; } function classifyTarget(arg, cwd) { diff --git a/test/scripts/test-projects.test.ts b/test/scripts/test-projects.test.ts index 6b2982be7514..72eb9a451787 100644 --- a/test/scripts/test-projects.test.ts +++ b/test/scripts/test-projects.test.ts @@ -18,6 +18,7 @@ import { listFullExtensionVitestProjectConfigs, orderFullSuiteSpecsForParallelRun, shouldAcquireLocalHeavyCheckLock, + resolveChangedTestTargetPlanForArgs, resolveChangedTestTargetPlan, resolveChangedTargetArgs, resolveParallelFullSuiteConcurrency, @@ -198,6 +199,19 @@ describe("scripts/test-projects changed-target routing", () => { ).toEqual(["src/utils/provider-utils.test.ts"]); }); + it("records broad fallback paths skipped by focused changed mode", () => { + expect( + resolveChangedTestTargetPlan([ + "test/vitest/vitest.shared.config.ts", + "src/utils/provider-utils.ts", + ]), + ).toEqual({ + mode: "targets", + skippedBroadFallbackPaths: ["test/vitest/vitest.shared.config.ts"], + targets: ["src/utils/provider-utils.test.ts"], + }); + }); + it("keeps the broad changed run available for Vitest wiring edits", () => { expect( resolveChangedTargetArgs( @@ -1136,6 +1150,18 @@ describe("scripts/test-projects changed-target routing", () => { ).toStrictEqual([]); }); + it("keeps unknown root surface skip reasons available to changed-mode callers", () => { + expect( + resolveChangedTestTargetPlanForArgs(["--changed", "origin/main"], process.cwd(), () => [ + "unknown/file.txt", + ]), + ).toEqual({ + mode: "targets", + skippedBroadFallbackPaths: ["unknown/file.txt"], + targets: [], + }); + }); + it("keeps the broad changed run available for unknown root surfaces", () => { expect( resolveChangedTargetArgs( @@ -1690,6 +1716,7 @@ describe("scripts/test-projects changed-target routing", () => { it("keeps changed mode to precise targets by default", () => { expect(resolveChangedTestTargetPlan(["package.json", "src/commands/channels.add.ts"])).toEqual({ mode: "targets", + skippedBroadFallbackPaths: ["package.json"], targets: ["src/commands/channels.add.test.ts"], }); }); @@ -1709,6 +1736,7 @@ describe("scripts/test-projects changed-target routing", () => { expect(plan).toEqual({ mode: "targets", + skippedBroadFallbackPaths: ["src/gateway/server.impl.ts"], targets: ["test/scripts/package-acceptance-workflow.test.ts", "test/scripts/check.test.ts"], }); expect(repoSourceReads).toEqual([]);