

























@@ -85,6 +85,14 @@ function matchingExcludePatterns(patterns: string[], file: string): string[] {
8585return patterns.filter((pattern) => path.matchesGlob(file, pattern));
8686}
878788+function requireTestConfig<T extends { test?: unknown }>(config: T): NonNullable<T["test"]> {
89+expect(config.test).toBeDefined();
90+if (!config.test) {
91+throw new Error("expected scoped vitest test config");
92+}
93+return config.test as NonNullable<T["test"]>;
94+}
95+8896describe("resolveVitestIsolation", () => {
8997it("aliases private QA plugin SDK subpaths for source tests only", () => {
9098expect(sharedVitestConfig.resolve.alias).toEqual(
@@ -120,19 +128,21 @@ describe("resolveVitestIsolation", () => {
120128121129it("resolves scoped discovery dirs from the repo root after config relocation", () => {
122130const config = createExtensionMatrixVitestConfig({});
131+const testConfig = requireTestConfig(config);
123132124133expect(config.root).toBe(process.cwd());
125-expect(config.test?.dir).toBe(path.join(process.cwd(), "extensions"));
126-expect(config.test?.include).toContain("matrix/**/*.test.ts");
134+expect(testConfig.dir).toBe(path.join(process.cwd(), "extensions"));
135+expect(testConfig.include).toContain("matrix/**/*.test.ts");
127136});
128137});
129138130139describe("createScopedVitestConfig", () => {
131140it("applies the non-isolated runner by default", () => {
132141const config = createScopedVitestConfig(["src/example.test.ts"], { env: {} });
133-expect(config.test?.isolate).toBe(false);
134-expect(normalizeConfigPath(config.test?.runner)).toBe("test/non-isolated-runner.ts");
135-expect(normalizeConfigPaths(config.test?.setupFiles)).toEqual([
142+const testConfig = requireTestConfig(config);
143+expect(testConfig.isolate).toBe(false);
144+expect(normalizeConfigPath(testConfig.runner)).toBe("test/non-isolated-runner.ts");
145+expect(normalizeConfigPaths(testConfig.setupFiles)).toEqual([
136146"test/setup.ts",
137147"test/setup-openclaw-runtime.ts",
138148]);
@@ -143,8 +153,9 @@ describe("createScopedVitestConfig", () => {
143153dir: "src",
144154env: {},
145155});
146-expect(config.test?.dir).toBe(path.join(process.cwd(), "src"));
147-expect(config.test?.include).toEqual(["example.test.ts"]);
156+const testConfig = requireTestConfig(config);
157+expect(testConfig.dir).toBe(path.join(process.cwd(), "src"));
158+expect(testConfig.include).toEqual(["example.test.ts"]);
148159});
149160150161it("keeps scoped cli directory filters aligned with repo-root include patterns", () => {
@@ -155,7 +166,7 @@ describe("createScopedVitestConfig", () => {
155166passWithNoTests: true,
156167});
157168158-expect(config.test?.include).toEqual(["slack/**/*.test.*"]);
169+expect(requireTestConfig(config).include).toEqual(["slack/**/*.test.*"]);
159170});
160171161172it("keeps broad scoped cli directory filters aligned with repo-root include patterns", () => {
@@ -166,7 +177,7 @@ describe("createScopedVitestConfig", () => {
166177passWithNoTests: true,
167178});
168179169-expect(config.test?.include).toEqual(["speech-core/**/*.test.*"]);
180+expect(requireTestConfig(config).include).toEqual(["speech-core/**/*.test.*"]);
170181});
171182172183it("relativizes scoped include and exclude patterns to the configured dir", () => {
@@ -175,9 +186,10 @@ describe("createScopedVitestConfig", () => {
175186env: {},
176187exclude: [EXTENSIONS_CHANNEL_GLOB, "dist/**"],
177188});
189+const testConfig = requireTestConfig(config);
178190179-expect(config.test?.include).toEqual(["**/*.test.ts"]);
180-expect(config.test?.exclude).toEqual(expect.arrayContaining(["channel/**", "dist/**"]));
191+expect(testConfig.include).toEqual(["**/*.test.ts"]);
192+expect(testConfig.exclude).toEqual(expect.arrayContaining(["channel/**", "dist/**"]));
181193});
182194183195it("narrows scoped includes to matching CLI file filters", () => {
@@ -186,9 +198,10 @@ describe("createScopedVitestConfig", () => {
186198dir: "extensions",
187199env: {},
188200});
201+const testConfig = requireTestConfig(config);
189202190-expect(config.test?.include).toEqual(["browser/index.test.ts"]);
191-expect(config.test?.passWithNoTests).toBe(true);
203+expect(testConfig.include).toEqual(["browser/index.test.ts"]);
204+expect(testConfig.passWithNoTests).toBe(true);
192205});
193206194207it("loads scoped include overrides from OPENCLAW_VITEST_INCLUDE_FILE", () => {
@@ -204,7 +217,7 @@ describe("createScopedVitestConfig", () => {
204217},
205218});
206219207-expect(config.test?.include).toEqual(["utils/utils-misc.test.ts"]);
220+expect(requireTestConfig(config).include).toEqual(["utils/utils-misc.test.ts"]);
208221} finally {
209222fs.rmSync(tempDir, { recursive: true, force: true });
210223}
@@ -216,15 +229,15 @@ describe("createScopedVitestConfig", () => {
216229setupFiles: ["test/setup.extensions.ts"],
217230});
218231219-expect(normalizeConfigPaths(config.test?.setupFiles)).toEqual([
232+expect(normalizeConfigPaths(requireTestConfig(config).setupFiles)).toEqual([
220233"test/setup.ts",
221234"test/setup.extensions.ts",
222235"test/setup-openclaw-runtime.ts",
223236]);
224237});
225238226239it("keeps bundled unit test includes out of the bundled exclude list", () => {
227-const excludePatterns = bundledVitestConfig.test?.exclude ?? [];
240+const excludePatterns = requireTestConfig(bundledVitestConfig).exclude ?? [];
228241for (const file of bundledPluginDependentUnitTestFiles) {
229242expect(
230243excludePatterns.some((pattern) => bundledExcludePatternCouldMatchFile(pattern, file)),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。