perf: split more targeted test lanes

This commit is contained in:
Peter Steinberger 2026-04-04 06:05:13 +01:00
parent 5ddc57aa22
commit 0777ddace8
No known key found for this signature in database
26 changed files with 759 additions and 72 deletions

View File

@ -5,12 +5,17 @@ import { isAcpxExtensionRoot } from "../../vitest.extension-acpx-paths.mjs";
import { isBlueBubblesExtensionRoot } from "../../vitest.extension-bluebubbles-paths.mjs";
import { isDiffsExtensionRoot } from "../../vitest.extension-diffs-paths.mjs";
import { isFeishuExtensionRoot } from "../../vitest.extension-feishu-paths.mjs";
import { isIrcExtensionRoot } from "../../vitest.extension-irc-paths.mjs";
import { isMatrixExtensionRoot } from "../../vitest.extension-matrix-paths.mjs";
import { isMattermostExtensionRoot } from "../../vitest.extension-mattermost-paths.mjs";
import { isMemoryExtensionRoot } from "../../vitest.extension-memory-paths.mjs";
import { isMessagingExtensionRoot } from "../../vitest.extension-messaging-paths.mjs";
import { isMsTeamsExtensionRoot } from "../../vitest.extension-msteams-paths.mjs";
import { isProviderExtensionRoot } from "../../vitest.extension-provider-paths.mjs";
import { isTelegramExtensionRoot } from "../../vitest.extension-telegram-paths.mjs";
import { isVoiceCallExtensionRoot } from "../../vitest.extension-voice-call-paths.mjs";
import { isWhatsAppExtensionRoot } from "../../vitest.extension-whatsapp-paths.mjs";
import { isZaloExtensionRoot } from "../../vitest.extension-zalo-paths.mjs";
import { BUNDLED_PLUGIN_PATH_PREFIX, BUNDLED_PLUGIN_ROOT_DIR } from "./bundled-plugin-paths.mjs";
import { listAvailableExtensionIds } from "./changed-extensions.mjs";
@ -103,7 +108,12 @@ export function resolveExtensionTestPlan(params = {}) {
const usesDiffsConfig = roots.some((root) => isDiffsExtensionRoot(root));
const usesBlueBubblesConfig = roots.some((root) => isBlueBubblesExtensionRoot(root));
const usesFeishuConfig = roots.some((root) => isFeishuExtensionRoot(root));
const usesIrcConfig = roots.some((root) => isIrcExtensionRoot(root));
const usesMattermostConfig = roots.some((root) => isMattermostExtensionRoot(root));
const usesTelegramConfig = roots.some((root) => isTelegramExtensionRoot(root));
const usesVoiceCallConfig = roots.some((root) => isVoiceCallExtensionRoot(root));
const usesWhatsAppConfig = roots.some((root) => isWhatsAppExtensionRoot(root));
const usesZaloConfig = roots.some((root) => isZaloExtensionRoot(root));
const usesMatrixConfig = roots.some((root) => isMatrixExtensionRoot(root));
const usesMemoryConfig = roots.some((root) => isMemoryExtensionRoot(root));
const usesMsTeamsConfig = roots.some((root) => isMsTeamsExtensionRoot(root));
@ -119,19 +129,29 @@ export function resolveExtensionTestPlan(params = {}) {
? "vitest.extension-bluebubbles.config.ts"
: usesFeishuConfig
? "vitest.extension-feishu.config.ts"
: usesMatrixConfig
? "vitest.extension-matrix.config.ts"
: usesTelegramConfig
? "vitest.extension-telegram.config.ts"
: usesMemoryConfig
? "vitest.extension-memory.config.ts"
: usesMsTeamsConfig
? "vitest.extension-msteams.config.ts"
: usesMessagingConfig
? "vitest.extension-messaging.config.ts"
: usesProviderConfig
? "vitest.extension-providers.config.ts"
: "vitest.extensions.config.ts";
: usesIrcConfig
? "vitest.extension-irc.config.ts"
: usesMattermostConfig
? "vitest.extension-mattermost.config.ts"
: usesMatrixConfig
? "vitest.extension-matrix.config.ts"
: usesTelegramConfig
? "vitest.extension-telegram.config.ts"
: usesVoiceCallConfig
? "vitest.extension-voice-call.config.ts"
: usesWhatsAppConfig
? "vitest.extension-whatsapp.config.ts"
: usesZaloConfig
? "vitest.extension-zalo.config.ts"
: usesMemoryConfig
? "vitest.extension-memory.config.ts"
: usesMsTeamsConfig
? "vitest.extension-msteams.config.ts"
: usesMessagingConfig
? "vitest.extension-messaging.config.ts"
: usesProviderConfig
? "vitest.extension-providers.config.ts"
: "vitest.extensions.config.ts";
const testFileCount = roots.reduce(
(sum, root) => sum + countTestFiles(path.join(repoRoot, root)),
0,

View File

@ -6,12 +6,17 @@ import { isAcpxExtensionRoot } from "../vitest.extension-acpx-paths.mjs";
import { isBlueBubblesExtensionRoot } from "../vitest.extension-bluebubbles-paths.mjs";
import { isDiffsExtensionRoot } from "../vitest.extension-diffs-paths.mjs";
import { isFeishuExtensionRoot } from "../vitest.extension-feishu-paths.mjs";
import { isIrcExtensionRoot } from "../vitest.extension-irc-paths.mjs";
import { isMatrixExtensionRoot } from "../vitest.extension-matrix-paths.mjs";
import { isMattermostExtensionRoot } from "../vitest.extension-mattermost-paths.mjs";
import { isMemoryExtensionRoot } from "../vitest.extension-memory-paths.mjs";
import { isMessagingExtensionRoot } from "../vitest.extension-messaging-paths.mjs";
import { isMsTeamsExtensionRoot } from "../vitest.extension-msteams-paths.mjs";
import { isProviderExtensionRoot } from "../vitest.extension-provider-paths.mjs";
import { isTelegramExtensionRoot } from "../vitest.extension-telegram-paths.mjs";
import { isVoiceCallExtensionRoot } from "../vitest.extension-voice-call-paths.mjs";
import { isWhatsAppExtensionRoot } from "../vitest.extension-whatsapp-paths.mjs";
import { isZaloExtensionRoot } from "../vitest.extension-zalo-paths.mjs";
import { isBoundaryTestFile, isBundledPluginDependentUnitTestFile } from "../vitest.unit-paths.mjs";
const DEFAULT_VITEST_CONFIG = "vitest.unit.config.ts";
@ -32,26 +37,36 @@ const EXTENSION_BLUEBUBBLES_VITEST_CONFIG = "vitest.extension-bluebubbles.config
const EXTENSION_CHANNELS_VITEST_CONFIG = "vitest.extension-channels.config.ts";
const EXTENSION_DIFFS_VITEST_CONFIG = "vitest.extension-diffs.config.ts";
const EXTENSION_FEISHU_VITEST_CONFIG = "vitest.extension-feishu.config.ts";
const EXTENSION_IRC_VITEST_CONFIG = "vitest.extension-irc.config.ts";
const EXTENSION_MATTERMOST_VITEST_CONFIG = "vitest.extension-mattermost.config.ts";
const EXTENSION_MATRIX_VITEST_CONFIG = "vitest.extension-matrix.config.ts";
const EXTENSION_MEMORY_VITEST_CONFIG = "vitest.extension-memory.config.ts";
const EXTENSION_MSTEAMS_VITEST_CONFIG = "vitest.extension-msteams.config.ts";
const EXTENSION_MESSAGING_VITEST_CONFIG = "vitest.extension-messaging.config.ts";
const EXTENSION_PROVIDERS_VITEST_CONFIG = "vitest.extension-providers.config.ts";
const EXTENSION_TELEGRAM_VITEST_CONFIG = "vitest.extension-telegram.config.ts";
const EXTENSION_VOICE_CALL_VITEST_CONFIG = "vitest.extension-voice-call.config.ts";
const EXTENSION_WHATSAPP_VITEST_CONFIG = "vitest.extension-whatsapp.config.ts";
const EXTENSION_ZALO_VITEST_CONFIG = "vitest.extension-zalo.config.ts";
const EXTENSIONS_VITEST_CONFIG = "vitest.extensions.config.ts";
const GATEWAY_VITEST_CONFIG = "vitest.gateway.config.ts";
const HOOKS_VITEST_CONFIG = "vitest.hooks.config.ts";
const INFRA_VITEST_CONFIG = "vitest.infra.config.ts";
const MEDIA_VITEST_CONFIG = "vitest.media.config.ts";
const MEDIA_UNDERSTANDING_VITEST_CONFIG = "vitest.media-understanding.config.ts";
const LOGGING_VITEST_CONFIG = "vitest.logging.config.ts";
const PLUGIN_SDK_VITEST_CONFIG = "vitest.plugin-sdk.config.ts";
const PLUGINS_VITEST_CONFIG = "vitest.plugins.config.ts";
const PROCESS_VITEST_CONFIG = "vitest.process.config.ts";
const RUNTIME_CONFIG_VITEST_CONFIG = "vitest.runtime-config.config.ts";
const SECRETS_VITEST_CONFIG = "vitest.secrets.config.ts";
const SHARED_CORE_VITEST_CONFIG = "vitest.shared-core.config.ts";
const TASKS_VITEST_CONFIG = "vitest.tasks.config.ts";
const TOOLING_VITEST_CONFIG = "vitest.tooling.config.ts";
const TUI_VITEST_CONFIG = "vitest.tui.config.ts";
const UI_VITEST_CONFIG = "vitest.ui.config.ts";
const UTILS_VITEST_CONFIG = "vitest.utils.config.ts";
const WIZARD_VITEST_CONFIG = "vitest.wizard.config.ts";
const INCLUDE_FILE_ENV_KEY = "OPENCLAW_VITEST_INCLUDE_FILE";
function normalizePathPattern(value) {
@ -127,9 +142,24 @@ function classifyTarget(arg, cwd) {
if (isFeishuExtensionRoot(extensionRoot)) {
return "extensionFeishu";
}
if (isIrcExtensionRoot(extensionRoot)) {
return "extensionIrc";
}
if (isMattermostExtensionRoot(extensionRoot)) {
return "extensionMattermost";
}
if (isTelegramExtensionRoot(extensionRoot)) {
return "extensionTelegram";
}
if (isVoiceCallExtensionRoot(extensionRoot)) {
return "extensionVoiceCall";
}
if (isWhatsAppExtensionRoot(extensionRoot)) {
return "extensionWhatsApp";
}
if (isZaloExtensionRoot(extensionRoot)) {
return "extensionZalo";
}
if (isMatrixExtensionRoot(extensionRoot)) {
return "extensionMatrix";
}
@ -194,15 +224,24 @@ function classifyTarget(arg, cwd) {
if (relative.startsWith("src/media/")) {
return "media";
}
if (relative.startsWith("src/logging/")) {
return "logging";
}
if (relative.startsWith("src/plugin-sdk/")) {
return "pluginSdk";
}
if (relative.startsWith("src/process/")) {
return "process";
}
if (relative.startsWith("src/secrets/")) {
return "secrets";
}
if (relative.startsWith("src/shared/")) {
return "sharedCore";
}
if (relative.startsWith("src/tasks/")) {
return "tasks";
}
if (relative.startsWith("src/tui/")) {
return "tui";
}
@ -227,6 +266,12 @@ function classifyTarget(arg, cwd) {
if (relative.startsWith("ui/src/ui/")) {
return "ui";
}
if (relative.startsWith("src/utils/")) {
return "utils";
}
if (relative.startsWith("src/wizard/")) {
return "wizard";
}
return "default";
}
@ -304,9 +349,12 @@ export function buildVitestRunPlans(args, cwd = process.cwd()) {
"cron",
"daemon",
"media",
"logging",
"pluginSdk",
"process",
"secrets",
"sharedCore",
"tasks",
"tui",
"mediaUnderstanding",
"acp",
@ -316,13 +364,20 @@ export function buildVitestRunPlans(args, cwd = process.cwd()) {
"agent",
"plugin",
"ui",
"utils",
"wizard",
"e2e",
"extensionAcpx",
"extensionDiffs",
"extensionBlueBubbles",
"extensionFeishu",
"extensionIrc",
"extensionMattermost",
"extensionChannel",
"extensionTelegram",
"extensionVoiceCall",
"extensionWhatsApp",
"extensionZalo",
"extensionMatrix",
"extensionMemory",
"extensionMsTeams",
@ -360,61 +415,93 @@ export function buildVitestRunPlans(args, cwd = process.cwd()) {
? DAEMON_VITEST_CONFIG
: kind === "media"
? MEDIA_VITEST_CONFIG
: kind === "pluginSdk"
? PLUGIN_SDK_VITEST_CONFIG
: kind === "secrets"
? SECRETS_VITEST_CONFIG
: kind === "sharedCore"
? SHARED_CORE_VITEST_CONFIG
: kind === "tui"
? TUI_VITEST_CONFIG
: kind === "mediaUnderstanding"
? MEDIA_UNDERSTANDING_VITEST_CONFIG
: kind === "acp"
? ACP_VITEST_CONFIG
: kind === "cli"
? CLI_VITEST_CONFIG
: kind === "command"
? COMMANDS_VITEST_CONFIG
: kind === "autoReply"
? AUTO_REPLY_VITEST_CONFIG
: kind === "agent"
? AGENTS_VITEST_CONFIG
: kind === "plugin"
? PLUGINS_VITEST_CONFIG
: kind === "ui"
? UI_VITEST_CONFIG
: kind === "e2e"
? E2E_VITEST_CONFIG
: kind === "extensionAcpx"
? EXTENSION_ACPX_VITEST_CONFIG
: kind === "extensionDiffs"
? EXTENSION_DIFFS_VITEST_CONFIG
: kind === "extensionBlueBubbles"
? EXTENSION_BLUEBUBBLES_VITEST_CONFIG
: kind === "extensionFeishu"
? EXTENSION_FEISHU_VITEST_CONFIG
: kind === "extensionChannel"
? EXTENSION_CHANNELS_VITEST_CONFIG
: kind === "extensionTelegram"
? EXTENSION_TELEGRAM_VITEST_CONFIG
: kind === "extensionMatrix"
? EXTENSION_MATRIX_VITEST_CONFIG
: kind === "extensionMemory"
? EXTENSION_MEMORY_VITEST_CONFIG
: kind === "extensionMsTeams"
? EXTENSION_MSTEAMS_VITEST_CONFIG
: kind ===
"extensionMessaging"
? EXTENSION_MESSAGING_VITEST_CONFIG
: kind === "logging"
? LOGGING_VITEST_CONFIG
: kind === "pluginSdk"
? PLUGIN_SDK_VITEST_CONFIG
: kind === "process"
? PROCESS_VITEST_CONFIG
: kind === "secrets"
? SECRETS_VITEST_CONFIG
: kind === "sharedCore"
? SHARED_CORE_VITEST_CONFIG
: kind === "tasks"
? TASKS_VITEST_CONFIG
: kind === "tui"
? TUI_VITEST_CONFIG
: kind === "mediaUnderstanding"
? MEDIA_UNDERSTANDING_VITEST_CONFIG
: kind === "acp"
? ACP_VITEST_CONFIG
: kind === "cli"
? CLI_VITEST_CONFIG
: kind === "command"
? COMMANDS_VITEST_CONFIG
: kind === "autoReply"
? AUTO_REPLY_VITEST_CONFIG
: kind === "agent"
? AGENTS_VITEST_CONFIG
: kind === "plugin"
? PLUGINS_VITEST_CONFIG
: kind === "ui"
? UI_VITEST_CONFIG
: kind === "utils"
? UTILS_VITEST_CONFIG
: kind === "wizard"
? WIZARD_VITEST_CONFIG
: kind === "e2e"
? E2E_VITEST_CONFIG
: kind === "extensionAcpx"
? EXTENSION_ACPX_VITEST_CONFIG
: kind === "extensionDiffs"
? EXTENSION_DIFFS_VITEST_CONFIG
: kind ===
"extensionBlueBubbles"
? EXTENSION_BLUEBUBBLES_VITEST_CONFIG
: kind === "extensionFeishu"
? EXTENSION_FEISHU_VITEST_CONFIG
: kind === "extensionIrc"
? EXTENSION_IRC_VITEST_CONFIG
: kind ===
"extensionProvider"
? EXTENSION_PROVIDERS_VITEST_CONFIG
: kind === "channel"
? CHANNEL_VITEST_CONFIG
: kind === "extension"
? EXTENSIONS_VITEST_CONFIG
: DEFAULT_VITEST_CONFIG;
"extensionMattermost"
? EXTENSION_MATTERMOST_VITEST_CONFIG
: kind ===
"extensionChannel"
? EXTENSION_CHANNELS_VITEST_CONFIG
: kind ===
"extensionTelegram"
? EXTENSION_TELEGRAM_VITEST_CONFIG
: kind ===
"extensionVoiceCall"
? EXTENSION_VOICE_CALL_VITEST_CONFIG
: kind ===
"extensionWhatsApp"
? EXTENSION_WHATSAPP_VITEST_CONFIG
: kind ===
"extensionZalo"
? EXTENSION_ZALO_VITEST_CONFIG
: kind ===
"extensionMatrix"
? EXTENSION_MATRIX_VITEST_CONFIG
: kind ===
"extensionMemory"
? EXTENSION_MEMORY_VITEST_CONFIG
: kind ===
"extensionMsTeams"
? EXTENSION_MSTEAMS_VITEST_CONFIG
: kind ===
"extensionMessaging"
? EXTENSION_MESSAGING_VITEST_CONFIG
: kind ===
"extensionProvider"
? EXTENSION_PROVIDERS_VITEST_CONFIG
: kind ===
"channel"
? CHANNEL_VITEST_CONFIG
: kind ===
"extension"
? EXTENSIONS_VITEST_CONFIG
: DEFAULT_VITEST_CONFIG;
const includePatterns =
kind === "default" || kind === "e2e"
? null

View File

@ -190,6 +190,17 @@ describe("test-projects args", () => {
]);
});
it("routes process targets to the process config", () => {
expect(buildVitestRunPlans(["src/process/exec.test.ts"])).toEqual([
{
config: "vitest.process.config.ts",
forwardedArgs: [],
includePatterns: ["src/process/exec.test.ts"],
watchMode: false,
},
]);
});
it("routes secrets targets to the secrets config", () => {
expect(buildVitestRunPlans(["src/secrets/resolve.test.ts"])).toEqual([
{
@ -212,6 +223,39 @@ describe("test-projects args", () => {
]);
});
it("routes tasks targets to the tasks config", () => {
expect(buildVitestRunPlans(["src/tasks/task-registry.test.ts"])).toEqual([
{
config: "vitest.tasks.config.ts",
forwardedArgs: [],
includePatterns: ["src/tasks/task-registry.test.ts"],
watchMode: false,
},
]);
});
it("routes logging targets to the logging config", () => {
expect(buildVitestRunPlans(["src/logging/load-levels.test.ts"])).toEqual([
{
config: "vitest.logging.config.ts",
forwardedArgs: [],
includePatterns: ["src/logging/load-levels.test.ts"],
watchMode: false,
},
]);
});
it("routes wizard targets to the wizard config", () => {
expect(buildVitestRunPlans(["src/wizard/setup.test.ts"])).toEqual([
{
config: "vitest.wizard.config.ts",
forwardedArgs: [],
includePatterns: ["src/wizard/setup.test.ts"],
watchMode: false,
},
]);
});
it("routes tui targets to the tui config", () => {
expect(buildVitestRunPlans(["src/tui/tui.test.ts"])).toEqual([
{
@ -408,6 +452,50 @@ describe("test-projects args", () => {
]);
});
it("routes whatsapp extension tests to the whatsapp config", () => {
expect(buildVitestRunPlans(["extensions/whatsapp/src/send.test.ts"])).toEqual([
{
config: "vitest.extension-whatsapp.config.ts",
forwardedArgs: [],
includePatterns: ["extensions/whatsapp/src/send.test.ts"],
watchMode: false,
},
]);
});
it("routes voice-call extension tests to the voice-call config", () => {
expect(buildVitestRunPlans(["extensions/voice-call/src/runtime.test.ts"])).toEqual([
{
config: "vitest.extension-voice-call.config.ts",
forwardedArgs: [],
includePatterns: ["extensions/voice-call/src/runtime.test.ts"],
watchMode: false,
},
]);
});
it("routes mattermost extension tests to the mattermost config", () => {
expect(buildVitestRunPlans(["extensions/mattermost/src/channel.test.ts"])).toEqual([
{
config: "vitest.extension-mattermost.config.ts",
forwardedArgs: [],
includePatterns: ["extensions/mattermost/src/channel.test.ts"],
watchMode: false,
},
]);
});
it("routes zalo extension tests to the zalo config", () => {
expect(buildVitestRunPlans(["extensions/zalo/src/channel.test.ts"])).toEqual([
{
config: "vitest.extension-zalo.config.ts",
forwardedArgs: [],
includePatterns: ["extensions/zalo/src/channel.test.ts"],
watchMode: false,
},
]);
});
it("routes matrix extension tests to the matrix config", () => {
expect(buildVitestRunPlans(["extensions/matrix/src/channel.test.ts"])).toEqual([
{
@ -441,6 +529,17 @@ describe("test-projects args", () => {
]);
});
it("routes irc extension tests to the irc config", () => {
expect(buildVitestRunPlans(["extensions/irc/src/channel.test.ts"])).toEqual([
{
config: "vitest.extension-irc.config.ts",
forwardedArgs: [],
includePatterns: ["extensions/irc/src/channel.test.ts"],
watchMode: false,
},
]);
});
it("routes acpx extension tests to the acpx config", () => {
expect(buildVitestRunPlans(["extensions/acpx/src/runtime.test.ts"])).toEqual([
{
@ -474,6 +573,17 @@ describe("test-projects args", () => {
]);
});
it("routes utils targets to the utils config", () => {
expect(buildVitestRunPlans(["src/utils/path.test.ts"])).toEqual([
{
config: "vitest.utils.config.ts",
forwardedArgs: [],
includePatterns: ["src/utils/path.test.ts"],
watchMode: false,
},
]);
});
it("widens top-level test helpers to sibling repo tests under contracts", () => {
expect(buildVitestRunPlans(["test/helpers/temp-home.ts"])).toEqual([
{

View File

@ -106,6 +106,51 @@ describe("scripts/test-extension.mjs", () => {
expect(plan.hasTests).toBe(true);
});
it("resolves whatsapp onto the whatsapp vitest config", () => {
const plan = resolveExtensionTestPlan({ targetArg: "whatsapp", cwd: process.cwd() });
expect(plan.extensionId).toBe("whatsapp");
expect(plan.config).toBe("vitest.extension-whatsapp.config.ts");
expect(plan.roots).toContain(bundledPluginRoot("whatsapp"));
expect(plan.hasTests).toBe(true);
});
it("resolves voice-call onto the voice-call vitest config", () => {
const plan = resolveExtensionTestPlan({ targetArg: "voice-call", cwd: process.cwd() });
expect(plan.extensionId).toBe("voice-call");
expect(plan.config).toBe("vitest.extension-voice-call.config.ts");
expect(plan.roots).toContain(bundledPluginRoot("voice-call"));
expect(plan.hasTests).toBe(true);
});
it("resolves mattermost onto the mattermost vitest config", () => {
const plan = resolveExtensionTestPlan({ targetArg: "mattermost", cwd: process.cwd() });
expect(plan.extensionId).toBe("mattermost");
expect(plan.config).toBe("vitest.extension-mattermost.config.ts");
expect(plan.roots).toContain(bundledPluginRoot("mattermost"));
expect(plan.hasTests).toBe(true);
});
it("resolves irc onto the irc vitest config", () => {
const plan = resolveExtensionTestPlan({ targetArg: "irc", cwd: process.cwd() });
expect(plan.extensionId).toBe("irc");
expect(plan.config).toBe("vitest.extension-irc.config.ts");
expect(plan.roots).toContain(bundledPluginRoot("irc"));
expect(plan.hasTests).toBe(true);
});
it("resolves zalo onto the zalo vitest config", () => {
const plan = resolveExtensionTestPlan({ targetArg: "zalo", cwd: process.cwd() });
expect(plan.extensionId).toBe("zalo");
expect(plan.config).toBe("vitest.extension-zalo.config.ts");
expect(plan.roots).toContain(bundledPluginRoot("zalo"));
expect(plan.hasTests).toBe(true);
});
it("resolves memory extensions onto the memory vitest config", () => {
const plan = resolveExtensionTestPlan({ targetArg: "memory-core", cwd: process.cwd() });
@ -199,9 +244,15 @@ describe("scripts/test-extension.mjs", () => {
"openai",
"matrix",
"telegram",
"mattermost",
"voice-call",
"whatsapp",
"zalo",
"zalouser",
"memory-core",
"msteams",
"feishu",
"irc",
"bluebubbles",
"acpx",
"diffs",
@ -214,13 +265,19 @@ describe("scripts/test-extension.mjs", () => {
"diffs",
"feishu",
"firecrawl",
"irc",
"line",
"matrix",
"mattermost",
"memory-core",
"msteams",
"openai",
"slack",
"telegram",
"voice-call",
"whatsapp",
"zalo",
"zalouser",
]);
expect(batch.planGroups).toEqual([
{
@ -253,12 +310,24 @@ describe("scripts/test-extension.mjs", () => {
roots: [bundledPluginRoot("feishu")],
testFileCount: expect.any(Number),
},
{
config: "vitest.extension-irc.config.ts",
extensionIds: ["irc"],
roots: [bundledPluginRoot("irc")],
testFileCount: expect.any(Number),
},
{
config: "vitest.extension-matrix.config.ts",
extensionIds: ["matrix"],
roots: [bundledPluginRoot("matrix")],
testFileCount: expect.any(Number),
},
{
config: "vitest.extension-mattermost.config.ts",
extensionIds: ["mattermost"],
roots: [bundledPluginRoot("mattermost")],
testFileCount: expect.any(Number),
},
{
config: "vitest.extension-memory.config.ts",
extensionIds: ["memory-core"],
@ -283,6 +352,24 @@ describe("scripts/test-extension.mjs", () => {
roots: [bundledPluginRoot("telegram")],
testFileCount: expect.any(Number),
},
{
config: "vitest.extension-voice-call.config.ts",
extensionIds: ["voice-call"],
roots: [bundledPluginRoot("voice-call")],
testFileCount: expect.any(Number),
},
{
config: "vitest.extension-whatsapp.config.ts",
extensionIds: ["whatsapp"],
roots: [bundledPluginRoot("whatsapp")],
testFileCount: expect.any(Number),
},
{
config: "vitest.extension-zalo.config.ts",
extensionIds: ["zalo", "zalouser"],
roots: [bundledPluginRoot("zalo"), bundledPluginRoot("zalouser")],
testFileCount: expect.any(Number),
},
{
config: "vitest.extensions.config.ts",
extensionIds: ["firecrawl"],

View File

@ -15,27 +15,37 @@ import { createExtensionBlueBubblesVitestConfig } from "../vitest.extension-blue
import { createExtensionChannelsVitestConfig } from "../vitest.extension-channels.config.ts";
import { createExtensionDiffsVitestConfig } from "../vitest.extension-diffs.config.ts";
import { createExtensionFeishuVitestConfig } from "../vitest.extension-feishu.config.ts";
import { createExtensionIrcVitestConfig } from "../vitest.extension-irc.config.ts";
import { createExtensionMatrixVitestConfig } from "../vitest.extension-matrix.config.ts";
import { createExtensionMattermostVitestConfig } from "../vitest.extension-mattermost.config.ts";
import { createExtensionMemoryVitestConfig } from "../vitest.extension-memory.config.ts";
import { createExtensionMessagingVitestConfig } from "../vitest.extension-messaging.config.ts";
import { createExtensionMsTeamsVitestConfig } from "../vitest.extension-msteams.config.ts";
import { createExtensionProvidersVitestConfig } from "../vitest.extension-providers.config.ts";
import { createExtensionTelegramVitestConfig } from "../vitest.extension-telegram.config.ts";
import { createExtensionVoiceCallVitestConfig } from "../vitest.extension-voice-call.config.ts";
import { createExtensionWhatsAppVitestConfig } from "../vitest.extension-whatsapp.config.ts";
import { createExtensionZaloVitestConfig } from "../vitest.extension-zalo.config.ts";
import { createExtensionsVitestConfig } from "../vitest.extensions.config.ts";
import { createGatewayVitestConfig } from "../vitest.gateway.config.ts";
import { createHooksVitestConfig } from "../vitest.hooks.config.ts";
import { createInfraVitestConfig } from "../vitest.infra.config.ts";
import { createLoggingVitestConfig } from "../vitest.logging.config.ts";
import { createMediaUnderstandingVitestConfig } from "../vitest.media-understanding.config.ts";
import { createMediaVitestConfig } from "../vitest.media.config.ts";
import { createPluginSdkVitestConfig } from "../vitest.plugin-sdk.config.ts";
import { createPluginsVitestConfig } from "../vitest.plugins.config.ts";
import { createProcessVitestConfig } from "../vitest.process.config.ts";
import { createRuntimeConfigVitestConfig } from "../vitest.runtime-config.config.ts";
import { createScopedVitestConfig, resolveVitestIsolation } from "../vitest.scoped-config.ts";
import { createSecretsVitestConfig } from "../vitest.secrets.config.ts";
import { createSharedCoreVitestConfig } from "../vitest.shared-core.config.ts";
import { createTasksVitestConfig } from "../vitest.tasks.config.ts";
import { createToolingVitestConfig } from "../vitest.tooling.config.ts";
import { createTuiVitestConfig } from "../vitest.tui.config.ts";
import { createUiVitestConfig } from "../vitest.ui.config.ts";
import { createUtilsVitestConfig } from "../vitest.utils.config.ts";
import { createWizardVitestConfig } from "../vitest.wizard.config.ts";
import { BUNDLED_PLUGIN_TEST_GLOB, bundledPluginFile } from "./helpers/bundled-plugin-paths.js";
const EXTENSIONS_CHANNEL_GLOB = ["extensions", "channel", "**"].join("/");
@ -115,15 +125,21 @@ describe("scoped vitest configs", () => {
const defaultExtensionChannelsConfig = createExtensionChannelsVitestConfig({});
const defaultExtensionDiffsConfig = createExtensionDiffsVitestConfig({});
const defaultExtensionFeishuConfig = createExtensionFeishuVitestConfig({});
const defaultExtensionIrcConfig = createExtensionIrcVitestConfig({});
const defaultExtensionMatrixConfig = createExtensionMatrixVitestConfig({});
const defaultExtensionMattermostConfig = createExtensionMattermostVitestConfig({});
const defaultExtensionMemoryConfig = createExtensionMemoryVitestConfig({});
const defaultExtensionMsTeamsConfig = createExtensionMsTeamsVitestConfig({});
const defaultExtensionMessagingConfig = createExtensionMessagingVitestConfig({});
const defaultExtensionProvidersConfig = createExtensionProvidersVitestConfig({});
const defaultExtensionTelegramConfig = createExtensionTelegramVitestConfig({});
const defaultExtensionVoiceCallConfig = createExtensionVoiceCallVitestConfig({});
const defaultExtensionWhatsAppConfig = createExtensionWhatsAppVitestConfig({});
const defaultExtensionZaloConfig = createExtensionZaloVitestConfig({});
const defaultGatewayConfig = createGatewayVitestConfig({});
const defaultHooksConfig = createHooksVitestConfig({});
const defaultInfraConfig = createInfraVitestConfig({});
const defaultLoggingConfig = createLoggingVitestConfig({});
const defaultPluginSdkConfig = createPluginSdkVitestConfig({});
const defaultSecretsConfig = createSecretsVitestConfig({});
const defaultRuntimeConfig = createRuntimeConfigVitestConfig({});
@ -132,13 +148,17 @@ describe("scoped vitest configs", () => {
const defaultMediaConfig = createMediaVitestConfig({});
const defaultMediaUnderstandingConfig = createMediaUnderstandingVitestConfig({});
const defaultSharedCoreConfig = createSharedCoreVitestConfig({});
const defaultTasksConfig = createTasksVitestConfig({});
const defaultCommandsConfig = createCommandsVitestConfig({});
const defaultAutoReplyConfig = createAutoReplyVitestConfig({});
const defaultAgentsConfig = createAgentsVitestConfig({});
const defaultPluginsConfig = createPluginsVitestConfig({});
const defaultProcessConfig = createProcessVitestConfig({});
const defaultToolingConfig = createToolingVitestConfig({});
const defaultTuiConfig = createTuiVitestConfig({});
const defaultUiConfig = createUiVitestConfig({});
const defaultUtilsConfig = createUtilsVitestConfig({});
const defaultWizardConfig = createWizardVitestConfig({});
it("keeps every scoped lane on thread workers with the non-isolated runner", () => {
for (const config of [
@ -209,7 +229,6 @@ describe("scoped vitest configs", () => {
"browser/**/*.test.ts",
"discord/**/*.test.ts",
"line/**/*.test.ts",
"whatsapp/**/*.test.ts",
"slack/**/*.test.ts",
"signal/**/*.test.ts",
"imessage/**/*.test.ts",
@ -237,6 +256,11 @@ describe("scoped vitest configs", () => {
expect(defaultExtensionFeishuConfig.test?.include).toEqual(["feishu/**/*.test.ts"]);
});
it("normalizes irc extension include patterns relative to the scoped dir", () => {
expect(defaultExtensionIrcConfig.test?.dir).toBe("extensions");
expect(defaultExtensionIrcConfig.test?.include).toEqual(["irc/**/*.test.ts"]);
});
it("normalizes extension include patterns relative to the scoped dir", () => {
expect(defaultExtensionsConfig.test?.dir).toBe("extensions");
expect(defaultExtensionsConfig.test?.include).toEqual(["**/*.test.ts"]);
@ -261,6 +285,11 @@ describe("scoped vitest configs", () => {
expect(defaultExtensionMatrixConfig.test?.include).toEqual(["matrix/**/*.test.ts"]);
});
it("normalizes mattermost extension include patterns relative to the scoped dir", () => {
expect(defaultExtensionMattermostConfig.test?.dir).toBe("extensions");
expect(defaultExtensionMattermostConfig.test?.include).toEqual(["mattermost/**/*.test.ts"]);
});
it("normalizes msteams extension include patterns relative to the scoped dir", () => {
expect(defaultExtensionMsTeamsConfig.test?.dir).toBe("extensions");
expect(defaultExtensionMsTeamsConfig.test?.include).toEqual(["msteams/**/*.test.ts"]);
@ -271,6 +300,23 @@ describe("scoped vitest configs", () => {
expect(defaultExtensionTelegramConfig.test?.include).toEqual(["telegram/**/*.test.ts"]);
});
it("normalizes whatsapp extension include patterns relative to the scoped dir", () => {
expect(defaultExtensionWhatsAppConfig.test?.dir).toBe("extensions");
expect(defaultExtensionWhatsAppConfig.test?.include).toEqual(["whatsapp/**/*.test.ts"]);
});
it("normalizes zalo extension include patterns relative to the scoped dir", () => {
expect(defaultExtensionZaloConfig.test?.dir).toBe("extensions");
expect(defaultExtensionZaloConfig.test?.include).toEqual(
expect.arrayContaining(["zalo/**/*.test.ts", "zalouser/**/*.test.ts"]),
);
});
it("normalizes voice-call extension include patterns relative to the scoped dir", () => {
expect(defaultExtensionVoiceCallConfig.test?.dir).toBe("extensions");
expect(defaultExtensionVoiceCallConfig.test?.include).toEqual(["voice-call/**/*.test.ts"]);
});
it("normalizes memory extension include patterns relative to the scoped dir", () => {
expect(defaultExtensionMemoryConfig.test?.dir).toBe("extensions");
expect(defaultExtensionMemoryConfig.test?.include).toEqual(
@ -304,6 +350,34 @@ describe("scoped vitest configs", () => {
]);
});
it("keeps whatsapp tests out of the shared extensions lane", () => {
const extensionExcludes = defaultExtensionsConfig.test?.exclude ?? [];
expect(
extensionExcludes.some((pattern) => path.matchesGlob("whatsapp/src/send.test.ts", pattern)),
).toBe(true);
});
it("keeps voice-call tests out of the shared extensions lane", () => {
const extensionExcludes = defaultExtensionsConfig.test?.exclude ?? [];
expect(
extensionExcludes.some((pattern) =>
path.matchesGlob("voice-call/src/runtime.test.ts", pattern),
),
).toBe(true);
});
it("keeps zalo tests out of the shared extensions lane", () => {
const extensionExcludes = defaultExtensionsConfig.test?.exclude ?? [];
expect(
extensionExcludes.some((pattern) => path.matchesGlob("zalo/src/channel.test.ts", pattern)),
).toBe(true);
expect(
extensionExcludes.some((pattern) =>
path.matchesGlob("zalouser/src/channel.test.ts", pattern),
),
).toBe(true);
});
it("keeps provider plugin tests out of the shared extensions lane", () => {
const extensionExcludes = defaultExtensionsConfig.test?.exclude ?? [];
expect(
@ -320,6 +394,15 @@ describe("scoped vitest configs", () => {
).toBe(true);
});
it("keeps mattermost tests out of the shared extensions lane", () => {
const extensionExcludes = defaultExtensionsConfig.test?.exclude ?? [];
expect(
extensionExcludes.some((pattern) =>
path.matchesGlob("mattermost/src/channel.test.ts", pattern),
),
).toBe(true);
});
it("normalizes secrets include patterns relative to the scoped dir", () => {
expect(defaultSecretsConfig.test?.dir).toBe("src/secrets");
expect(defaultSecretsConfig.test?.include).toEqual(["**/*.test.ts"]);
@ -355,6 +438,13 @@ describe("scoped vitest configs", () => {
).toBe(true);
});
it("keeps irc tests out of the shared extensions lane", () => {
const extensionExcludes = defaultExtensionsConfig.test?.exclude ?? [];
expect(
extensionExcludes.some((pattern) => path.matchesGlob("irc/src/channel.test.ts", pattern)),
).toBe(true);
});
it("keeps acpx tests out of the shared extensions lane", () => {
const extensionExcludes = defaultExtensionsConfig.test?.exclude ?? [];
expect(
@ -399,6 +489,11 @@ describe("scoped vitest configs", () => {
expect(defaultMediaConfig.test?.include).toEqual(["media/**/*.test.ts"]);
});
it("normalizes logging include patterns relative to the scoped dir", () => {
expect(defaultLoggingConfig.test?.dir).toBe("src");
expect(defaultLoggingConfig.test?.include).toEqual(["logging/**/*.test.ts"]);
});
it("normalizes plugin-sdk include patterns relative to the scoped dir", () => {
expect(defaultPluginSdkConfig.test?.dir).toBe("src");
expect(defaultPluginSdkConfig.test?.include).toEqual(["plugin-sdk/**/*.test.ts"]);
@ -409,6 +504,21 @@ describe("scoped vitest configs", () => {
expect(defaultSharedCoreConfig.test?.include).toEqual(["shared/**/*.test.ts"]);
});
it("normalizes process include patterns relative to the scoped dir", () => {
expect(defaultProcessConfig.test?.dir).toBe("src");
expect(defaultProcessConfig.test?.include).toEqual(["process/**/*.test.ts"]);
});
it("normalizes tasks include patterns relative to the scoped dir", () => {
expect(defaultTasksConfig.test?.dir).toBe("src");
expect(defaultTasksConfig.test?.include).toEqual(["tasks/**/*.test.ts"]);
});
it("normalizes wizard include patterns relative to the scoped dir", () => {
expect(defaultWizardConfig.test?.dir).toBe("src");
expect(defaultWizardConfig.test?.include).toEqual(["wizard/**/*.test.ts"]);
});
it("normalizes tui include patterns relative to the scoped dir", () => {
expect(defaultTuiConfig.test?.dir).toBe("src");
expect(defaultTuiConfig.test?.include).toEqual(["tui/**/*.test.ts"]);
@ -465,4 +575,9 @@ describe("scoped vitest configs", () => {
expect(defaultUiConfig.test?.dir).toBe("ui/src/ui");
expect(defaultUiConfig.test?.include).toEqual(["**/*.test.ts"]);
});
it("normalizes utils include patterns relative to the scoped dir", () => {
expect(defaultUtilsConfig.test?.dir).toBe("src");
expect(defaultUtilsConfig.test?.include).toEqual(["utils/**/*.test.ts"]);
});
});

View File

@ -13,7 +13,6 @@ const extensionRoutedChannelTestFileSet = new Set(extensionRoutedChannelTestFile
export const channelTestRoots = [
"src/channels",
bundledPluginRoot("discord"),
bundledPluginRoot("whatsapp"),
bundledPluginRoot("slack"),
bundledPluginRoot("signal"),
bundledPluginRoot("imessage"),

View File

@ -27,24 +27,34 @@ export const rootVitestProjects = [
"vitest.media.config.ts",
"vitest.plugin-sdk.config.ts",
"vitest.plugins.config.ts",
"vitest.logging.config.ts",
"vitest.process.config.ts",
"vitest.cron.config.ts",
"vitest.media-understanding.config.ts",
"vitest.shared-core.config.ts",
"vitest.tasks.config.ts",
"vitest.tooling.config.ts",
"vitest.tui.config.ts",
"vitest.ui.config.ts",
"vitest.utils.config.ts",
"vitest.wizard.config.ts",
"vitest.channels.config.ts",
"vitest.extension-acpx.config.ts",
"vitest.extension-bluebubbles.config.ts",
"vitest.extension-channels.config.ts",
"vitest.extension-diffs.config.ts",
"vitest.extension-feishu.config.ts",
"vitest.extension-irc.config.ts",
"vitest.extension-mattermost.config.ts",
"vitest.extension-matrix.config.ts",
"vitest.extension-memory.config.ts",
"vitest.extension-msteams.config.ts",
"vitest.extension-messaging.config.ts",
"vitest.extension-providers.config.ts",
"vitest.extension-telegram.config.ts",
"vitest.extension-voice-call.config.ts",
"vitest.extension-whatsapp.config.ts",
"vitest.extension-zalo.config.ts",
"vitest.extensions.config.ts",
] as const;

View File

@ -0,0 +1,5 @@
export const ircExtensionTestRoots = ["extensions/irc"];
export function isIrcExtensionRoot(root) {
return ircExtensionTestRoots.includes(root);
}

View File

@ -0,0 +1,26 @@
import { ircExtensionTestRoots } from "./vitest.extension-irc-paths.mjs";
import { loadPatternListFromEnv } from "./vitest.pattern-file.ts";
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function loadIncludePatternsFromEnv(
env: Record<string, string | undefined> = process.env,
): string[] | null {
return loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env);
}
export function createExtensionIrcVitestConfig(
env: Record<string, string | undefined> = process.env,
) {
return createScopedVitestConfig(
loadIncludePatternsFromEnv(env) ?? ircExtensionTestRoots.map((root) => `${root}/**/*.test.ts`),
{
dir: "extensions",
env,
name: "extension-irc",
passWithNoTests: true,
setupFiles: ["test/setup.extensions.ts"],
},
);
}
export default createExtensionIrcVitestConfig();

View File

@ -0,0 +1,11 @@
import { bundledPluginRoot } from "./scripts/lib/bundled-plugin-paths.mjs";
export const mattermostExtensionIds = ["mattermost"];
export const mattermostExtensionTestRoots = mattermostExtensionIds.map((id) =>
bundledPluginRoot(id),
);
export function isMattermostExtensionRoot(root) {
return mattermostExtensionTestRoots.includes(root);
}

View File

@ -0,0 +1,27 @@
import { mattermostExtensionTestRoots } from "./vitest.extension-mattermost-paths.mjs";
import { loadPatternListFromEnv } from "./vitest.pattern-file.ts";
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function loadIncludePatternsFromEnv(
env: Record<string, string | undefined> = process.env,
): string[] | null {
return loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env);
}
export function createExtensionMattermostVitestConfig(
env: Record<string, string | undefined> = process.env,
) {
return createScopedVitestConfig(
loadIncludePatternsFromEnv(env) ??
mattermostExtensionTestRoots.map((root) => `${root}/**/*.test.ts`),
{
dir: "extensions",
env,
name: "extension-mattermost",
passWithNoTests: true,
setupFiles: ["test/setup.extensions.ts"],
},
);
}
export default createExtensionMattermostVitestConfig();

View File

@ -3,7 +3,6 @@ import { bundledPluginRoot } from "./scripts/lib/bundled-plugin-paths.mjs";
export const messagingExtensionIds = [
"bluebubbles",
"googlechat",
"irc",
"mattermost",
"nextcloud-talk",
"nostr",
@ -12,8 +11,6 @@ export const messagingExtensionIds = [
"tlon",
"twitch",
"voice-call",
"zalo",
"zalouser",
];
export const messagingExtensionTestRoots = messagingExtensionIds.map((id) => bundledPluginRoot(id));

View File

@ -0,0 +1,9 @@
import { bundledPluginRoot } from "./scripts/lib/bundled-plugin-paths.mjs";
export const voiceCallExtensionIds = ["voice-call"];
export const voiceCallExtensionTestRoots = voiceCallExtensionIds.map((id) => bundledPluginRoot(id));
export function isVoiceCallExtensionRoot(root) {
return voiceCallExtensionTestRoots.includes(root);
}

View File

@ -0,0 +1,27 @@
import { voiceCallExtensionTestRoots } from "./vitest.extension-voice-call-paths.mjs";
import { loadPatternListFromEnv } from "./vitest.pattern-file.ts";
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function loadIncludePatternsFromEnv(
env: Record<string, string | undefined> = process.env,
): string[] | null {
return loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env);
}
export function createExtensionVoiceCallVitestConfig(
env: Record<string, string | undefined> = process.env,
) {
return createScopedVitestConfig(
loadIncludePatternsFromEnv(env) ??
voiceCallExtensionTestRoots.map((root) => `${root}/**/*.test.ts`),
{
dir: "extensions",
env,
name: "extension-voice-call",
passWithNoTests: true,
setupFiles: ["test/setup.extensions.ts"],
},
);
}
export default createExtensionVoiceCallVitestConfig();

View File

@ -0,0 +1,9 @@
import { bundledPluginRoot } from "./scripts/lib/bundled-plugin-paths.mjs";
export const whatsAppExtensionIds = ["whatsapp"];
export const whatsAppExtensionTestRoots = whatsAppExtensionIds.map((id) => bundledPluginRoot(id));
export function isWhatsAppExtensionRoot(root) {
return whatsAppExtensionTestRoots.includes(root);
}

View File

@ -0,0 +1,27 @@
import { whatsAppExtensionTestRoots } from "./vitest.extension-whatsapp-paths.mjs";
import { loadPatternListFromEnv } from "./vitest.pattern-file.ts";
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function loadIncludePatternsFromEnv(
env: Record<string, string | undefined> = process.env,
): string[] | null {
return loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env);
}
export function createExtensionWhatsAppVitestConfig(
env: Record<string, string | undefined> = process.env,
) {
return createScopedVitestConfig(
loadIncludePatternsFromEnv(env) ??
whatsAppExtensionTestRoots.map((root) => `${root}/**/*.test.ts`),
{
dir: "extensions",
env,
name: "extension-whatsapp",
passWithNoTests: true,
setupFiles: ["test/setup.extensions.ts"],
},
);
}
export default createExtensionWhatsAppVitestConfig();

View File

@ -0,0 +1,5 @@
export const zaloExtensionTestRoots = ["extensions/zalo", "extensions/zalouser"];
export function isZaloExtensionRoot(root) {
return zaloExtensionTestRoots.includes(root);
}

View File

@ -0,0 +1,26 @@
import { zaloExtensionTestRoots } from "./vitest.extension-zalo-paths.mjs";
import { loadPatternListFromEnv } from "./vitest.pattern-file.ts";
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function loadIncludePatternsFromEnv(
env: Record<string, string | undefined> = process.env,
): string[] | null {
return loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env);
}
export function createExtensionZaloVitestConfig(
env: Record<string, string | undefined> = process.env,
) {
return createScopedVitestConfig(
loadIncludePatternsFromEnv(env) ?? zaloExtensionTestRoots.map((root) => `${root}/**/*.test.ts`),
{
dir: "extensions",
env,
name: "extension-zalo",
passWithNoTests: true,
setupFiles: ["test/setup.extensions.ts"],
},
);
}
export default createExtensionZaloVitestConfig();

View File

@ -4,12 +4,17 @@ import { acpxExtensionTestRoots } from "./vitest.extension-acpx-paths.mjs";
import { blueBubblesExtensionTestRoots } from "./vitest.extension-bluebubbles-paths.mjs";
import { diffsExtensionTestRoots } from "./vitest.extension-diffs-paths.mjs";
import { feishuExtensionTestRoots } from "./vitest.extension-feishu-paths.mjs";
import { ircExtensionTestRoots } from "./vitest.extension-irc-paths.mjs";
import { matrixExtensionTestRoots } from "./vitest.extension-matrix-paths.mjs";
import { mattermostExtensionTestRoots } from "./vitest.extension-mattermost-paths.mjs";
import { memoryExtensionTestRoots } from "./vitest.extension-memory-paths.mjs";
import { messagingExtensionTestRoots } from "./vitest.extension-messaging-paths.mjs";
import { msTeamsExtensionTestRoots } from "./vitest.extension-msteams-paths.mjs";
import { providerExtensionTestRoots } from "./vitest.extension-provider-paths.mjs";
import { telegramExtensionTestRoots } from "./vitest.extension-telegram-paths.mjs";
import { voiceCallExtensionTestRoots } from "./vitest.extension-voice-call-paths.mjs";
import { whatsAppExtensionTestRoots } from "./vitest.extension-whatsapp-paths.mjs";
import { zaloExtensionTestRoots } from "./vitest.extension-zalo-paths.mjs";
import { loadPatternListFromEnv } from "./vitest.pattern-file.ts";
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
@ -36,12 +41,17 @@ export function createExtensionsVitestConfig(
...blueBubblesExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...diffsExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...feishuExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...ircExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...matrixExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...mattermostExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...memoryExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...messagingExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...msTeamsExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...providerExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...telegramExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...voiceCallExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...whatsAppExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...zaloExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
],
});
}

12
vitest.logging.config.ts Normal file
View File

@ -0,0 +1,12 @@
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function createLoggingVitestConfig(env?: Record<string, string | undefined>) {
return createScopedVitestConfig(["src/logging/**/*.test.ts"], {
dir: "src",
env,
name: "logging",
passWithNoTests: true,
});
}
export default createLoggingVitestConfig();

12
vitest.process.config.ts Normal file
View File

@ -0,0 +1,12 @@
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function createProcessVitestConfig(env?: Record<string, string | undefined>) {
return createScopedVitestConfig(["src/process/**/*.test.ts"], {
dir: "src",
env,
name: "process",
passWithNoTests: true,
});
}
export default createProcessVitestConfig();

View File

@ -243,6 +243,10 @@ export const sharedVitestConfig = {
"vitest.extension-diffs.config.ts",
"vitest.extension-feishu-paths.mjs",
"vitest.extension-feishu.config.ts",
"vitest.extension-irc-paths.mjs",
"vitest.extension-irc.config.ts",
"vitest.extension-mattermost-paths.mjs",
"vitest.extension-mattermost.config.ts",
"vitest.extension-matrix-paths.mjs",
"vitest.extension-matrix.config.ts",
"vitest.extension-memory-paths.mjs",
@ -265,6 +269,7 @@ export const sharedVitestConfig = {
"vitest.tooling.config.ts",
"vitest.tui.config.ts",
"vitest.ui.config.ts",
"vitest.utils.config.ts",
"vitest.unit.config.ts",
"vitest.unit-paths.mjs",
"vitest.runtime-config.config.ts",
@ -273,8 +278,18 @@ export const sharedVitestConfig = {
"vitest.plugins.config.ts",
"vitest.extension-telegram-paths.mjs",
"vitest.extension-telegram.config.ts",
"vitest.extension-voice-call-paths.mjs",
"vitest.extension-voice-call.config.ts",
"vitest.extension-whatsapp-paths.mjs",
"vitest.extension-whatsapp.config.ts",
"vitest.extension-zalo-paths.mjs",
"vitest.extension-zalo.config.ts",
"vitest.extension-provider-paths.mjs",
"vitest.extension-providers.config.ts",
"vitest.logging.config.ts",
"vitest.process.config.ts",
"vitest.tasks.config.ts",
"vitest.wizard.config.ts",
],
include: [
"src/**/*.test.ts",

12
vitest.tasks.config.ts Normal file
View File

@ -0,0 +1,12 @@
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function createTasksVitestConfig(env?: Record<string, string | undefined>) {
return createScopedVitestConfig(["src/tasks/**/*.test.ts"], {
dir: "src",
env,
name: "tasks",
passWithNoTests: true,
});
}
export default createTasksVitestConfig();

View File

@ -56,10 +56,15 @@ export const unitTestAdditionalExcludePatterns = [
"src/media/**",
"src/plugin-sdk/**",
"src/plugins/**",
"src/process/**",
"src/secrets/**",
"src/shared/**",
"src/tasks/**",
"src/media-understanding/**",
"src/logging/**",
"src/tui/**",
"src/utils/**",
"src/wizard/**",
"src/plugins/contracts/**",
"src/scripts/**",
"src/infra/boundary-path.test.ts",

12
vitest.utils.config.ts Normal file
View File

@ -0,0 +1,12 @@
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function createUtilsVitestConfig(env?: Record<string, string | undefined>) {
return createScopedVitestConfig(["src/utils/**/*.test.ts"], {
dir: "src",
env,
name: "utils",
passWithNoTests: true,
});
}
export default createUtilsVitestConfig();

12
vitest.wizard.config.ts Normal file
View File

@ -0,0 +1,12 @@
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function createWizardVitestConfig(env?: Record<string, string | undefined>) {
return createScopedVitestConfig(["src/wizard/**/*.test.ts"], {
dir: "src",
env,
name: "wizard",
passWithNoTests: true,
});
}
export default createWizardVitestConfig();