test: trim test partial mocks

This commit is contained in:
Peter Steinberger
2026-04-03 19:10:46 +01:00
parent 5c4551458f
commit 13bc70397a
40 changed files with 206 additions and 144 deletions

View File

@@ -14,8 +14,8 @@ const runtimeApiMocks = vi.hoisted(() => ({
registerBrowserCli: vi.fn(),
}));
vi.mock("./runtime-api.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./runtime-api.js")>();
vi.mock("./runtime-api.js", async () => {
const actual = await vi.importActual<typeof import("./runtime-api.js")>("./runtime-api.js");
return {
...actual,
createBrowserPluginService: runtimeApiMocks.createBrowserPluginService,

View File

@@ -115,8 +115,10 @@ vi.mock("../../../src/agents/tools/gateway.js", () => gatewayMocks);
const configMocks = vi.hoisted(() => ({
loadConfig: vi.fn(() => ({ browser: {} })),
}));
vi.mock("openclaw/plugin-sdk/config-runtime", async (importOriginal) => {
const actual = await importOriginal<typeof import("openclaw/plugin-sdk/config-runtime")>();
vi.mock("openclaw/plugin-sdk/config-runtime", async () => {
const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/config-runtime")>(
"openclaw/plugin-sdk/config-runtime",
);
return {
...actual,
loadConfig: configMocks.loadConfig,

View File

@@ -1,25 +1,32 @@
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
vi.mock("node:child_process", async (importOriginal) => {
vi.mock("node:child_process", async () => {
const { mockNodeBuiltinModule } = await import("../../../../test/helpers/node-builtin-mocks.js");
return mockNodeBuiltinModule(importOriginal, {
execFileSync: vi.fn(),
});
return mockNodeBuiltinModule(
() => vi.importActual<typeof import("node:child_process")>("node:child_process"),
{
execFileSync: vi.fn(),
},
);
});
vi.mock("node:fs", async (importOriginal) => {
vi.mock("node:fs", async () => {
const { mockNodeBuiltinModule } = await import("../../../../test/helpers/node-builtin-mocks.js");
const existsSync = vi.fn();
const readFileSync = vi.fn();
return mockNodeBuiltinModule(
importOriginal,
() => vi.importActual<typeof import("node:fs")>("node:fs"),
{ existsSync, readFileSync },
{ mirrorToDefault: true },
);
});
vi.mock("node:os", async (importOriginal) => {
vi.mock("node:os", async () => {
const { mockNodeBuiltinModule } = await import("../../../../test/helpers/node-builtin-mocks.js");
const homedir = vi.fn();
return mockNodeBuiltinModule(importOriginal, { homedir }, { mirrorToDefault: true });
return mockNodeBuiltinModule(
() => vi.importActual<typeof import("node:os")>("node:os"),
{ homedir },
{ mirrorToDefault: true },
);
});
import { execFileSync } from "node:child_process";
import * as fs from "node:fs";

View File

@@ -22,8 +22,8 @@ const mocks = vi.hoisted(() => ({
dispatch: vi.fn(async (): Promise<BrowserDispatchResponse> => okDispatchResponse()),
}));
vi.mock("../config/config.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../config/config.js")>();
vi.mock("../config/config.js", async () => {
const actual = await vi.importActual<typeof import("../config/config.js")>("../config/config.js");
return {
...actual,
loadConfig: mocks.loadConfig,

View File

@@ -17,8 +17,8 @@ const mocks = vi.hoisted(() => ({
})),
}));
vi.mock("../config/config.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../config/config.js")>();
vi.mock("../config/config.js", async () => {
const actual = await vi.importActual<typeof import("../config/config.js")>("../config/config.js");
return {
...actual,
loadConfig: mocks.loadConfig,

View File

@@ -6,8 +6,8 @@ import { resolveOpenClawUserDataDir } from "./chrome.js";
import type { BrowserRouteContext, BrowserServerState } from "./server-context.js";
import { movePathToTrash } from "./trash.js";
vi.mock("../config/config.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../config/config.js")>();
vi.mock("../config/config.js", async () => {
const actual = await vi.importActual<typeof import("../config/config.js")>("../config/config.js");
return {
...actual,
loadConfig: vi.fn(),

View File

@@ -35,8 +35,8 @@ function buildConfig(): TestConfig {
};
}
vi.mock("../config/config.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../config/config.js")>();
vi.mock("../config/config.js", async () => {
const actual = await vi.importActual<typeof import("../config/config.js")>("../config/config.js");
return {
...actual,
createConfigIO: () => ({

View File

@@ -11,8 +11,8 @@ const mocks = vi.hoisted(() => ({
ensureExtensionRelayForProfiles: vi.fn(async () => {}),
}));
vi.mock("../config/config.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../config/config.js")>();
vi.mock("../config/config.js", async () => {
const actual = await vi.importActual<typeof import("../config/config.js")>("../config/config.js");
const browserConfig = {
enabled: true,
};
@@ -24,8 +24,8 @@ vi.mock("../config/config.js", async (importOriginal) => {
};
});
vi.mock("./config.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./config.js")>();
vi.mock("./config.js", async () => {
const actual = await vi.importActual<typeof import("./config.js")>("./config.js");
return {
...actual,
resolveBrowserConfig: vi.fn(() => ({

View File

@@ -225,8 +225,8 @@ function defaultProfilesForState(testPort: number): HarnessState["cfgProfiles"]
};
}
vi.mock("../config/config.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../config/config.js")>();
vi.mock("../config/config.js", async () => {
const actual = await vi.importActual<typeof import("../config/config.js")>("../config/config.js");
const loadConfig = () => {
return {
browser: {

View File

@@ -35,8 +35,8 @@ const routeCtxMocks = vi.hoisted(() => {
};
});
vi.mock("../config/config.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../config/config.js")>();
vi.mock("../config/config.js", async () => {
const actual = await vi.importActual<typeof import("../config/config.js")>("../config/config.js");
return {
...actual,
loadConfig: () => ({
@@ -57,8 +57,8 @@ vi.mock("./pw-ai-module.js", () => ({
getPwAiModule: vi.fn(async () => pwMocks),
}));
vi.mock("./server-context.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./server-context.js")>();
vi.mock("./server-context.js", async () => {
const actual = await vi.importActual<typeof import("./server-context.js")>("./server-context.js");
return {
...actual,
createBrowserRouteContext: routeCtxMocks.createBrowserRouteContext,

View File

@@ -8,8 +8,10 @@ const { loadConfigMock, isNodeCommandAllowedMock, resolveNodeCommandAllowlistMoc
}),
);
vi.mock("openclaw/plugin-sdk/config-runtime", async (importOriginal) => {
const actual = await importOriginal<typeof import("openclaw/plugin-sdk/config-runtime")>();
vi.mock("openclaw/plugin-sdk/config-runtime", async () => {
const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/config-runtime")>(
"openclaw/plugin-sdk/config-runtime",
);
return {
...actual,
loadConfig: loadConfigMock,

View File

@@ -57,8 +57,8 @@ const mockGatewayClientCtor = vi.hoisted(() => vi.fn());
const mockResolveGatewayConnectionAuth = vi.hoisted(() => vi.fn());
const mockCreateOperatorApprovalsGatewayClient = vi.hoisted(() => vi.fn());
vi.mock("../send.shared.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../send.shared.js")>();
vi.mock("../send.shared.js", async () => {
const actual = await vi.importActual<typeof import("../send.shared.js")>("../send.shared.js");
return {
...actual,
createDiscordClient: () => ({
@@ -72,8 +72,10 @@ vi.mock("../send.shared.js", async (importOriginal) => {
};
});
vi.mock("openclaw/plugin-sdk/config-runtime", async (importOriginal) => {
const actual = await importOriginal<typeof import("openclaw/plugin-sdk/config-runtime")>();
vi.mock("openclaw/plugin-sdk/config-runtime", async () => {
const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/config-runtime")>(
"openclaw/plugin-sdk/config-runtime",
);
return {
...actual,
loadSessionStore: () => mockSessionStoreEntries.value,
@@ -148,8 +150,10 @@ vi.mock("../../../../src/gateway/client.js", () => ({
},
}));
vi.mock("openclaw/plugin-sdk/text-runtime", async (importOriginal) => {
const actual = await importOriginal<typeof import("openclaw/plugin-sdk/text-runtime")>();
vi.mock("openclaw/plugin-sdk/text-runtime", async () => {
const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/text-runtime")>(
"openclaw/plugin-sdk/text-runtime",
);
return {
...actual,
logDebug: vi.fn(),

View File

@@ -3,8 +3,10 @@ const { recordInboundSessionMock } = vi.hoisted(() => ({
recordInboundSessionMock: vi.fn().mockResolvedValue(undefined),
}));
vi.mock("./bot-message-context.session.runtime.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./bot-message-context.session.runtime.js")>();
vi.mock("./bot-message-context.session.runtime.js", async () => {
const actual = await vi.importActual<typeof import("./bot-message-context.session.runtime.js")>(
"./bot-message-context.session.runtime.js",
);
return {
...actual,
recordInboundSession: (...args: unknown[]) => recordInboundSessionMock(...args),

View File

@@ -4,15 +4,18 @@ import { buildTelegramMessageContextForTest } from "./bot-message-context.test-h
const recordInboundSessionMock = vi.hoisted(() => vi.fn().mockResolvedValue(undefined));
const resolveTelegramConversationRouteMock = vi.hoisted(() => vi.fn());
vi.mock("./bot-message-context.session.runtime.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./bot-message-context.session.runtime.js")>();
vi.mock("./bot-message-context.session.runtime.js", async () => {
const actual = await vi.importActual<typeof import("./bot-message-context.session.runtime.js")>(
"./bot-message-context.session.runtime.js",
);
return {
...actual,
recordInboundSession: (...args: unknown[]) => recordInboundSessionMock(...args),
};
});
vi.mock("./conversation-route.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./conversation-route.js")>();
vi.mock("./conversation-route.js", async () => {
const actual =
await vi.importActual<typeof import("./conversation-route.js")>("./conversation-route.js");
return {
...actual,
resolveTelegramConversationRoute: (...args: unknown[]) =>

View File

@@ -1,8 +1,9 @@
import { describe, expect, it, vi, afterEach, beforeEach } from "vitest";
// Mock fetchWithSsrFGuard from the local runtime seam.
vi.mock("../../runtime-api.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../../runtime-api.js")>();
vi.mock("../../runtime-api.js", async () => {
const actual =
await vi.importActual<typeof import("../../runtime-api.js")>("../../runtime-api.js");
return {
...actual,
fetchWithSsrFGuard: vi.fn(),

View File

@@ -4,8 +4,8 @@ import { zalouserPlugin } from "./channel.js";
import { setZalouserRuntime } from "./runtime.js";
import { sendMessageZalouser, sendReactionZalouser } from "./send.js";
vi.mock("./send.js", async (importOriginal) => {
const actual = (await importOriginal()) as Record<string, unknown>;
vi.mock("./send.js", async () => {
const actual = (await vi.importActual("./send.js")) as Record<string, unknown>;
return {
...actual,
sendMessageZalouser: vi.fn(async () => ({ ok: true, messageId: "mid-1" })),

View File

@@ -10,8 +10,10 @@ const mocks = vi.hoisted(() => ({
runPreparedReply: vi.fn(),
}));
vi.mock("../agents/agent-scope.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../agents/agent-scope.js")>();
vi.mock("../agents/agent-scope.js", async () => {
const actual = await vi.importActual<typeof import("../agents/agent-scope.js")>(
"../agents/agent-scope.js",
);
return {
...actual,
resolveAgentDir: vi.fn(() => "/tmp/agent"),
@@ -20,8 +22,10 @@ vi.mock("../agents/agent-scope.js", async (importOriginal) => {
resolveAgentSkillsFilter: vi.fn(() => undefined),
};
});
vi.mock("../agents/model-selection.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../agents/model-selection.js")>();
vi.mock("../agents/model-selection.js", async () => {
const actual = await vi.importActual<typeof import("../agents/model-selection.js")>(
"../agents/model-selection.js",
);
return {
...actual,
resolveModelRefFromString: vi.fn(() => null),

View File

@@ -8,16 +8,18 @@ const hoisted = vi.hoisted(() => {
return { loadSessionStoreMock, scheduleFollowupDrainMock };
});
vi.mock("../../config/sessions.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../../config/sessions.js")>();
vi.mock("../../config/sessions.js", async () => {
const actual = await vi.importActual<typeof import("../../config/sessions.js")>(
"../../config/sessions.js",
);
return {
...actual,
loadSessionStore: (...args: unknown[]) => hoisted.loadSessionStoreMock(...args),
};
});
vi.mock("./queue.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./queue.js")>();
vi.mock("./queue.js", async () => {
const actual = await vi.importActual<typeof import("./queue.js")>("./queue.js");
return {
...actual,
scheduleFollowupDrain: (...args: unknown[]) => hoisted.scheduleFollowupDrainMock(...args),

View File

@@ -5,13 +5,17 @@ describe("get-reply module imports", () => {
it("does not load reset-model runtime on module import", async () => {
const resetModelRuntimeLoads = vi.fn();
const sandboxMediaRuntimeLoads = vi.fn();
vi.doMock("./session-reset-model.runtime.js", async (importOriginal) => {
vi.doMock("./session-reset-model.runtime.js", async () => {
resetModelRuntimeLoads();
return await importOriginal<typeof import("./session-reset-model.runtime.js")>();
return await vi.importActual<typeof import("./session-reset-model.runtime.js")>(
"./session-reset-model.runtime.js",
);
});
vi.doMock("./stage-sandbox-media.runtime.js", async (importOriginal) => {
vi.doMock("./stage-sandbox-media.runtime.js", async () => {
sandboxMediaRuntimeLoads();
return await importOriginal<typeof import("./stage-sandbox-media.runtime.js")>();
return await vi.importActual<typeof import("./stage-sandbox-media.runtime.js")>(
"./stage-sandbox-media.runtime.js",
);
});
await importFreshModule<typeof import("./get-reply.js")>(

View File

@@ -70,8 +70,9 @@ vi.mock("../daemon/program-args.js", () => ({
resolveGatewayProgramArguments: (opts: unknown) => resolveGatewayProgramArguments(opts),
}));
vi.mock("../daemon/service.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../daemon/service.js")>();
vi.mock("../daemon/service.js", async () => {
const actual =
await vi.importActual<typeof import("../daemon/service.js")>("../daemon/service.js");
return {
...actual,
resolveGatewayService: () => ({
@@ -104,8 +105,8 @@ vi.mock("../infra/ports.js", () => ({
formatPortDiagnostics: () => ["Port 18789 is already in use."],
}));
vi.mock("../runtime.js", async (importOriginal) => ({
...(await importOriginal<typeof import("../runtime.js")>()),
vi.mock("../runtime.js", async () => ({
...(await vi.importActual<typeof import("../runtime.js")>("../runtime.js")),
defaultRuntime: mocks.defaultRuntime,
}));

View File

@@ -74,8 +74,8 @@ vi.mock("../globals.js", () => ({
setVerbose: (enabled: boolean) => setVerbose(enabled),
}));
vi.mock("../runtime.js", async (importOriginal) => ({
...(await importOriginal<typeof import("../runtime.js")>()),
vi.mock("../runtime.js", async () => ({
...(await vi.importActual<typeof import("../runtime.js")>("../runtime.js")),
defaultRuntime: mocks.defaultRuntime,
}));
@@ -105,8 +105,10 @@ vi.mock("../daemon/program-args.js", () => ({
}),
}));
vi.mock("../infra/bonjour-discovery.js", async (importOriginal) => ({
...(await importOriginal<typeof import("../infra/bonjour-discovery.js")>()),
vi.mock("../infra/bonjour-discovery.js", async () => ({
...(await vi.importActual<typeof import("../infra/bonjour-discovery.js")>(
"../infra/bonjour-discovery.js",
)),
discoverGatewayBeacons: (opts: unknown) => discoverGatewayBeacons(opts),
}));

View File

@@ -22,8 +22,8 @@ const maybeRunCliInContainerMock = vi.hoisted(() =>
vi.fn((argv: string[]) => ({ handled: false, argv })),
);
vi.mock("node:fs", async (importOriginal) => {
const actual = await importOriginal<typeof import("node:fs")>();
vi.mock("node:fs", async () => {
const actual = await vi.importActual<typeof import("node:fs")>("node:fs");
type ExistsSyncPath = Parameters<typeof actual.existsSync>[0];
return {
...actual,
@@ -60,8 +60,9 @@ vi.mock("./windows-argv.js", () => ({
normalizeWindowsArgv: (argv: string[]) => argv,
}));
vi.mock("./container-target.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./container-target.js")>();
vi.mock("./container-target.js", async () => {
const actual =
await vi.importActual<typeof import("./container-target.js")>("./container-target.js");
return {
...actual,
maybeRunCliInContainer: maybeRunCliInContainerMock,

View File

@@ -132,8 +132,10 @@ vi.mock("../config/config.js", () => ({
resolveGatewayPort: mocks.resolveGatewayPort,
}));
vi.mock("../infra/bonjour-discovery.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../infra/bonjour-discovery.js")>();
vi.mock("../infra/bonjour-discovery.js", async () => {
const actual = await vi.importActual<typeof import("../infra/bonjour-discovery.js")>(
"../infra/bonjour-discovery.js",
);
return {
...actual,
discoverGatewayBeacons: mocks.discoverGatewayBeacons,

View File

@@ -27,16 +27,17 @@ const resolveStorePathMock = vi.hoisted(() =>
);
const loadSessionStoreMock = vi.hoisted(() => vi.fn(() => ({})));
vi.mock("../config/config.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../config/config.js")>();
vi.mock("../config/config.js", async () => {
const actual = await vi.importActual<typeof import("../config/config.js")>("../config/config.js");
return {
...actual,
loadConfig: loadConfigMock,
};
});
vi.mock("../config/sessions.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../config/sessions.js")>();
vi.mock("../config/sessions.js", async () => {
const actual =
await vi.importActual<typeof import("../config/sessions.js")>("../config/sessions.js");
return {
...actual,
resolveStorePath: resolveStorePathMock,

View File

@@ -59,8 +59,8 @@ async function makeStorePath() {
return { storePath, cleanup: async () => {} };
}
vi.mock("node:fs", async (importOriginal) => {
const actual = await importOriginal<typeof import("node:fs")>();
vi.mock("node:fs", async () => {
const actual = await vi.importActual<typeof import("node:fs")>("node:fs");
const pathMod = await import("node:path");
const absInMock = (p: string) => pathMod.resolve(p);
const isFixtureInMock = (p: string) => {
@@ -155,8 +155,8 @@ vi.mock("node:fs", async (importOriginal) => {
return { ...wrapped, default: wrapped };
});
vi.mock("node:fs/promises", async (importOriginal) => {
const actual = await importOriginal<typeof import("node:fs/promises")>();
vi.mock("node:fs/promises", async () => {
const actual = await vi.importActual<typeof import("node:fs/promises")>("node:fs/promises");
const wrapped = {
...actual,
mkdir: async (p: string, _opts?: unknown) => {

View File

@@ -10,8 +10,8 @@ const fsMocks = vi.hoisted(() => ({
realpath: vi.fn(),
}));
vi.mock("node:fs/promises", async (importOriginal) => {
const actual = await importOriginal<typeof import("node:fs/promises")>();
vi.mock("node:fs/promises", async () => {
const actual = await vi.importActual<typeof import("node:fs/promises")>("node:fs/promises");
return {
...actual,
default: {
@@ -24,8 +24,8 @@ vi.mock("node:fs/promises", async (importOriginal) => {
};
});
vi.mock("node:child_process", async (importOriginal) => {
const actual = await importOriginal<typeof import("node:child_process")>();
vi.mock("node:child_process", async () => {
const actual = await vi.importActual<typeof import("node:child_process")>("node:child_process");
return {
...actual,
execFileSync: childProcessMocks.execFileSync,

View File

@@ -92,8 +92,10 @@ vi.mock("ws", () => ({
WebSocket: MockWebSocket,
}));
vi.mock("../infra/device-auth-store.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../infra/device-auth-store.js")>();
vi.mock("../infra/device-auth-store.js", async () => {
const actual = await vi.importActual<typeof import("../infra/device-auth-store.js")>(
"../infra/device-auth-store.js",
);
return {
...actual,
loadDeviceAuthToken: (...args: unknown[]) => loadDeviceAuthTokenMock(...args),
@@ -102,8 +104,8 @@ vi.mock("../infra/device-auth-store.js", async (importOriginal) => {
};
});
vi.mock("../logger.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../logger.js")>();
vi.mock("../logger.js", async () => {
const actual = await vi.importActual<typeof import("../logger.js")>("../logger.js");
return {
...actual,
logDebug: (...args: unknown[]) => logDebugMock(...args),

View File

@@ -46,8 +46,9 @@ Sender labels:
example
<<<END_EXTERNAL_UNTRUSTED_CONTENT id="deadbeefdeadbeef">>>`;
vi.mock("../session-utils.js", async (importOriginal) => {
const original = await importOriginal<typeof import("../session-utils.js")>();
vi.mock("../session-utils.js", async () => {
const original =
await vi.importActual<typeof import("../session-utils.js")>("../session-utils.js");
return {
...original,
loadSessionEntry: (rawKey: string) => ({
@@ -116,8 +117,9 @@ vi.mock("../../sessions/transcript-events.js", () => ({
),
}));
vi.mock("../../media/store.js", async (importOriginal) => {
const original = await importOriginal<typeof import("../../media/store.js")>();
vi.mock("../../media/store.js", async () => {
const original =
await vi.importActual<typeof import("../../media/store.js")>("../../media/store.js");
return {
...original,
saveMediaBuffer: vi.fn(async (buffer: Buffer, contentType?: string, subdir?: string) => {

View File

@@ -9,8 +9,8 @@ const getLatestSubagentRunByChildSessionKeyMock = vi.fn();
const replaceSubagentRunAfterSteerMock = vi.fn();
const chatSendMock = vi.fn();
vi.mock("../session-utils.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../session-utils.js")>();
vi.mock("../session-utils.js", async () => {
const actual = await vi.importActual<typeof import("../session-utils.js")>("../session-utils.js");
return {
...actual,
loadSessionEntry: (...args: unknown[]) => loadSessionEntryMock(...args),
@@ -19,8 +19,10 @@ vi.mock("../session-utils.js", async (importOriginal) => {
};
});
vi.mock("../../agents/subagent-registry-read.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../../agents/subagent-registry-read.js")>();
vi.mock("../../agents/subagent-registry-read.js", async () => {
const actual = await vi.importActual<typeof import("../../agents/subagent-registry-read.js")>(
"../../agents/subagent-registry-read.js",
);
return {
...actual,
getLatestSubagentRunByChildSessionKey: (...args: unknown[]) =>

View File

@@ -32,16 +32,18 @@ vi.mock("../../config/sessions.js", () => ({
},
}));
vi.mock("../../infra/openclaw-root.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../../infra/openclaw-root.js")>();
vi.mock("../../infra/openclaw-root.js", async () => {
const actual = await vi.importActual<typeof import("../../infra/openclaw-root.js")>(
"../../infra/openclaw-root.js",
);
return {
...actual,
resolveOpenClawPackageRoot: async () => "/tmp/openclaw",
};
});
vi.mock("../../infra/restart-sentinel.js", async (importOriginal) => {
const actual = await importOriginal();
vi.mock("../../infra/restart-sentinel.js", async () => {
const actual = await vi.importActual("../../infra/restart-sentinel.js");
return {
...(actual as Record<string, unknown>),
writeRestartSentinel: async (payload: RestartSentinelPayload) => {

View File

@@ -7,17 +7,20 @@ const parseProcCmdlineMock = vi.hoisted(() => vi.fn());
const isGatewayArgvMock = vi.hoisted(() => vi.fn());
const findGatewayPidsOnPortSyncMock = vi.hoisted(() => vi.fn());
vi.mock("node:child_process", async (importOriginal) => {
const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js");
return mockNodeBuiltinModule(importOriginal, {
spawnSync: (...args: unknown[]) => spawnSyncMock(...args),
});
});
vi.mock("node:fs", async (importOriginal) => {
vi.mock("node:child_process", async () => {
const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js");
return mockNodeBuiltinModule(
importOriginal,
() => vi.importActual<typeof import("node:child_process")>("node:child_process"),
{
spawnSync: (...args: unknown[]) => spawnSyncMock(...args),
},
);
});
vi.mock("node:fs", async () => {
const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js");
return mockNodeBuiltinModule(
() => vi.importActual<typeof import("node:fs")>("node:fs"),
{
readFileSync: (...args: unknown[]) => readFileSyncMock(...args),
},

View File

@@ -160,8 +160,10 @@ const providerRuntimeMocks = vi.hoisted(() => ({
},
}));
vi.mock("../plugins/provider-runtime.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../plugins/provider-runtime.js")>();
vi.mock("../plugins/provider-runtime.js", async () => {
const actual = await vi.importActual<typeof import("../plugins/provider-runtime.js")>(
"../plugins/provider-runtime.js",
);
return {
...actual,
...providerRuntimeMocks.providerRuntimeMock,
@@ -169,8 +171,10 @@ vi.mock("../plugins/provider-runtime.js", async (importOriginal) => {
};
});
vi.mock("../plugins/provider-runtime.ts", async (importOriginal) => {
const actual = await importOriginal<typeof import("../plugins/provider-runtime.ts")>();
vi.mock("../plugins/provider-runtime.ts", async () => {
const actual = await vi.importActual<typeof import("../plugins/provider-runtime.ts")>(
"../plugins/provider-runtime.ts",
);
return {
...actual,
...providerRuntimeMocks.providerRuntimeMock,

View File

@@ -4,19 +4,22 @@ const spawnSyncMock = vi.hoisted(() => vi.fn());
const resolveLsofCommandSyncMock = vi.hoisted(() => vi.fn());
const resolveGatewayPortMock = vi.hoisted(() => vi.fn());
vi.mock("node:child_process", async (importOriginal) => {
vi.mock("node:child_process", async () => {
const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js");
return mockNodeBuiltinModule(importOriginal, {
spawnSync: (...args: unknown[]) => spawnSyncMock(...args),
});
return mockNodeBuiltinModule(
() => vi.importActual<typeof import("node:child_process")>("node:child_process"),
{
spawnSync: (...args: unknown[]) => spawnSyncMock(...args),
},
);
});
vi.mock("./ports-lsof.js", () => ({
resolveLsofCommandSync: (...args: unknown[]) => resolveLsofCommandSyncMock(...args),
}));
vi.mock("../config/paths.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../config/paths.js")>();
vi.mock("../config/paths.js", async () => {
const actual = await vi.importActual<typeof import("../config/paths.js")>("../config/paths.js");
return {
...actual,
resolveGatewayPort: (...args: unknown[]) => resolveGatewayPortMock(...args),

View File

@@ -4,16 +4,16 @@ import { captureEnv } from "../test-utils/env.js";
const readFileSyncMock = vi.hoisted(() => vi.fn());
const readFileMock = vi.hoisted(() => vi.fn());
vi.mock("node:fs", async (importOriginal) => {
const actual = await importOriginal<typeof import("node:fs")>();
vi.mock("node:fs", async () => {
const actual = await vi.importActual<typeof import("node:fs")>("node:fs");
return {
...actual,
readFileSync: readFileSyncMock,
};
});
vi.mock("node:fs/promises", async (importOriginal) => {
const actual = await importOriginal<typeof import("node:fs/promises")>();
vi.mock("node:fs/promises", async () => {
const actual = await vi.importActual<typeof import("node:fs/promises")>("node:fs/promises");
return {
...actual,
default: {

View File

@@ -29,16 +29,18 @@ const {
fetchMock,
} = hoisted;
vi.mock("@mariozechner/pi-ai", async (importOriginal) => {
const actual = await importOriginal<typeof import("@mariozechner/pi-ai")>();
vi.mock("@mariozechner/pi-ai", async () => {
const actual = await vi.importActual<typeof import("@mariozechner/pi-ai")>("@mariozechner/pi-ai");
return {
...actual,
complete: completeMock,
};
});
vi.mock("../agents/models-config.js", async (importOriginal) => ({
...(await importOriginal<typeof import("../agents/models-config.js")>()),
vi.mock("../agents/models-config.js", async () => ({
...(await vi.importActual<typeof import("../agents/models-config.js")>(
"../agents/models-config.js",
)),
ensureOpenClawModelsJson: ensureOpenClawModelsJsonMock,
}));

View File

@@ -9,8 +9,8 @@ import { withEnvAsync } from "../test-utils/env.js";
let MEDIA_DIR = "";
const cleanOldMedia = vi.fn().mockResolvedValue(undefined);
vi.mock("./store.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./store.js")>();
vi.mock("./store.js", async () => {
const actual = await vi.importActual<typeof import("./store.js")>("./store.js");
return {
...actual,
getMediaDir: () => MEDIA_DIR,

View File

@@ -14,19 +14,19 @@ vi.mock("./facade-runtime.js", () => ({
tryLoadActivatedBundledPluginPublicSurfaceModuleSync,
}));
vi.mock("node:fs/promises", async (importOriginal) => {
vi.mock("node:fs/promises", async () => {
const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js");
return mockNodeBuiltinModule(
importOriginal,
() => vi.importActual<typeof import("node:fs/promises")>("node:fs/promises"),
{ mkdir, access, rename },
{ mirrorToDefault: true },
);
});
vi.mock("node:os", async (importOriginal) => {
vi.mock("node:os", async () => {
const { mockNodeBuiltinModule } = await import("../../test/helpers/node-builtin-mocks.js");
return mockNodeBuiltinModule(
importOriginal,
() => vi.importActual<typeof import("node:os")>("node:os"),
{ homedir: () => "/home/test" },
{ mirrorToDefault: true },
);

View File

@@ -91,8 +91,9 @@ const pluginRuntimeState = vi.hoisted(
}) satisfies { registry: PluginRegistry },
);
vi.mock("../infra/home-dir.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../infra/home-dir.js")>();
vi.mock("../infra/home-dir.js", async () => {
const actual =
await vi.importActual<typeof import("../infra/home-dir.js")>("../infra/home-dir.js");
return {
...actual,
expandHomePrefix: (value: string) => {

View File

@@ -35,9 +35,10 @@ vi.mock("../plugins/web-search-providers.js", () => ({
resolveBundledPluginWebSearchProviders: resolveBundledPluginWebSearchProvidersMock,
}));
vi.mock("../plugins/web-search-providers.runtime.js", async (importOriginal) => {
const actual =
await importOriginal<typeof import("../plugins/web-search-providers.runtime.js")>();
vi.mock("../plugins/web-search-providers.runtime.js", async () => {
const actual = await vi.importActual<typeof import("../plugins/web-search-providers.runtime.js")>(
"../plugins/web-search-providers.runtime.js",
);
return {
...actual,
resolvePluginWebSearchProviders: resolvePluginWebSearchProvidersMock,
@@ -48,8 +49,10 @@ vi.mock("../plugins/web-fetch-providers.js", () => ({
resolveBundledPluginWebFetchProviders: resolveBundledPluginWebFetchProvidersMock,
}));
vi.mock("../plugins/web-fetch-providers.runtime.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../plugins/web-fetch-providers.runtime.js")>();
vi.mock("../plugins/web-fetch-providers.runtime.js", async () => {
const actual = await vi.importActual<typeof import("../plugins/web-fetch-providers.runtime.js")>(
"../plugins/web-fetch-providers.runtime.js",
);
return {
...actual,
resolvePluginWebFetchProviders: resolvePluginWebFetchProvidersMock,

View File

@@ -12,8 +12,8 @@ const { spawnSyncMock } = vi.hoisted(() => ({
spawnSyncMock: vi.fn(),
}));
vi.mock("node:child_process", async (importOriginal) => {
const actual = await importOriginal<typeof import("node:child_process")>();
vi.mock("node:child_process", async () => {
const actual = await vi.importActual<typeof import("node:child_process")>("node:child_process");
return {
...actual,
spawnSync: spawnSyncMock,