diff --git a/scripts/lib/extension-test-plan.mjs b/scripts/lib/extension-test-plan.mjs index fd4fe636c46..8397ca8e0f0 100644 --- a/scripts/lib/extension-test-plan.mjs +++ b/scripts/lib/extension-test-plan.mjs @@ -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, diff --git a/scripts/test-projects.test-support.mjs b/scripts/test-projects.test-support.mjs index dc4b05f2fc8..bc569ba8bd0 100644 --- a/scripts/test-projects.test-support.mjs +++ b/scripts/test-projects.test-support.mjs @@ -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 diff --git a/src/scripts/test-projects.test.ts b/src/scripts/test-projects.test.ts index aaa294adb96..5540367d8c7 100644 --- a/src/scripts/test-projects.test.ts +++ b/src/scripts/test-projects.test.ts @@ -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([ { diff --git a/test/scripts/test-extension.test.ts b/test/scripts/test-extension.test.ts index f718a94baa2..3f6c9be86ee 100644 --- a/test/scripts/test-extension.test.ts +++ b/test/scripts/test-extension.test.ts @@ -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"], diff --git a/test/vitest-scoped-config.test.ts b/test/vitest-scoped-config.test.ts index 6bfd8c864ab..8265fe7f27e 100644 --- a/test/vitest-scoped-config.test.ts +++ b/test/vitest-scoped-config.test.ts @@ -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"]); + }); }); diff --git a/vitest.channel-paths.mjs b/vitest.channel-paths.mjs index e99ffd9ddd8..5e08e8e57a9 100644 --- a/vitest.channel-paths.mjs +++ b/vitest.channel-paths.mjs @@ -13,7 +13,6 @@ const extensionRoutedChannelTestFileSet = new Set(extensionRoutedChannelTestFile export const channelTestRoots = [ "src/channels", bundledPluginRoot("discord"), - bundledPluginRoot("whatsapp"), bundledPluginRoot("slack"), bundledPluginRoot("signal"), bundledPluginRoot("imessage"), diff --git a/vitest.config.ts b/vitest.config.ts index 9eac17abf8d..cec3e1c715a 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -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; diff --git a/vitest.extension-irc-paths.mjs b/vitest.extension-irc-paths.mjs new file mode 100644 index 00000000000..8ccb1daff33 --- /dev/null +++ b/vitest.extension-irc-paths.mjs @@ -0,0 +1,5 @@ +export const ircExtensionTestRoots = ["extensions/irc"]; + +export function isIrcExtensionRoot(root) { + return ircExtensionTestRoots.includes(root); +} diff --git a/vitest.extension-irc.config.ts b/vitest.extension-irc.config.ts new file mode 100644 index 00000000000..fca7e50ee69 --- /dev/null +++ b/vitest.extension-irc.config.ts @@ -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 = process.env, +): string[] | null { + return loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env); +} + +export function createExtensionIrcVitestConfig( + env: Record = 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(); diff --git a/vitest.extension-mattermost-paths.mjs b/vitest.extension-mattermost-paths.mjs new file mode 100644 index 00000000000..d4dcd4cdb2e --- /dev/null +++ b/vitest.extension-mattermost-paths.mjs @@ -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); +} diff --git a/vitest.extension-mattermost.config.ts b/vitest.extension-mattermost.config.ts new file mode 100644 index 00000000000..7e1e0d95a4a --- /dev/null +++ b/vitest.extension-mattermost.config.ts @@ -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 = process.env, +): string[] | null { + return loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env); +} + +export function createExtensionMattermostVitestConfig( + env: Record = 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(); diff --git a/vitest.extension-messaging-paths.mjs b/vitest.extension-messaging-paths.mjs index 6099b1b6061..838a01eeff0 100644 --- a/vitest.extension-messaging-paths.mjs +++ b/vitest.extension-messaging-paths.mjs @@ -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)); diff --git a/vitest.extension-voice-call-paths.mjs b/vitest.extension-voice-call-paths.mjs new file mode 100644 index 00000000000..a10542aa35b --- /dev/null +++ b/vitest.extension-voice-call-paths.mjs @@ -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); +} diff --git a/vitest.extension-voice-call.config.ts b/vitest.extension-voice-call.config.ts new file mode 100644 index 00000000000..cfc6a1685cd --- /dev/null +++ b/vitest.extension-voice-call.config.ts @@ -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 = process.env, +): string[] | null { + return loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env); +} + +export function createExtensionVoiceCallVitestConfig( + env: Record = 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(); diff --git a/vitest.extension-whatsapp-paths.mjs b/vitest.extension-whatsapp-paths.mjs new file mode 100644 index 00000000000..b82b7b463d1 --- /dev/null +++ b/vitest.extension-whatsapp-paths.mjs @@ -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); +} diff --git a/vitest.extension-whatsapp.config.ts b/vitest.extension-whatsapp.config.ts new file mode 100644 index 00000000000..85a1bb468f5 --- /dev/null +++ b/vitest.extension-whatsapp.config.ts @@ -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 = process.env, +): string[] | null { + return loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env); +} + +export function createExtensionWhatsAppVitestConfig( + env: Record = 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(); diff --git a/vitest.extension-zalo-paths.mjs b/vitest.extension-zalo-paths.mjs new file mode 100644 index 00000000000..1a0893567e5 --- /dev/null +++ b/vitest.extension-zalo-paths.mjs @@ -0,0 +1,5 @@ +export const zaloExtensionTestRoots = ["extensions/zalo", "extensions/zalouser"]; + +export function isZaloExtensionRoot(root) { + return zaloExtensionTestRoots.includes(root); +} diff --git a/vitest.extension-zalo.config.ts b/vitest.extension-zalo.config.ts new file mode 100644 index 00000000000..9745aff07fe --- /dev/null +++ b/vitest.extension-zalo.config.ts @@ -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 = process.env, +): string[] | null { + return loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env); +} + +export function createExtensionZaloVitestConfig( + env: Record = 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(); diff --git a/vitest.extensions.config.ts b/vitest.extensions.config.ts index 5df8ead5090..876cb5b37ed 100644 --- a/vitest.extensions.config.ts +++ b/vitest.extensions.config.ts @@ -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, "")}/**`), ], }); } diff --git a/vitest.logging.config.ts b/vitest.logging.config.ts new file mode 100644 index 00000000000..5b68127a5f0 --- /dev/null +++ b/vitest.logging.config.ts @@ -0,0 +1,12 @@ +import { createScopedVitestConfig } from "./vitest.scoped-config.ts"; + +export function createLoggingVitestConfig(env?: Record) { + return createScopedVitestConfig(["src/logging/**/*.test.ts"], { + dir: "src", + env, + name: "logging", + passWithNoTests: true, + }); +} + +export default createLoggingVitestConfig(); diff --git a/vitest.process.config.ts b/vitest.process.config.ts new file mode 100644 index 00000000000..9aa88ec4fa3 --- /dev/null +++ b/vitest.process.config.ts @@ -0,0 +1,12 @@ +import { createScopedVitestConfig } from "./vitest.scoped-config.ts"; + +export function createProcessVitestConfig(env?: Record) { + return createScopedVitestConfig(["src/process/**/*.test.ts"], { + dir: "src", + env, + name: "process", + passWithNoTests: true, + }); +} + +export default createProcessVitestConfig(); diff --git a/vitest.shared.config.ts b/vitest.shared.config.ts index 710d10c9c35..e64fb779523 100644 --- a/vitest.shared.config.ts +++ b/vitest.shared.config.ts @@ -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", diff --git a/vitest.tasks.config.ts b/vitest.tasks.config.ts new file mode 100644 index 00000000000..177faaf17df --- /dev/null +++ b/vitest.tasks.config.ts @@ -0,0 +1,12 @@ +import { createScopedVitestConfig } from "./vitest.scoped-config.ts"; + +export function createTasksVitestConfig(env?: Record) { + return createScopedVitestConfig(["src/tasks/**/*.test.ts"], { + dir: "src", + env, + name: "tasks", + passWithNoTests: true, + }); +} + +export default createTasksVitestConfig(); diff --git a/vitest.unit-paths.mjs b/vitest.unit-paths.mjs index afa77e409a2..3df3ca604e7 100644 --- a/vitest.unit-paths.mjs +++ b/vitest.unit-paths.mjs @@ -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", diff --git a/vitest.utils.config.ts b/vitest.utils.config.ts new file mode 100644 index 00000000000..c0bbc54f367 --- /dev/null +++ b/vitest.utils.config.ts @@ -0,0 +1,12 @@ +import { createScopedVitestConfig } from "./vitest.scoped-config.ts"; + +export function createUtilsVitestConfig(env?: Record) { + return createScopedVitestConfig(["src/utils/**/*.test.ts"], { + dir: "src", + env, + name: "utils", + passWithNoTests: true, + }); +} + +export default createUtilsVitestConfig(); diff --git a/vitest.wizard.config.ts b/vitest.wizard.config.ts new file mode 100644 index 00000000000..9af10e1e2bc --- /dev/null +++ b/vitest.wizard.config.ts @@ -0,0 +1,12 @@ +import { createScopedVitestConfig } from "./vitest.scoped-config.ts"; + +export function createWizardVitestConfig(env?: Record) { + return createScopedVitestConfig(["src/wizard/**/*.test.ts"], { + dir: "src", + env, + name: "wizard", + passWithNoTests: true, + }); +} + +export default createWizardVitestConfig();