

























@@ -93,6 +93,15 @@ function requireTestConfig<T extends { test?: unknown }>(config: T): NonNullable
9393return config.test as NonNullable<T["test"]>;
9494}
959596+function expectThreadedNonIsolatedRunner(config: {
97+test?: { pool?: unknown; isolate?: unknown; runner?: unknown };
98+}) {
99+const testConfig = requireTestConfig(config);
100+expect(testConfig.pool).toBe("threads");
101+expect(testConfig.isolate).toBe(false);
102+expect(normalizeConfigPath(testConfig.runner)).toBe("test/non-isolated-runner.ts");
103+}
104+96105describe("resolveVitestIsolation", () => {
97106it("aliases private QA plugin SDK subpaths for source tests only", () => {
98107expect(sharedVitestConfig.resolve.alias).toEqual(
@@ -325,73 +334,65 @@ describe("scoped vitest configs", () => {
325334defaultAutoReplyReplyConfig,
326335defaultToolingConfig,
327336]) {
328-expect(config.test?.pool).toBe("threads");
329-expect(config.test?.isolate).toBe(false);
330-expect(normalizeConfigPath(config.test?.runner)).toBe("test/non-isolated-runner.ts");
337+expectThreadedNonIsolatedRunner(config);
331338}
332339333340for (const config of [defaultGatewayConfig, defaultAgentsConfig]) {
334-expect(config.test?.pool).toBe("threads");
335-expect(config.test?.isolate).toBe(false);
336-expect(normalizeConfigPath(config.test?.runner)).toBe("test/non-isolated-runner.ts");
341+expectThreadedNonIsolatedRunner(config);
337342}
338343339-expect(defaultCommandsConfig.test?.pool).toBe("threads");
340-expect(defaultCommandsConfig.test?.isolate).toBe(false);
341-expect(normalizeConfigPath(defaultCommandsConfig.test?.runner)).toBe(
342-"test/non-isolated-runner.ts",
343-);
344+expectThreadedNonIsolatedRunner(defaultCommandsConfig);
344345345-expect(defaultUiConfig.test?.pool).toBe("threads");
346-expect(defaultUiConfig.test?.isolate).toBe(false);
347-expect(normalizeConfigPath(defaultUiConfig.test?.runner)).toBe("test/non-isolated-runner.ts");
346+expectThreadedNonIsolatedRunner(defaultUiConfig);
348347});
349348350349it("keeps the process lane off the openclaw runtime setup", () => {
351-expect(normalizeConfigPaths(defaultProcessConfig.test?.setupFiles)).toEqual(["test/setup.ts"]);
352-expect(normalizeConfigPaths(defaultRuntimeConfig.test?.setupFiles)).toEqual(["test/setup.ts"]);
353-expect(normalizeConfigPaths(defaultPluginSdkConfig.test?.setupFiles)).toEqual([
350+expect(normalizeConfigPaths(requireTestConfig(defaultProcessConfig).setupFiles)).toEqual([
351+"test/setup.ts",
352+]);
353+expect(normalizeConfigPaths(requireTestConfig(defaultRuntimeConfig).setupFiles)).toEqual([
354+"test/setup.ts",
355+]);
356+expect(normalizeConfigPaths(requireTestConfig(defaultPluginSdkConfig).setupFiles)).toEqual([
354357"test/setup.ts",
355358"test/setup-openclaw-runtime.ts",
356359]);
357360});
358361359362it("splits auto-reply into narrower scoped buckets", () => {
360-expect(defaultAutoReplyCoreConfig.test?.include).toEqual(["*.test.ts"]);
361-expect(defaultAutoReplyCoreConfig.test?.exclude).toEqual(
362-expect.arrayContaining(["reply*.test.ts"]),
363-);
364-expect(defaultAutoReplyTopLevelConfig.test?.include).toEqual(["reply*.test.ts"]);
365-expect(defaultAutoReplyReplyConfig.test?.include).toEqual(["reply/**/*.test.ts"]);
363+const coreTestConfig = requireTestConfig(defaultAutoReplyCoreConfig);
364+expect(coreTestConfig.include).toEqual(["*.test.ts"]);
365+expect(coreTestConfig.exclude).toEqual(expect.arrayContaining(["reply*.test.ts"]));
366+expect(requireTestConfig(defaultAutoReplyTopLevelConfig).include).toEqual(["reply*.test.ts"]);
367+expect(requireTestConfig(defaultAutoReplyReplyConfig).include).toEqual(["reply/**/*.test.ts"]);
366368});
367369368370it("keeps the broad agents lane on shared file parallelism", () => {
369-expect(defaultAgentsConfig.test?.fileParallelism).toBe(sharedVitestConfig.test.fileParallelism);
371+expect(requireTestConfig(defaultAgentsConfig).fileParallelism).toBe(
372+sharedVitestConfig.test.fileParallelism,
373+);
370374});
371375372376it("keeps selected plugin-sdk and commands light lanes off the openclaw runtime setup", () => {
373-expect(normalizeConfigPaths(defaultPluginSdkLightConfig.test?.setupFiles)).toEqual([
374-"test/setup.ts",
375-]);
376-expect(normalizeConfigPaths(defaultCommandsLightConfig.test?.setupFiles)).toEqual([
377+expect(normalizeConfigPaths(requireTestConfig(defaultPluginSdkLightConfig).setupFiles)).toEqual(
378+["test/setup.ts"],
379+);
380+expect(normalizeConfigPaths(requireTestConfig(defaultCommandsLightConfig).setupFiles)).toEqual([
377381"test/setup.ts",
378382]);
379383});
380384381385it("keeps the ui lane off both the openclaw runtime setup and unit-fast excludes", () => {
382-expect(normalizeConfigPaths(defaultUiConfig.test?.setupFiles)).toEqual([
386+const testConfig = requireTestConfig(defaultUiConfig);
387+expect(normalizeConfigPaths(testConfig.setupFiles)).toEqual([
383388"test/setup.ts",
384389"ui/src/test-helpers/lit-warnings.setup.ts",
385390]);
386-expect(defaultUiConfig.test?.exclude).not.toContain("chat/slash-command-executor.node.test.ts");
391+expect(testConfig.exclude).not.toContain("chat/slash-command-executor.node.test.ts");
387392});
388393389394it("defaults channel tests to threads with the non-isolated runner", () => {
390-expect(defaultChannelsConfig.test?.isolate).toBe(false);
391-expect(defaultChannelsConfig.test?.pool).toBe("threads");
392-expect(normalizeConfigPath(defaultChannelsConfig.test?.runner)).toBe(
393-"test/non-isolated-runner.ts",
394-);
395+expectThreadedNonIsolatedRunner(defaultChannelsConfig);
395396});
396397397398it("keeps the core channel lane limited to non-extension roots", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。