



























@@ -1,29 +1,20 @@
1-import { existsSync, readFileSync, readdirSync } from "node:fs";
2-import { join } from "node:path";
1+import { spawnSync } from "node:child_process";
2+import { readFileSync } from "node:fs";
33import { describe, expect, it } from "vitest";
44import { createPluginContractTestShards } from "../../scripts/lib/plugin-contract-test-plan.mjs";
5566function listContractTests(rootDir = "src/plugins/contracts"): string[] {
7-if (!existsSync(rootDir)) {
8-return [];
9-}
10-11-const files: string[] = [];
12-const visit = (dir: string) => {
13-for (const entry of readdirSync(dir, { withFileTypes: true })) {
14-const path = join(dir, entry.name);
15-if (entry.isDirectory()) {
16-visit(path);
17-continue;
18-}
19-if (entry.isFile() && entry.name.endsWith(".test.ts")) {
20-files.push(path.replaceAll("\\", "/"));
21-}
22-}
23-};
24-25-visit(rootDir);
26-return files.toSorted((a, b) => a.localeCompare(b));
7+const result = spawnSync("git", ["ls-files", "--", rootDir], {
8+cwd: process.cwd(),
9+encoding: "utf8",
10+stdio: ["ignore", "pipe", "ignore"],
11+});
12+expect(result.status).toBe(0);
13+return result.stdout
14+.split("\n")
15+.map((line) => line.trim().replaceAll("\\", "/"))
16+.filter((line) => line.endsWith(".test.ts"))
17+.toSorted((a, b) => a.localeCompare(b));
2718}
28192920describe("scripts/lib/plugin-contract-test-plan.mjs", () => {
@@ -66,6 +57,54 @@ describe("scripts/lib/plugin-contract-test-plan.mjs", () => {
6657expect(new Set(actual).size).toBe(actual.length);
6758});
685960+it("uses git-tracked files without walking contract directories", () => {
61+const result = spawnSync(
62+process.execPath,
63+[
64+"--input-type=module",
65+"--eval",
66+`
67+ import fs from "node:fs";
68+ import { syncBuiltinESMExports } from "node:module";
69+ const counts = { existsSync: 0, readdirSync: 0 };
70+ const originalExistsSync = fs.existsSync;
71+ const originalReaddirSync = fs.readdirSync;
72+ fs.existsSync = (...args) => {
73+ counts.existsSync += 1;
74+ return originalExistsSync(...args);
75+ };
76+ fs.readdirSync = (...args) => {
77+ counts.readdirSync += 1;
78+ return originalReaddirSync(...args);
79+ };
80+ syncBuiltinESMExports();
81+ const { createPluginContractTestShards } = await import("./scripts/lib/plugin-contract-test-plan.mjs");
82+ const shards = createPluginContractTestShards();
83+ console.log(JSON.stringify({
84+ counts,
85+ files: shards.reduce((total, shard) => total + shard.includePatterns.length, 0),
86+ shards: shards.length,
87+ }));
88+ `,
89+],
90+{
91+cwd: process.cwd(),
92+encoding: "utf8",
93+stdio: ["ignore", "pipe", "pipe"],
94+},
95+);
96+97+expect(result.status, result.stderr).toBe(0);
98+const payload = JSON.parse(result.stdout) as {
99+counts: { existsSync: number; readdirSync: number };
100+files: number;
101+shards: number;
102+};
103+expect(payload.shards).toBe(4);
104+expect(payload.files).toBeGreaterThan(0);
105+expect(payload.counts).toEqual({ existsSync: 0, readdirSync: 0 });
106+});
107+69108it("keeps plugin registration contract files spread across checks", () => {
70109for (const shard of createPluginContractTestShards()) {
71110const registrationFiles = shard.includePatterns.filter((pattern) =>
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。