






















@@ -85,6 +85,24 @@ function matchingExcludePatterns(patterns: string[], file: string): string[] {
8585return patterns.filter((pattern) => path.matchesGlob(file, pattern));
8686}
878788+function findAlias(alias: unknown, find: string): { find: string; replacement?: string } {
89+if (!Array.isArray(alias)) {
90+throw new Error("expected Vitest alias array");
91+}
92+const match = alias.find((entry) => {
93+return (
94+typeof entry === "object" &&
95+entry !== null &&
96+"find" in entry &&
97+(entry as { find?: unknown }).find === find
98+);
99+});
100+if (!match || typeof match !== "object" || !("find" in match)) {
101+throw new Error(`missing alias ${find}`);
102+}
103+return match as { find: string; replacement?: string };
104+}
105+88106function requireTestConfig<T extends { test?: unknown }>(config: T): NonNullable<T["test"]> {
89107if (!config.test) {
90108throw new Error("expected scoped vitest test config");
@@ -103,25 +121,17 @@ function expectThreadedNonIsolatedRunner(config: {
103121104122describe("resolveVitestIsolation", () => {
105123it("aliases private QA plugin SDK subpaths for source tests only", () => {
106-expect(sharedVitestConfig.resolve.alias).toEqual(
107-expect.arrayContaining(
108-PRIVATE_PLUGIN_SDK_SUBPATHS.map((subpath) =>
109-expect.objectContaining({
110-find: `openclaw/plugin-sdk/${subpath}`,
111-replacement: path.join(process.cwd(), "src", "plugin-sdk", `${subpath}.ts`),
112-}),
113-),
114-),
115-);
116-expect(sharedVitestConfig.resolve.alias).not.toEqual(
117-expect.arrayContaining(
118-PRIVATE_PLUGIN_SDK_SUBPATHS.map((subpath) =>
119-expect.objectContaining({
120-find: `@openclaw/plugin-sdk/${subpath}`,
121-}),
122-),
123-),
124-);
124+for (const subpath of PRIVATE_PLUGIN_SDK_SUBPATHS) {
125+expect(findAlias(sharedVitestConfig.resolve.alias, `openclaw/plugin-sdk/${subpath}`)).toEqual(
126+{
127+find: `openclaw/plugin-sdk/${subpath}`,
128+replacement: path.join(process.cwd(), "src", "plugin-sdk", `${subpath}.ts`),
129+},
130+);
131+expect(() =>
132+findAlias(sharedVitestConfig.resolve.alias, `@openclaw/plugin-sdk/${subpath}`),
133+).toThrow(`missing alias @openclaw/plugin-sdk/${subpath}`);
134+}
125135});
126136127137it("defaults shared scoped configs to the non-isolated runner", () => {
@@ -197,7 +207,8 @@ describe("createScopedVitestConfig", () => {
197207const testConfig = requireTestConfig(config);
198208199209expect(testConfig.include).toEqual(["**/*.test.ts"]);
200-expect(testConfig.exclude).toEqual(expect.arrayContaining(["channel/**", "dist/**"]));
210+expect(testConfig.exclude).toContain("channel/**");
211+expect(testConfig.exclude).toContain("dist/**");
201212});
202213203214it("narrows scoped includes to matching CLI file filters", () => {
@@ -361,7 +372,7 @@ describe("scoped vitest configs", () => {
361372it("splits auto-reply into narrower scoped buckets", () => {
362373const coreTestConfig = requireTestConfig(defaultAutoReplyCoreConfig);
363374expect(coreTestConfig.include).toEqual(["*.test.ts"]);
364-expect(coreTestConfig.exclude).toEqual(expect.arrayContaining(["reply*.test.ts"]));
375+expect(coreTestConfig.exclude).toContain("reply*.test.ts");
365376expect(requireTestConfig(defaultAutoReplyTopLevelConfig).include).toEqual(["reply*.test.ts"]);
366377expect(requireTestConfig(defaultAutoReplyReplyConfig).include).toEqual(["reply/**/*.test.ts"]);
367378});
@@ -477,10 +488,38 @@ describe("scoped vitest configs", () => {
477488it("normalizes extension provider include patterns relative to the scoped dir", () => {
478489const providersTestConfig = requireTestConfig(defaultExtensionProvidersConfig);
479490expect(providersTestConfig.dir).toBe(path.join(process.cwd(), "extensions"));
480-expect(providersTestConfig.include).toEqual(
481-expect.arrayContaining(["xai/**/*.test.ts", "google/**/*.test.ts"]),
482-);
483-expect(providersTestConfig.include).not.toContain("openai/**/*.test.ts");
491+expect(providersTestConfig.include).toEqual([
492+"amazon-bedrock/**/*.test.ts",
493+"amazon-bedrock-mantle/**/*.test.ts",
494+"anthropic/**/*.test.ts",
495+"anthropic-vertex/**/*.test.ts",
496+"byteplus/**/*.test.ts",
497+"chutes/**/*.test.ts",
498+"comfy/**/*.test.ts",
499+"deepseek/**/*.test.ts",
500+"github-copilot/**/*.test.ts",
501+"google/**/*.test.ts",
502+"groq/**/*.test.ts",
503+"huggingface/**/*.test.ts",
504+"kimi-coding/**/*.test.ts",
505+"lmstudio/**/*.test.ts",
506+"microsoft/**/*.test.ts",
507+"microsoft-foundry/**/*.test.ts",
508+"minimax/**/*.test.ts",
509+"mistral/**/*.test.ts",
510+"qwen/**/*.test.ts",
511+"moonshot/**/*.test.ts",
512+"nvidia/**/*.test.ts",
513+"ollama/**/*.test.ts",
514+"openrouter/**/*.test.ts",
515+"qianfan/**/*.test.ts",
516+"stepfun/**/*.test.ts",
517+"together/**/*.test.ts",
518+"venice/**/*.test.ts",
519+"volcengine/**/*.test.ts",
520+"xai/**/*.test.ts",
521+"zai/**/*.test.ts",
522+]);
484523const openAiTestConfig = requireTestConfig(defaultExtensionProviderOpenAiConfig);
485524expect(openAiTestConfig.dir).toBe(path.join(process.cwd(), "extensions"));
486525expect(openAiTestConfig.include).toEqual(["openai/**/*.test.ts"]);
@@ -489,7 +528,15 @@ describe("scoped vitest configs", () => {
489528it("normalizes extension messaging include patterns relative to the scoped dir", () => {
490529const testConfig = requireTestConfig(defaultExtensionMessagingConfig);
491530expect(testConfig.dir).toBe(path.join(process.cwd(), "extensions"));
492-expect(testConfig.include).toEqual(expect.arrayContaining(["googlechat/**/*.test.ts"]));
531+expect(testConfig.include).toEqual([
532+"googlechat/**/*.test.ts",
533+"nextcloud-talk/**/*.test.ts",
534+"nostr/**/*.test.ts",
535+"qqbot/**/*.test.ts",
536+"synology-chat/**/*.test.ts",
537+"tlon/**/*.test.ts",
538+"twitch/**/*.test.ts",
539+]);
493540});
494541495542it("normalizes matrix extension include patterns relative to the scoped dir", () => {
@@ -525,9 +572,7 @@ describe("scoped vitest configs", () => {
525572it("normalizes zalo extension include patterns relative to the scoped dir", () => {
526573const testConfig = requireTestConfig(defaultExtensionZaloConfig);
527574expect(testConfig.dir).toBe(path.join(process.cwd(), "extensions"));
528-expect(testConfig.include).toEqual(
529-expect.arrayContaining(["zalo/**/*.test.ts", "zalouser/**/*.test.ts"]),
530-);
575+expect(testConfig.include).toEqual(["zalo/**/*.test.ts", "zalouser/**/*.test.ts"]);
531576});
532577533578it("normalizes voice-call extension include patterns relative to the scoped dir", () => {
@@ -539,9 +584,11 @@ describe("scoped vitest configs", () => {
539584it("normalizes memory extension include patterns relative to the scoped dir", () => {
540585const testConfig = requireTestConfig(defaultExtensionMemoryConfig);
541586expect(testConfig.dir).toBe(path.join(process.cwd(), "extensions"));
542-expect(testConfig.include).toEqual(
543-expect.arrayContaining(["memory-core/**/*.test.ts", "memory-lancedb/**/*.test.ts"]),
544-);
587+expect(testConfig.include).toEqual([
588+"memory-core/**/*.test.ts",
589+"memory-lancedb/**/*.test.ts",
590+"memory-wiki/**/*.test.ts",
591+]);
545592});
546593547594it("keeps telegram plugin tests out of the shared extensions lane", () => {
@@ -781,9 +828,7 @@ describe("scoped vitest configs", () => {
781828782829it("keeps tooling tests in their own lane", () => {
783830const testConfig = requireTestConfig(defaultToolingConfig);
784-expect(testConfig.include).toEqual(
785-expect.arrayContaining(["test/**/*.test.ts", "src/scripts/**/*.test.ts"]),
786-);
831+expect(testConfig.include).toEqual(["test/**/*.test.ts", "src/scripts/**/*.test.ts"]);
787832expect(testConfig.include).not.toContain("src/config/doc-baseline.integration.test.ts");
788833});
789834此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。