test: expose changed fallback skip metadata

This commit is contained in:
Shakker
2026-06-04 19:34:23 +01:00
parent a31d3355cd
commit dd8f491040
3 changed files with 66 additions and 10 deletions

View File

@@ -20,6 +20,12 @@ export type ChangedTestTargetOptions = {
broad?: boolean; 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_TIMEOUT_MS: string;
export const DEFAULT_TEST_PROJECTS_VITEST_NO_OUTPUT_HEARTBEAT_MS: string; export const DEFAULT_TEST_PROJECTS_VITEST_NO_OUTPUT_HEARTBEAT_MS: string;
@@ -49,10 +55,14 @@ export function resolveChangedTargetArgs(
export function resolveChangedTestTargetPlan( export function resolveChangedTestTargetPlan(
changedPaths: string[], changedPaths: string[],
options?: ChangedTestTargetOptions, options?: ChangedTestTargetOptions,
): { ): ChangedTestTargetPlan;
mode: "none" | "broad" | "targets";
targets: string[]; export function resolveChangedTestTargetPlanForArgs(
}; args: string[],
cwd?: string,
listChangedPaths?: (baseRef: string, cwd: string) => string[],
options?: ChangedTestTargetOptions,
): ChangedTestTargetPlan | null;
export function listFullExtensionVitestProjectConfigs(): string[]; export function listFullExtensionVitestProjectConfigs(): string[];

View File

@@ -1789,6 +1789,7 @@ export function resolveChangedTestTargetPlan(changedPaths, options = {}) {
const useBroadFallback = options.broad ?? shouldUseBroadChangedTargets(env); const useBroadFallback = options.broad ?? shouldUseBroadChangedTargets(env);
const skipImportGraph = changedLanes.lanes.all && !useBroadFallback; const skipImportGraph = changedLanes.lanes.all && !useBroadFallback;
const targets = []; const targets = [];
const skippedBroadFallbackPaths = [];
for (const changedPath of changedPaths) { for (const changedPath of changedPaths) {
const preciseTargets = resolvePreciseChangedTestTargets(changedPath, { const preciseTargets = resolvePreciseChangedTestTargets(changedPath, {
...options, ...options,
@@ -1803,6 +1804,7 @@ export function resolveChangedTestTargetPlan(changedPaths, options = {}) {
if (useBroadFallback) { if (useBroadFallback) {
return { mode: "broad", targets: [] }; return { mode: "broad", targets: [] };
} }
skippedBroadFallbackPaths.push(changedPath);
continue; continue;
} }
if (isRoutableChangedTarget(changedPath)) { if (isRoutableChangedTarget(changedPath)) {
@@ -1812,7 +1814,11 @@ export function resolveChangedTestTargetPlan(changedPaths, options = {}) {
if (useBroadFallback && changedLanes.extensionImpactFromCore) { if (useBroadFallback && changedLanes.extensionImpactFromCore) {
targets.push("extensions"); 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() { export function listFullExtensionVitestProjectConfigs() {
@@ -1827,20 +1833,32 @@ export function resolveChangedTargetArgs(
cwd = process.cwd(), cwd = process.cwd(),
listChangedPaths = listChangedPathsFromGit, listChangedPaths = listChangedPathsFromGit,
options = {}, 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); const baseRef = extractChangedBaseRef(args);
if (!baseRef) { if (!baseRef) {
return null; return null;
} }
const changedPaths = listChangedPaths(baseRef, cwd); const changedPaths = listChangedPaths(baseRef, cwd);
const plan = resolveChangedTestTargetPlan(changedPaths, { return resolveChangedTestTargetPlan(changedPaths, {
cwd, cwd,
...options, ...options,
}); });
if (plan.mode === "broad") {
return null;
}
return plan.targets;
} }
function classifyTarget(arg, cwd) { function classifyTarget(arg, cwd) {

View File

@@ -18,6 +18,7 @@ import {
listFullExtensionVitestProjectConfigs, listFullExtensionVitestProjectConfigs,
orderFullSuiteSpecsForParallelRun, orderFullSuiteSpecsForParallelRun,
shouldAcquireLocalHeavyCheckLock, shouldAcquireLocalHeavyCheckLock,
resolveChangedTestTargetPlanForArgs,
resolveChangedTestTargetPlan, resolveChangedTestTargetPlan,
resolveChangedTargetArgs, resolveChangedTargetArgs,
resolveParallelFullSuiteConcurrency, resolveParallelFullSuiteConcurrency,
@@ -198,6 +199,19 @@ describe("scripts/test-projects changed-target routing", () => {
).toEqual(["src/utils/provider-utils.test.ts"]); ).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", () => { it("keeps the broad changed run available for Vitest wiring edits", () => {
expect( expect(
resolveChangedTargetArgs( resolveChangedTargetArgs(
@@ -1136,6 +1150,18 @@ describe("scripts/test-projects changed-target routing", () => {
).toStrictEqual([]); ).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", () => { it("keeps the broad changed run available for unknown root surfaces", () => {
expect( expect(
resolveChangedTargetArgs( resolveChangedTargetArgs(
@@ -1690,6 +1716,7 @@ describe("scripts/test-projects changed-target routing", () => {
it("keeps changed mode to precise targets by default", () => { it("keeps changed mode to precise targets by default", () => {
expect(resolveChangedTestTargetPlan(["package.json", "src/commands/channels.add.ts"])).toEqual({ expect(resolveChangedTestTargetPlan(["package.json", "src/commands/channels.add.ts"])).toEqual({
mode: "targets", mode: "targets",
skippedBroadFallbackPaths: ["package.json"],
targets: ["src/commands/channels.add.test.ts"], targets: ["src/commands/channels.add.test.ts"],
}); });
}); });
@@ -1709,6 +1736,7 @@ describe("scripts/test-projects changed-target routing", () => {
expect(plan).toEqual({ expect(plan).toEqual({
mode: "targets", mode: "targets",
skippedBroadFallbackPaths: ["src/gateway/server.impl.ts"],
targets: ["test/scripts/package-acceptance-workflow.test.ts", "test/scripts/check.test.ts"], targets: ["test/scripts/package-acceptance-workflow.test.ts", "test/scripts/check.test.ts"],
}); });
expect(repoSourceReads).toEqual([]); expect(repoSourceReads).toEqual([]);