From e8a7cea1d9b961693f46a7fb7bcefc63bfe4a7fb Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 15 Mar 2026 10:44:25 -0700 Subject: [PATCH] Tests: preserve plugin tool exports in mocks --- .../openclaw-tools.plugin-context.test.ts | 10 +++++++--- src/agents/openclaw-tools.web-runtime.test.ts | 10 +++++++--- src/agents/pi-tools.safe-bins.test.ts | 12 ++++++++---- src/agents/test-helpers/fast-tool-stubs.ts | 12 ++++++++---- src/commands/agent.test.ts | 3 ++- .../server-methods/tools-catalog.test.ts | 18 +++++++++++------- .../tools-invoke-http.cron-regression.test.ts | 10 +++++++--- src/gateway/tools-invoke-http.test.ts | 10 +++++++--- 8 files changed, 57 insertions(+), 28 deletions(-) diff --git a/src/agents/openclaw-tools.plugin-context.test.ts b/src/agents/openclaw-tools.plugin-context.test.ts index 1cf9116a98e..67de58f35ff 100644 --- a/src/agents/openclaw-tools.plugin-context.test.ts +++ b/src/agents/openclaw-tools.plugin-context.test.ts @@ -7,9 +7,13 @@ const { resolvePluginToolsMock } = vi.hoisted(() => ({ }), })); -vi.mock("../plugins/tools.js", () => ({ - resolvePluginTools: resolvePluginToolsMock, -})); +vi.mock("../plugins/tools.js", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + resolvePluginTools: resolvePluginToolsMock, + }; +}); import { createOpenClawTools } from "./openclaw-tools.js"; diff --git a/src/agents/openclaw-tools.web-runtime.test.ts b/src/agents/openclaw-tools.web-runtime.test.ts index 94478930cf1..66dbc7fd4b4 100644 --- a/src/agents/openclaw-tools.web-runtime.test.ts +++ b/src/agents/openclaw-tools.web-runtime.test.ts @@ -8,9 +8,13 @@ import { import { withFetchPreconnect } from "../test-utils/fetch-mock.js"; import { createOpenClawTools } from "./openclaw-tools.js"; -vi.mock("../plugins/tools.js", () => ({ - resolvePluginTools: () => [], -})); +vi.mock("../plugins/tools.js", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + resolvePluginTools: () => [], + }; +}); function asConfig(value: unknown): OpenClawConfig { return value as OpenClawConfig; diff --git a/src/agents/pi-tools.safe-bins.test.ts b/src/agents/pi-tools.safe-bins.test.ts index b5585db5ec2..11b2bc1efbe 100644 --- a/src/agents/pi-tools.safe-bins.test.ts +++ b/src/agents/pi-tools.safe-bins.test.ts @@ -29,10 +29,14 @@ vi.mock("../infra/shell-env.js", async (importOriginal) => { }; }); -vi.mock("../plugins/tools.js", () => ({ - resolvePluginTools: () => [], - getPluginToolMeta: () => undefined, -})); +vi.mock("../plugins/tools.js", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + resolvePluginTools: () => [], + getPluginToolMeta: () => undefined, + }; +}); vi.mock("../infra/exec-approvals.js", async (importOriginal) => { const mod = await importOriginal(); diff --git a/src/agents/test-helpers/fast-tool-stubs.ts b/src/agents/test-helpers/fast-tool-stubs.ts index da29363b50f..114abb2144f 100644 --- a/src/agents/test-helpers/fast-tool-stubs.ts +++ b/src/agents/test-helpers/fast-tool-stubs.ts @@ -24,7 +24,11 @@ vi.mock("../tools/web-tools.js", () => ({ createWebFetchTool: () => null, })); -vi.mock("../../plugins/tools.js", () => ({ - resolvePluginTools: () => [], - getPluginToolMeta: () => undefined, -})); +vi.mock("../../plugins/tools.js", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + resolvePluginTools: () => [], + getPluginToolMeta: () => undefined, + }; +}); diff --git a/src/commands/agent.test.ts b/src/commands/agent.test.ts index 4a7714c04e8..9e3a8395bfa 100644 --- a/src/commands/agent.test.ts +++ b/src/commands/agent.test.ts @@ -7,6 +7,7 @@ import * as cliRunnerModule from "../agents/cli-runner.js"; import { FailoverError } from "../agents/failover-error.js"; import { loadModelCatalog } from "../agents/model-catalog.js"; import * as modelSelectionModule from "../agents/model-selection.js"; +import type { ClientToolDefinition } from "../agents/pi-embedded-runner/run/params.js"; import { runEmbeddedPiAgent } from "../agents/pi-embedded.js"; import * as commandSecretGatewayModule from "../cli/command-secret-gateway.js"; import type { OpenClawConfig } from "../config/config.js"; @@ -420,7 +421,7 @@ describe("agentCommand", () => { const store = path.join(home, "sessions.json"); mockConfig(home, store); const onPreflightPassed = vi.fn(); - const clientTools = [ + const clientTools: ClientToolDefinition[] = [ { type: "function", function: { diff --git a/src/gateway/server-methods/tools-catalog.test.ts b/src/gateway/server-methods/tools-catalog.test.ts index 70fcdcdf85e..40035f53282 100644 --- a/src/gateway/server-methods/tools-catalog.test.ts +++ b/src/gateway/server-methods/tools-catalog.test.ts @@ -15,13 +15,17 @@ vi.mock("../../agents/agent-scope.js", () => ({ const pluginToolMetaState = new Map(); -vi.mock("../../plugins/tools.js", () => ({ - resolvePluginTools: vi.fn(() => [ - { name: "voice_call", label: "voice_call", description: "Plugin calling tool" }, - { name: "matrix_room", label: "matrix_room", description: "Matrix room helper" }, - ]), - getPluginToolMeta: vi.fn((tool: { name: string }) => pluginToolMetaState.get(tool.name)), -})); +vi.mock("../../plugins/tools.js", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + resolvePluginTools: vi.fn(() => [ + { name: "voice_call", label: "voice_call", description: "Plugin calling tool" }, + { name: "matrix_room", label: "matrix_room", description: "Matrix room helper" }, + ]), + getPluginToolMeta: vi.fn((tool: { name: string }) => pluginToolMetaState.get(tool.name)), + }; +}); type RespondCall = [boolean, unknown?, { code: number; message: string }?]; diff --git a/src/gateway/tools-invoke-http.cron-regression.test.ts b/src/gateway/tools-invoke-http.cron-regression.test.ts index dfee9be2c20..3445cb096e3 100644 --- a/src/gateway/tools-invoke-http.cron-regression.test.ts +++ b/src/gateway/tools-invoke-http.cron-regression.test.ts @@ -30,9 +30,13 @@ vi.mock("../plugins/config-state.js", () => ({ isTestDefaultMemorySlotDisabled: disableDefaultMemorySlot, })); -vi.mock("../plugins/tools.js", () => ({ - getPluginToolMeta: noPluginToolMeta, -})); +vi.mock("../plugins/tools.js", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + getPluginToolMeta: noPluginToolMeta, + }; +}); vi.mock("../agents/openclaw-tools.js", () => { const tools = [ diff --git a/src/gateway/tools-invoke-http.test.ts b/src/gateway/tools-invoke-http.test.ts index f47e80a9bf6..16f179f716d 100644 --- a/src/gateway/tools-invoke-http.test.ts +++ b/src/gateway/tools-invoke-http.test.ts @@ -61,9 +61,13 @@ vi.mock("../plugins/config-state.js", () => ({ isTestDefaultMemorySlotDisabled: () => false, })); -vi.mock("../plugins/tools.js", () => ({ - getPluginToolMeta: () => undefined, -})); +vi.mock("../plugins/tools.js", async (importOriginal) => { + const mod = await importOriginal(); + return { + ...mod, + getPluginToolMeta: () => undefined, + }; +}); // Perf: the real tool factory instantiates many tools per request; for these HTTP // routing/policy tests we only need a small set of tool names.