import type { Mock } from "vitest"; import { vi } from "vitest"; import type { OpenClawConfig } from "../config/config.js"; import { mergeMockedModule } from "../test-utils/vitest-module-mocks.js"; import { createTestRuntime } from "./test-runtime-config-helpers.js"; type ReplaceConfigFileResult = Awaited< ReturnType<(typeof import("../config/config.js"))["replaceConfigFile"]> >; export const readConfigFileSnapshotMock: Mock<(...args: unknown[]) => Promise> = vi.fn(); export const writeConfigFileMock: Mock<(...args: unknown[]) => Promise> = vi .fn() .mockResolvedValue(undefined); export const replaceConfigFileMock: Mock<(...args: unknown[]) => Promise> = vi.fn( async (params: { nextConfig: OpenClawConfig }): Promise => { await writeConfigFileMock(params.nextConfig); return { path: "/tmp/openclaw.json", previousHash: null, snapshot: {} as never, nextConfig: params.nextConfig, }; }, ) as Mock<(...args: unknown[]) => Promise>; vi.mock("../config/config.js", async () => { const actual = await vi.importActual("../config/config.js"); return await mergeMockedModule(actual, () => ({ readConfigFileSnapshot: (...args: Parameters) => readConfigFileSnapshotMock(...args) as ReturnType, writeConfigFile: (...args: Parameters) => writeConfigFileMock(...args) as ReturnType, replaceConfigFile: (...args: Parameters) => replaceConfigFileMock(...args) as ReturnType, })); }); export const runtime = createTestRuntime(); let agentsCommandModulePromise: Promise | undefined; export async function loadFreshAgentsCommandModuleForTest() { agentsCommandModulePromise ??= import("./agents.js"); return await agentsCommandModulePromise; } export function resetAgentsBindTestHarness(): void { readConfigFileSnapshotMock.mockClear(); writeConfigFileMock.mockClear(); replaceConfigFileMock.mockClear(); runtime.log.mockClear(); runtime.error.mockClear(); runtime.exit.mockClear(); }