From 6eca4e01364f19dac4a3aa9f4dc1fb46686c5bff Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 3 Apr 2026 19:27:52 +0100 Subject: [PATCH] test: trim extension partial mocks --- extensions/discord/src/client.proxy.test.ts | 6 ++++-- .../native-command.plugin-dispatch.test.ts | 12 ++++++++---- .../src/monitor/reply-delivery.test.ts | 10 ++++++---- .../discord/src/send.webhook-activity.test.ts | 12 ++++++++---- extensions/discord/src/voice-message.test.ts | 4 ++-- .../discord/src/voice/manager.e2e.test.ts | 12 ++++++++---- extensions/feishu/src/bot.test.ts | 6 ++++-- extensions/googlechat/src/actions.test.ts | 4 ++-- extensions/googlechat/src/targets.test.ts | 4 ++-- extensions/imessage/src/targets.test.ts | 4 ++-- extensions/irc/src/send.test.ts | 14 ++++++++++---- extensions/line/src/bot-handlers.test.ts | 12 ++++++++---- extensions/line/src/send.test.ts | 6 ++++-- .../src/memory/qmd-manager.test.ts | 10 ++++++---- extensions/slack/src/blocks.test-helpers.ts | 10 ++++++---- .../slack/src/monitor/events/messages.test.ts | 14 ++++++++------ .../bot-native-commands.session-meta.test.ts | 12 ++++++++---- extensions/telegram/src/doctor.test.ts | 19 +++++++++++-------- extensions/telegram/src/monitor.test.ts | 8 +++++--- .../src/auto-reply/deliver-reply.test.ts | 12 ++++++++---- 20 files changed, 120 insertions(+), 71 deletions(-) diff --git a/extensions/discord/src/client.proxy.test.ts b/extensions/discord/src/client.proxy.test.ts index 4d83539344d..e8833cb19c3 100644 --- a/extensions/discord/src/client.proxy.test.ts +++ b/extensions/discord/src/client.proxy.test.ts @@ -4,8 +4,10 @@ import { createDiscordRestClient } from "./client.js"; const makeProxyFetchMock = vi.hoisted(() => vi.fn()); -vi.mock("openclaw/plugin-sdk/infra-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/infra-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/infra-runtime", + ); makeProxyFetchMock.mockImplementation((proxyUrl: string) => { if (proxyUrl === "bad-proxy") { throw new Error("bad proxy"); diff --git a/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts b/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts index fcb356c1932..bee1714fb0a 100644 --- a/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts +++ b/extensions/discord/src/monitor/native-command.plugin-dispatch.test.ts @@ -21,8 +21,10 @@ const runtimeModuleMocks = vi.hoisted(() => ({ dispatchReplyWithDispatcher: vi.fn(), })); -vi.mock("openclaw/plugin-sdk/plugin-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/plugin-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/plugin-runtime", + ); return { ...actual, matchPluginCommand: (...args: unknown[]) => runtimeModuleMocks.matchPluginCommand(...args), @@ -30,8 +32,10 @@ vi.mock("openclaw/plugin-sdk/plugin-runtime", async (importOriginal) => { }; }); -vi.mock("openclaw/plugin-sdk/reply-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/reply-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/reply-runtime", + ); return { ...actual, dispatchReplyWithDispatcher: (...args: unknown[]) => diff --git a/extensions/discord/src/monitor/reply-delivery.test.ts b/extensions/discord/src/monitor/reply-delivery.test.ts index 004abc31095..1d056e8db6e 100644 --- a/extensions/discord/src/monitor/reply-delivery.test.ts +++ b/extensions/discord/src/monitor/reply-delivery.test.ts @@ -36,8 +36,8 @@ const retryAsyncMock = vi.hoisted(() => ), ); -vi.mock("../send.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../send.js", async () => { + const actual = await vi.importActual("../send.js"); return { ...actual, sendMessageDiscord: (...args: unknown[]) => sendMessageDiscordMock(...args), @@ -50,8 +50,10 @@ vi.mock("../send.shared.js", () => ({ sendDiscordText: (...args: unknown[]) => sendDiscordTextMock(...args), })); -vi.mock("openclaw/plugin-sdk/retry-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/retry-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/retry-runtime", + ); return { ...actual, retryAsync: retryAsyncMock, diff --git a/extensions/discord/src/send.webhook-activity.test.ts b/extensions/discord/src/send.webhook-activity.test.ts index 03fd2130387..8d0d7bb5d0f 100644 --- a/extensions/discord/src/send.webhook-activity.test.ts +++ b/extensions/discord/src/send.webhook-activity.test.ts @@ -3,16 +3,20 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite const recordChannelActivityMock = vi.hoisted(() => vi.fn()); const loadConfigMock = vi.hoisted(() => vi.fn(() => ({ channels: { discord: {} } }))); -vi.mock("openclaw/plugin-sdk/config-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/config-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/config-runtime", + ); return { ...actual, loadConfig: () => loadConfigMock(), }; }); -vi.mock("../../../src/infra/channel-activity.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../../../src/infra/channel-activity.js", async () => { + const actual = await vi.importActual( + "../../../src/infra/channel-activity.js", + ); return { ...actual, recordChannelActivity: (...args: unknown[]) => recordChannelActivityMock(...args), diff --git a/extensions/discord/src/voice-message.test.ts b/extensions/discord/src/voice-message.test.ts index 0bd40be2375..23098fcf905 100644 --- a/extensions/discord/src/voice-message.test.ts +++ b/extensions/discord/src/voice-message.test.ts @@ -3,13 +3,13 @@ import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const runFfprobeMock = vi.hoisted(() => vi.fn<(...args: unknown[]) => Promise>()); const runFfmpegMock = vi.hoisted(() => vi.fn<(...args: unknown[]) => Promise>()); -vi.mock("openclaw/plugin-sdk/temp-path", async (importOriginal) => { +vi.mock("openclaw/plugin-sdk/temp-path", async () => { return { resolvePreferredOpenClawTmpDir: () => "/tmp", }; }); -vi.mock("openclaw/plugin-sdk/media-runtime", async (importOriginal) => { +vi.mock("openclaw/plugin-sdk/media-runtime", async () => { return { runFfprobe: runFfprobeMock, runFfmpeg: runFfmpegMock, diff --git a/extensions/discord/src/voice/manager.e2e.test.ts b/extensions/discord/src/voice/manager.e2e.test.ts index fa5cb815588..2456921e3cb 100644 --- a/extensions/discord/src/voice/manager.e2e.test.ts +++ b/extensions/discord/src/voice/manager.e2e.test.ts @@ -87,16 +87,20 @@ vi.mock("./sdk-runtime.js", () => ({ }), })); -vi.mock("openclaw/plugin-sdk/routing", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/routing", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/routing", + ); return { ...actual, resolveAgentRoute: resolveAgentRouteMock, }; }); -vi.mock("openclaw/plugin-sdk/agent-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/agent-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/agent-runtime", + ); return { ...actual, agentCommandFromIngress: agentCommandMock, diff --git a/extensions/feishu/src/bot.test.ts b/extensions/feishu/src/bot.test.ts index 738468bf301..3581bb3358e 100644 --- a/extensions/feishu/src/bot.test.ts +++ b/extensions/feishu/src/bot.test.ts @@ -289,8 +289,10 @@ vi.mock("./client.js", () => ({ createFeishuClient: mockCreateFeishuClient, })); -vi.mock("openclaw/plugin-sdk/conversation-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/conversation-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/conversation-runtime", + ); return { ...actual, resolveConfiguredBindingRoute: (params: unknown) => diff --git a/extensions/googlechat/src/actions.test.ts b/extensions/googlechat/src/actions.test.ts index 419958c7e2f..07a8293cf82 100644 --- a/extensions/googlechat/src/actions.test.ts +++ b/extensions/googlechat/src/actions.test.ts @@ -32,8 +32,8 @@ vi.mock("./targets.js", () => ({ resolveGoogleChatOutboundSpace, })); -vi.mock("../runtime-api.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("../runtime-api.js", async () => { + const actual = await vi.importActual("../runtime-api.js"); return { ...actual, loadOutboundMediaFromUrl: (...args: Parameters) => diff --git a/extensions/googlechat/src/targets.test.ts b/extensions/googlechat/src/targets.test.ts index 363520b9c21..0d836fc1b01 100644 --- a/extensions/googlechat/src/targets.test.ts +++ b/extensions/googlechat/src/targets.test.ts @@ -21,8 +21,8 @@ vi.mock("google-auth-library", () => ({ }, })); -vi.mock("./auth.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./auth.js", async () => { + const actual = await vi.importActual("./auth.js"); return { ...actual, getGoogleChatAccessToken: mocks.getGoogleChatAccessToken, diff --git a/extensions/imessage/src/targets.test.ts b/extensions/imessage/src/targets.test.ts index 5eda105a54e..fd46786e15e 100644 --- a/extensions/imessage/src/targets.test.ts +++ b/extensions/imessage/src/targets.test.ts @@ -25,8 +25,8 @@ const getIMessageSetupStatus = createPluginSetupWizardStatus(imessagePlugin); const spawnMock = vi.hoisted(() => vi.fn()); -vi.mock("node:child_process", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("node:child_process", async () => { + const actual = await vi.importActual("node:child_process"); return { ...actual, spawn: (...args: unknown[]) => spawnMock(...args), diff --git a/extensions/irc/src/send.test.ts b/extensions/irc/src/send.test.ts index 3474d34b602..46f499325a5 100644 --- a/extensions/irc/src/send.test.ts +++ b/extensions/irc/src/send.test.ts @@ -40,16 +40,22 @@ vi.mock("./protocol.js", async () => { }; }); -vi.mock("openclaw/plugin-sdk/config-runtime", async (importOriginal) => { - const original = (await importOriginal()) as Record; +vi.mock("openclaw/plugin-sdk/config-runtime", async () => { + const original = (await vi.importActual("openclaw/plugin-sdk/config-runtime")) as Record< + string, + unknown + >; return { ...original, resolveMarkdownTableMode: hoisted.resolveMarkdownTableMode, }; }); -vi.mock("openclaw/plugin-sdk/text-runtime", async (importOriginal) => { - const original = (await importOriginal()) as Record; +vi.mock("openclaw/plugin-sdk/text-runtime", async () => { + const original = (await vi.importActual("openclaw/plugin-sdk/text-runtime")) as Record< + string, + unknown + >; return { ...original, convertMarkdownTables: hoisted.convertMarkdownTables, diff --git a/extensions/line/src/bot-handlers.test.ts b/extensions/line/src/bot-handlers.test.ts index df9533b36bf..8713cf28400 100644 --- a/extensions/line/src/bot-handlers.test.ts +++ b/extensions/line/src/bot-handlers.test.ts @@ -5,8 +5,10 @@ import type { LineAccountConfig } from "./types.js"; // Avoid pulling in globals/pairing/media dependencies; this suite only asserts // allowlist/groupPolicy gating and message-context wiring. -vi.mock("openclaw/plugin-sdk/runtime-env", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/runtime-env", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/runtime-env", + ); return { ...actual, danger: (text: string) => text, @@ -20,8 +22,10 @@ const { readAllowFromStoreMock, upsertPairingRequestMock } = vi.hoisted(() => ({ upsertPairingRequestMock: vi.fn(async () => ({ code: "CODE", created: true })), })); -vi.mock("openclaw/plugin-sdk/conversation-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/conversation-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/conversation-runtime", + ); return { ...actual, resolvePairingIdLabel: () => "lineUserId", diff --git a/extensions/line/src/send.test.ts b/extensions/line/src/send.test.ts index 26e003f95aa..ce9511d33e6 100644 --- a/extensions/line/src/send.test.ts +++ b/extensions/line/src/send.test.ts @@ -63,8 +63,10 @@ vi.mock("openclaw/plugin-sdk/infra-runtime", () => ({ recordChannelActivity: recordChannelActivityMock, })); -vi.mock("openclaw/plugin-sdk/runtime-env", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/runtime-env", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/runtime-env", + ); return { ...actual, logVerbose: logVerboseMock, diff --git a/extensions/memory-core/src/memory/qmd-manager.test.ts b/extensions/memory-core/src/memory/qmd-manager.test.ts index 9cbbf297207..854248fa73b 100644 --- a/extensions/memory-core/src/memory/qmd-manager.test.ts +++ b/extensions/memory-core/src/memory/qmd-manager.test.ts @@ -99,8 +99,8 @@ vi.mock("openclaw/plugin-sdk/memory-core-host-engine-foundation", async () => { }; }); -vi.mock("node:child_process", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("node:child_process", async () => { + const actual = await vi.importActual("node:child_process"); return { ...actual, spawn: vi.fn(), @@ -112,8 +112,10 @@ vi.mock("chokidar", () => ({ watch: watchMock, })); -vi.mock("openclaw/plugin-sdk/file-lock", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/file-lock", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/file-lock", + ); return { ...actual, withFileLock: withFileLockMock, diff --git a/extensions/slack/src/blocks.test-helpers.ts b/extensions/slack/src/blocks.test-helpers.ts index ae5c92818d1..b2028a2b04b 100644 --- a/extensions/slack/src/blocks.test-helpers.ts +++ b/extensions/slack/src/blocks.test-helpers.ts @@ -26,16 +26,18 @@ const slackBlockTestState = vi.hoisted(() => ({ config: {}, })); -vi.mock("openclaw/plugin-sdk/config-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/config-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/config-runtime", + ); return { ...actual, loadConfig: () => slackBlockTestState.config, }; }); -vi.mock("./accounts.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./accounts.js", async () => { + const actual = await vi.importActual("./accounts.js"); return { ...actual, resolveSlackAccount: () => slackBlockTestState.account, diff --git a/extensions/slack/src/monitor/events/messages.test.ts b/extensions/slack/src/monitor/events/messages.test.ts index 949fd1db5d8..a3479cfaa8d 100644 --- a/extensions/slack/src/monitor/events/messages.test.ts +++ b/extensions/slack/src/monitor/events/messages.test.ts @@ -7,10 +7,10 @@ import { const messageQueueMock = vi.fn(); const messageAllowMock = vi.fn(); -async function createChannelRuntimeMock( - importOriginal: () => Promise, -) { - const actual = await importOriginal(); +async function createChannelRuntimeMock() { + const actual = await vi.importActual( + "openclaw/plugin-sdk/infra-runtime", + ); return { ...actual, enqueueSystemEvent: (...args: unknown[]) => messageQueueMock(...args), @@ -20,8 +20,10 @@ async function createChannelRuntimeMock( vi.mock("openclaw/plugin-sdk/infra-runtime", createChannelRuntimeMock); vi.mock("openclaw/plugin-sdk/infra-runtime.js", createChannelRuntimeMock); -vi.mock("openclaw/plugin-sdk/conversation-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/conversation-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/conversation-runtime", + ); return { ...actual, readChannelAllowFromStore: (...args: unknown[]) => messageAllowMock(...args), diff --git a/extensions/telegram/src/bot-native-commands.session-meta.test.ts b/extensions/telegram/src/bot-native-commands.session-meta.test.ts index 6c9288e98a3..9f22092fe0d 100644 --- a/extensions/telegram/src/bot-native-commands.session-meta.test.ts +++ b/extensions/telegram/src/bot-native-commands.session-meta.test.ts @@ -64,8 +64,10 @@ const conversationStoreMocks = vi.hoisted(() => ({ upsertChannelPairingRequest: vi.fn(async () => ({ code: "PAIRCODE", created: true })), })); -vi.mock("openclaw/plugin-sdk/conversation-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/conversation-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/conversation-runtime", + ); return { ...actual, resolveConfiguredBindingRoute: persistentBindingMocks.resolveConfiguredBindingRoute, @@ -104,8 +106,10 @@ vi.mock("openclaw/plugin-sdk/conversation-runtime", async (importOriginal) => { }), }; }); -vi.mock("./bot-native-commands.runtime.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./bot-native-commands.runtime.js", async () => { + const actual = await vi.importActual( + "./bot-native-commands.runtime.js", + ); return { ...actual, finalizeInboundContext: vi.fn((ctx: unknown) => ctx), diff --git a/extensions/telegram/src/doctor.test.ts b/extensions/telegram/src/doctor.test.ts index 7a69a97d0ff..f8293e2fc83 100644 --- a/extensions/telegram/src/doctor.test.ts +++ b/extensions/telegram/src/doctor.test.ts @@ -13,32 +13,35 @@ const listTelegramAccountIdsMock = vi.hoisted(() => vi.fn()); const inspectTelegramAccountMock = vi.hoisted(() => vi.fn()); const lookupTelegramChatIdMock = vi.hoisted(() => vi.fn()); -vi.mock("openclaw/plugin-sdk/runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/runtime", + ); return { ...actual, resolveCommandSecretRefsViaGateway: resolveCommandSecretRefsViaGatewayMock, }; }); -vi.mock("./accounts.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./accounts.js", async () => { + const actual = await vi.importActual("./accounts.js"); return { ...actual, listTelegramAccountIds: listTelegramAccountIdsMock, }; }); -vi.mock("./account-inspect.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./account-inspect.js", async () => { + const actual = + await vi.importActual("./account-inspect.js"); return { ...actual, inspectTelegramAccount: inspectTelegramAccountMock, }; }); -vi.mock("./api-fetch.js", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("./api-fetch.js", async () => { + const actual = await vi.importActual("./api-fetch.js"); return { ...actual, lookupTelegramChatId: lookupTelegramChatIdMock, diff --git a/extensions/telegram/src/monitor.test.ts b/extensions/telegram/src/monitor.test.ts index 097215fb829..a00aff43cfc 100644 --- a/extensions/telegram/src/monitor.test.ts +++ b/extensions/telegram/src/monitor.test.ts @@ -261,7 +261,7 @@ async function monitorWithAutoAbort(opts: Omit { +vi.mock("openclaw/plugin-sdk/config-runtime", async () => { return { loadConfig, resolveAgentMaxConcurrent: (cfg: { agents?: { defaults?: { maxConcurrent?: number } } }) => @@ -306,8 +306,10 @@ vi.mock("@grammyjs/runner", () => ({ run: runSpy, })); -vi.mock("openclaw/plugin-sdk/runtime-env", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/runtime-env", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/runtime-env", + ); return { ...actual, computeBackoff, diff --git a/extensions/whatsapp/src/auto-reply/deliver-reply.test.ts b/extensions/whatsapp/src/auto-reply/deliver-reply.test.ts index 061669e6bd2..b500416b4c3 100644 --- a/extensions/whatsapp/src/auto-reply/deliver-reply.test.ts +++ b/extensions/whatsapp/src/auto-reply/deliver-reply.test.ts @@ -4,8 +4,10 @@ import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { loadWebMedia } from "../media.js"; import type { WebInboundMsg } from "./types.js"; -vi.mock("openclaw/plugin-sdk/runtime-env", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/runtime-env", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/runtime-env", + ); return { ...actual, shouldLogVerbose: vi.fn(() => true), @@ -13,8 +15,10 @@ vi.mock("openclaw/plugin-sdk/runtime-env", async (importOriginal) => { }; }); -vi.mock("openclaw/plugin-sdk/text-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/text-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/text-runtime", + ); return { ...actual, sleep: vi.fn(async () => {}),