From efabae2f9bf03a5ef1be8915ee235cce6f8d8106 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 16 May 2026 08:37:25 +0800 Subject: [PATCH] fix(test): avoid walking unit-fast candidate roots --- test/vitest-unit-fast-config.test.ts | 26 ++++++++++++++++++++++++++ test/vitest/vitest.unit-fast-paths.mjs | 24 +++++++++++++++++++++--- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/test/vitest-unit-fast-config.test.ts b/test/vitest-unit-fast-config.test.ts index 3b54bf3f817..ef121782cd3 100644 --- a/test/vitest-unit-fast-config.test.ts +++ b/test/vitest-unit-fast-config.test.ts @@ -1,3 +1,4 @@ +import { spawnSync } from "node:child_process"; import { describe, expect, it } from "vitest"; import { createCommandsLightVitestConfig } from "./vitest/vitest.commands-light.config.ts"; import { createPluginSdkLightVitestConfig } from "./vitest/vitest.plugin-sdk-light.config.ts"; @@ -49,6 +50,31 @@ function collectUnroutedForcedFiles( } describe("unit-fast vitest lane", () => { + it("loads the config without recursively walking repo roots", () => { + const script = ` + import fs from "node:fs"; + let readdirSyncCalls = 0; + const originalReaddirSync = fs.readdirSync; + fs.readdirSync = function patchedReaddirSync(...args) { + readdirSyncCalls += 1; + return originalReaddirSync.apply(this, args); + }; + await import("./test/vitest/vitest.unit-fast.config.ts?io-probe=" + Date.now()); + console.log(readdirSyncCalls); + `; + const result = spawnSync( + process.execPath, + ["--import", "tsx", "--input-type=module", "-e", script], + { + cwd: process.cwd(), + encoding: "utf8", + }, + ); + + expect(result.status, result.stderr).toBe(0); + expect(Number(result.stdout.trim())).toBeLessThan(20); + }); + it("runs cache-friendly tests without the reset-heavy runner or runtime setup", () => { const config = createUnitFastVitestConfig({}); const testConfig = requireTestConfig(config); diff --git a/test/vitest/vitest.unit-fast-paths.mjs b/test/vitest/vitest.unit-fast-paths.mjs index 973cd4d72ae..7c6aeb2a969 100644 --- a/test/vitest/vitest.unit-fast-paths.mjs +++ b/test/vitest/vitest.unit-fast-paths.mjs @@ -1,3 +1,4 @@ +import { spawnSync } from "node:child_process"; import fs from "node:fs"; import path from "node:path"; import { @@ -309,15 +310,32 @@ function walkFiles(directory, files = []) { const walkedTestFilesByCwd = new Map(); +function collectRepoTestFilesFromGit(cwd) { + const result = spawnSync("git", ["ls-files", "--", "src", "packages", "test"], { + cwd, + encoding: "utf8", + stdio: ["ignore", "pipe", "ignore"], + }); + if (result.status !== 0) { + return null; + } + return result.stdout + .split("\n") + .map((file) => normalizeRepoPath(file.trim())) + .filter((file) => file.endsWith(".test.ts")); +} + function collectRepoTestFiles(cwd) { const normalizedCwd = normalizeRepoPath(cwd); const cached = walkedTestFilesByCwd.get(normalizedCwd); if (cached) { return cached; } - const files = ["src", "packages", "test"] - .flatMap((directory) => walkFiles(path.join(cwd, directory))) - .map((file) => normalizeRepoPath(path.relative(cwd, file))); + const files = + collectRepoTestFilesFromGit(cwd) ?? + ["src", "packages", "test"] + .flatMap((directory) => walkFiles(path.join(cwd, directory))) + .map((file) => normalizeRepoPath(path.relative(cwd, file))); walkedTestFilesByCwd.set(normalizedCwd, files); return files; }