test: trim core partial mocks

This commit is contained in:
Peter Steinberger 2026-04-03 19:28:04 +01:00
parent 6eca4e0136
commit 45a6f769bb
No known key found for this signature in database
25 changed files with 132 additions and 92 deletions

View File

@ -13,8 +13,9 @@ const hoisted = vi.hoisted(() => {
};
});
vi.mock("@mariozechner/pi-ai", async (importOriginal) => {
const original = await importOriginal<typeof import("@mariozechner/pi-ai")>();
vi.mock("@mariozechner/pi-ai", async () => {
const original =
await vi.importActual<typeof import("@mariozechner/pi-ai")>("@mariozechner/pi-ai");
return {
...original,
streamAnthropic: (model: unknown, context: unknown, options: unknown) =>
@ -34,8 +35,9 @@ let createAnthropicVertexStreamFnForModel: typeof import("./anthropic-vertex-str
async function loadFreshAnthropicVertexStreamModuleForTest() {
vi.resetModules();
vi.doMock("@mariozechner/pi-ai", async (importOriginal) => {
const original = await importOriginal<typeof import("@mariozechner/pi-ai")>();
vi.doMock("@mariozechner/pi-ai", async () => {
const original =
await vi.importActual<typeof import("@mariozechner/pi-ai")>("@mariozechner/pi-ai");
return {
...original,
streamAnthropic: (model: unknown, context: unknown, options: unknown) =>

View File

@ -13,8 +13,9 @@ const shellEnvMocks = vi.hoisted(() => ({
resolveShellEnvFallbackTimeoutMs: vi.fn(() => 1234),
}));
vi.mock("../infra/shell-env.js", async (importOriginal) => {
const mod = await importOriginal<typeof import("../infra/shell-env.js")>();
vi.mock("../infra/shell-env.js", async () => {
const mod =
await vi.importActual<typeof import("../infra/shell-env.js")>("../infra/shell-env.js");
return {
...mod,
getShellPathFromLoginShell: shellEnvMocks.getShellPathFromLoginShell,
@ -22,8 +23,10 @@ vi.mock("../infra/shell-env.js", async (importOriginal) => {
};
});
vi.mock("../infra/exec-approvals.js", async (importOriginal) => {
const mod = await importOriginal<typeof import("../infra/exec-approvals.js")>();
vi.mock("../infra/exec-approvals.js", async () => {
const mod = await vi.importActual<typeof import("../infra/exec-approvals.js")>(
"../infra/exec-approvals.js",
);
return { ...mod, resolveExecApprovals: () => createExecApprovals() };
});

View File

@ -85,19 +85,15 @@ function spawnDockerProcess(command: string, args: string[]) {
return child;
}
async function createChildProcessMock(
importOriginal: () => Promise<typeof import("node:child_process")>,
) {
const actual = await importOriginal();
async function createChildProcessMock() {
const actual = await vi.importActual<typeof import("node:child_process")>("node:child_process");
return {
...actual,
spawn: spawnDockerProcess,
};
}
vi.mock("node:child_process", async (importOriginal) =>
createChildProcessMock(() => importOriginal<typeof import("node:child_process")>()),
);
vi.mock("node:child_process", async () => createChildProcessMock());
let ensureSandboxContainer: typeof import("./docker.js").ensureSandboxContainer;
@ -107,9 +103,7 @@ async function loadFreshDockerModuleForTest() {
readRegistry: registryMocks.readRegistry,
updateRegistry: registryMocks.updateRegistry,
}));
vi.doMock("node:child_process", async (importOriginal) =>
createChildProcessMock(() => importOriginal<typeof import("node:child_process")>()),
);
vi.doMock("node:child_process", async () => createChildProcessMock());
({ ensureSandboxContainer } = await import("./docker.js"));
}

View File

@ -176,17 +176,20 @@ vi.mock("../../gateway/call.js", () => ({
callGateway: hoisted.callGatewayMock,
}));
vi.mock("../../acp/runtime/session-meta.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../../acp/runtime/session-meta.js")>();
vi.mock("../../acp/runtime/session-meta.js", async () => {
const actual = await vi.importActual<typeof import("../../acp/runtime/session-meta.js")>(
"../../acp/runtime/session-meta.js",
);
return {
...actual,
readAcpSessionEntry: (params: unknown) => hoisted.readAcpSessionEntryMock(params),
};
});
vi.mock("../../infra/outbound/session-binding-service.js", async (importOriginal) => {
const actual =
await importOriginal<typeof import("../../infra/outbound/session-binding-service.js")>();
vi.mock("../../infra/outbound/session-binding-service.js", async () => {
const actual = await vi.importActual<
typeof import("../../infra/outbound/session-binding-service.js")
>("../../infra/outbound/session-binding-service.js");
return {
...actual,
getSessionBindingService: () => buildFocusSessionBindingService(),

View File

@ -10,9 +10,9 @@ describe("group runtime loading", () => {
it("keeps prompt helpers off the heavy group runtime", async () => {
const groupsRuntimeLoads = vi.fn();
vi.doMock("./groups.runtime.js", async (importOriginal) => {
vi.doMock("./groups.runtime.js", async () => {
groupsRuntimeLoads();
return await importOriginal<typeof import("./groups.runtime.js")>();
return await vi.importActual<typeof import("./groups.runtime.js")>("./groups.runtime.js");
});
const groups = await import("./groups.js");
@ -40,9 +40,9 @@ describe("group runtime loading", () => {
it("loads the group runtime only when requireMention resolution needs it", async () => {
const groupsRuntimeLoads = vi.fn();
vi.doMock("./groups.runtime.js", async (importOriginal) => {
vi.doMock("./groups.runtime.js", async () => {
groupsRuntimeLoads();
return await importOriginal<typeof import("./groups.runtime.js")>();
return await vi.importActual<typeof import("./groups.runtime.js")>("./groups.runtime.js");
});
const groups = await import("./groups.js");

View File

@ -45,8 +45,10 @@ vi.mock("../logging/subsystem.js", () => {
};
});
vi.mock("../agents/auth-profiles.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../agents/auth-profiles.js")>();
vi.mock("../agents/auth-profiles.js", async () => {
const actual = await vi.importActual<typeof import("../agents/auth-profiles.js")>(
"../agents/auth-profiles.js",
);
return {
...actual,
ensureAuthProfileStore: vi.fn(() => ({ version: 1, profiles: {} })),
@ -64,8 +66,10 @@ vi.mock("../agents/workspace.js", () => {
};
});
vi.mock("../agents/command/session-store.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../agents/command/session-store.js")>();
vi.mock("../agents/command/session-store.js", async () => {
const actual = await vi.importActual<typeof import("../agents/command/session-store.js")>(
"../agents/command/session-store.js",
);
return {
...actual,
updateSessionStoreAfterAgentRun: vi.fn(async () => undefined),
@ -110,8 +114,10 @@ async function loadFreshAgentCommandModulesForTest() {
vi.doMock("../agents/model-catalog.js", () => ({
loadModelCatalog: loadModelCatalogMock,
}));
vi.doMock("../agents/model-selection.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../agents/model-selection.js")>();
vi.doMock("../agents/model-selection.js", async () => {
const actual = await vi.importActual<typeof import("../agents/model-selection.js")>(
"../agents/model-selection.js",
);
return {
...actual,
isCliProvider: isCliProviderMock,

View File

@ -24,24 +24,30 @@ const manifestRegistryMocks = vi.hoisted(() => ({
loadPluginManifestRegistry: vi.fn(() => ({ plugins: [], diagnostics: [] })),
}));
vi.mock("../channels/plugins/catalog.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../channels/plugins/catalog.js")>();
vi.mock("../channels/plugins/catalog.js", async () => {
const actual = await vi.importActual<typeof import("../channels/plugins/catalog.js")>(
"../channels/plugins/catalog.js",
);
return {
...actual,
listChannelPluginCatalogEntries: catalogMocks.listChannelPluginCatalogEntries,
};
});
vi.mock("../plugins/manifest-registry.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../plugins/manifest-registry.js")>();
vi.mock("../plugins/manifest-registry.js", async () => {
const actual = await vi.importActual<typeof import("../plugins/manifest-registry.js")>(
"../plugins/manifest-registry.js",
);
return {
...actual,
loadPluginManifestRegistry: manifestRegistryMocks.loadPluginManifestRegistry,
};
});
vi.mock("./channel-setup/plugin-install.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./channel-setup/plugin-install.js")>();
vi.mock("./channel-setup/plugin-install.js", async () => {
const actual = await vi.importActual<typeof import("./channel-setup/plugin-install.js")>(
"./channel-setup/plugin-install.js",
);
const { createMockChannelSetupPluginInstallModule } =
await import("./channels.plugin-install.test-helpers.js");
return createMockChannelSetupPluginInstallModule(actual);

View File

@ -3,8 +3,8 @@ import { afterEach, describe, expect, it, vi } from "vitest";
const spawnMock = vi.hoisted(() => vi.fn());
const unrefMock = vi.hoisted(() => 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,
spawn: (...args: unknown[]) => spawnMock(...args),

View File

@ -96,8 +96,8 @@ vi.mock("../infra/restart-stale-pids.js", () => ({
cleanStaleGatewayProcessesSync: (port?: number) => cleanStaleGatewayProcessesSync(port),
}));
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,
access: vi.fn(async (p: string) => {

View File

@ -4,8 +4,8 @@ const fsMocks = vi.hoisted(() => ({
access: 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: {

View File

@ -39,8 +39,8 @@ vi.mock("../utils.js", async () => {
};
});
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,
spawn,

View File

@ -4,11 +4,14 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
const execFileMock = 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, {
execFile: execFileMock,
});
return mockNodeBuiltinModule(
() => vi.importActual<typeof import("node:child_process")>("node:child_process"),
{
execFile: execFileMock,
},
);
});
import { splitArgsPreservingQuotes } from "./arg-split.js";

View File

@ -9,8 +9,8 @@ const { readJsonBodyMock } = vi.hoisted(() => ({
readJsonBodyMock: vi.fn(),
}));
vi.mock("./hooks.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./hooks.js")>();
vi.mock("./hooks.js", async () => {
const actual = await vi.importActual<typeof import("./hooks.js")>("./hooks.js");
return {
...actual,
readJsonBody: readJsonBodyMock,

View File

@ -3,11 +3,14 @@ import { afterEach, describe, expect, it, vi } from "vitest";
import { configHandlers, resolveConfigOpenCommand } from "./config.js";
import { createConfigHandlerHarness } from "./config.test-helpers.js";
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, {
execFile: vi.fn(),
});
return mockNodeBuiltinModule(
() => vi.importActual<typeof import("node:child_process")>("node:child_process"),
{
execFile: vi.fn(),
},
);
});
function invokeExecFileCallback(args: unknown[], error: Error | null) {

View File

@ -6,8 +6,8 @@ const mocks = vi.hoisted(() => ({
replaceConfigFile: vi.fn(async (_params: { nextConfig: OpenClawConfig }) => {}),
}));
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,
replaceConfigFile: mocks.replaceConfigFile,

View File

@ -6,8 +6,8 @@ const listChannelPluginsMock = vi.hoisted(() => vi.fn());
const isDeliverableMessageChannelMock = vi.hoisted(() => vi.fn());
const normalizeMessageChannelMock = 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: (...args: unknown[]) => loadConfigMock(...args),

View File

@ -4,11 +4,14 @@ import { importFreshModule } from "../../test/helpers/import-fresh.js";
const execFileMock = 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, {
execFile: (...args: unknown[]) => execFileMock(...args),
});
return mockNodeBuiltinModule(
() => vi.importActual<typeof import("node:child_process")>("node:child_process"),
{
execFile: (...args: unknown[]) => execFileMock(...args),
},
);
});
const originalVitest = process.env.VITEST;

View File

@ -3,11 +3,14 @@ import { afterEach, describe, expect, it, vi } from "vitest";
const spawnSyncMock = 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),
},
);
});
import { resolveOsSummary } from "./os-summary.js";

View File

@ -6,11 +6,14 @@ const spawnMock = vi.hoisted(() => vi.fn());
const triggerOpenClawRestartMock = vi.hoisted(() => vi.fn());
const scheduleDetachedLaunchdRestartHandoffMock = 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, {
spawn: (...args: unknown[]) => spawnMock(...args),
});
return mockNodeBuiltinModule(
() => vi.importActual<typeof import("node:child_process")>("node:child_process"),
{
spawn: (...args: unknown[]) => spawnMock(...args),
},
);
});
vi.mock("./restart.js", () => ({
triggerOpenClawRestart: (...args: unknown[]) => triggerOpenClawRestartMock(...args),

View File

@ -4,8 +4,10 @@ const resolveProviderUsageAuthWithPluginMock = vi.fn(
async (..._args: unknown[]): Promise<unknown> => null,
);
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,
resolveProviderUsageAuthWithPlugin: resolveProviderUsageAuthWithPluginMock,

View File

@ -10,12 +10,15 @@ const mockSpawnSync = vi.hoisted(() => vi.fn());
const mockResolveGatewayPort = vi.hoisted(() => vi.fn(() => 18789));
const mockRestartWarn = 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[]) => mockSpawnSync(...args),
execFileSync: vi.fn(),
});
return mockNodeBuiltinModule(
() => vi.importActual<typeof import("node:child_process")>("node:child_process"),
{
spawnSync: (...args: unknown[]) => mockSpawnSync(...args),
execFileSync: vi.fn(),
},
);
});
vi.mock("../config/paths.js", () => ({

View File

@ -5,8 +5,8 @@ import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi }
import { captureEnv } from "../test-utils/env.js";
import type { UpdateCheckResult } from "./update-check.js";
vi.mock("./openclaw-root.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("./openclaw-root.js")>();
vi.mock("./openclaw-root.js", async () => {
const actual = await vi.importActual<typeof import("./openclaw-root.js")>("./openclaw-root.js");
return {
...actual,
resolveOpenClawPackageRoot: vi.fn(),

View File

@ -7,11 +7,14 @@ import { captureFullEnv } from "../test-utils/env.js";
const spawnMock = vi.hoisted(() => vi.fn());
const resolvePreferredOpenClawTmpDirMock = vi.hoisted(() => vi.fn(() => os.tmpdir()));
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, {
spawn: (...args: unknown[]) => spawnMock(...args),
});
return mockNodeBuiltinModule(
() => vi.importActual<typeof import("node:child_process")>("node:child_process"),
{
spawn: (...args: unknown[]) => spawnMock(...args),
},
);
});
vi.mock("./tmp-openclaw-dir.js", () => ({
resolvePreferredOpenClawTmpDir: () => resolvePreferredOpenClawTmpDirMock(),

View File

@ -28,8 +28,10 @@ vi.mock("./install.js", () => ({
installPluginFromPath: (...args: unknown[]) => installPluginFromPathMock(...args),
}));
vi.mock("../infra/net/fetch-guard.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../infra/net/fetch-guard.js")>();
vi.mock("../infra/net/fetch-guard.js", async () => {
const actual = await vi.importActual<typeof import("../infra/net/fetch-guard.js")>(
"../infra/net/fetch-guard.js",
);
return {
...actual,
fetchWithSsrFGuard: (params: { url: string; init?: RequestInit }) =>

View File

@ -23,8 +23,8 @@ type GatewayClientMock = {
const gatewayClientInstances: GatewayClientMock[] = [];
vi.mock("./gateway.ts", async (importOriginal) => {
const actual = await importOriginal<typeof import("./gateway.ts")>();
vi.mock("./gateway.ts", async () => {
const actual = await vi.importActual<typeof import("./gateway.ts")>("./gateway.ts");
function resolveGatewayErrorDetailCode(
error: { details?: unknown } | null | undefined,
@ -89,8 +89,9 @@ vi.mock("./gateway.ts", async (importOriginal) => {
return { ...actual, GatewayBrowserClient, resolveGatewayErrorDetailCode };
});
vi.mock("./controllers/chat.ts", async (importOriginal) => {
const actual = await importOriginal<typeof import("./controllers/chat.ts")>();
vi.mock("./controllers/chat.ts", async () => {
const actual =
await vi.importActual<typeof import("./controllers/chat.ts")>("./controllers/chat.ts");
return {
...actual,
loadChatHistory: loadChatHistoryMock,