From f94c06c53f409bbb5b362fca525746c417ded6f1 Mon Sep 17 00:00:00 2001 From: Gustavo Madeira Santana Date: Sat, 14 Feb 2026 16:46:06 -0500 Subject: [PATCH] test: add explicit harness mock types --- src/commands/doctor.e2e-harness.ts | 13 +++++--- src/discord/send.test-harness.ts | 29 ++++++++++++---- .../monitor.tool-result.test-harness.ts | 33 +++++++++++++------ src/telegram/send.test-harness.ts | 10 +++++- 4 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/commands/doctor.e2e-harness.ts b/src/commands/doctor.e2e-harness.ts index c59d060d5bd..beb20a8180d 100644 --- a/src/commands/doctor.e2e-harness.ts +++ b/src/commands/doctor.e2e-harness.ts @@ -256,7 +256,12 @@ vi.mock("./doctor-state-migrations.js", () => ({ runLegacyStateMigrations, })); -export async function arrangeLegacyStateMigrationTest() { +export async function arrangeLegacyStateMigrationTest(): Promise<{ + doctorCommand: unknown; + runtime: { log: MockFn; error: MockFn; exit: MockFn }; + detectLegacyStateMigrations: MockFn; + runLegacyStateMigrations: MockFn; +}> { readConfigFileSnapshot.mockResolvedValue({ path: "/tmp/openclaw.json", exists: true, @@ -270,9 +275,9 @@ export async function arrangeLegacyStateMigrationTest() { const { doctorCommand } = await import("./doctor.js"); const runtime = { - log: vi.fn(), - error: vi.fn(), - exit: vi.fn(), + log: vi.fn() as unknown as MockFn, + error: vi.fn() as unknown as MockFn, + exit: vi.fn() as unknown as MockFn, }; detectLegacyStateMigrations.mockClear(); diff --git a/src/discord/send.test-harness.ts b/src/discord/send.test-harness.ts index 02474b70d6f..eceb7882c0a 100644 --- a/src/discord/send.test-harness.ts +++ b/src/discord/send.test-harness.ts @@ -1,6 +1,21 @@ import { vi } from "vitest"; +import type { MockFn } from "../test-utils/vitest-mock-fn.js"; -export function discordWebMediaMockFactory() { +type DiscordWebMediaMockFactoryResult = { + loadWebMedia: MockFn; + loadWebMediaRaw: MockFn; +}; + +type DiscordRestFactoryResult = { + rest: import("@buape/carbon").RequestClient; + postMock: MockFn; + putMock: MockFn; + getMock: MockFn; + patchMock: MockFn; + deleteMock: MockFn; +}; + +export function discordWebMediaMockFactory(): DiscordWebMediaMockFactoryResult { return { loadWebMedia: vi.fn().mockResolvedValue({ buffer: Buffer.from("img"), @@ -17,12 +32,12 @@ export function discordWebMediaMockFactory() { }; } -export function makeDiscordRest() { - const postMock = vi.fn(); - const putMock = vi.fn(); - const getMock = vi.fn(); - const patchMock = vi.fn(); - const deleteMock = vi.fn(); +export function makeDiscordRest(): DiscordRestFactoryResult { + const postMock = vi.fn() as unknown as MockFn; + const putMock = vi.fn() as unknown as MockFn; + const getMock = vi.fn() as unknown as MockFn; + const patchMock = vi.fn() as unknown as MockFn; + const deleteMock = vi.fn() as unknown as MockFn; return { rest: { diff --git a/src/signal/monitor.tool-result.test-harness.ts b/src/signal/monitor.tool-result.test-harness.ts index 21d0ba9bdc9..4bb3bc73e87 100644 --- a/src/signal/monitor.tool-result.test-harness.ts +++ b/src/signal/monitor.tool-result.test-harness.ts @@ -1,18 +1,31 @@ import { beforeEach, vi } from "vitest"; +import type { MockFn } from "../test-utils/vitest-mock-fn.js"; import { resetInboundDedupe } from "../auto-reply/reply/inbound-dedupe.js"; import { resetSystemEventsForTest } from "../infra/system-events.js"; -const waitForTransportReadyMock = vi.hoisted(() => vi.fn()); -const sendMock = vi.hoisted(() => vi.fn()); -const replyMock = vi.hoisted(() => vi.fn()); -const updateLastRouteMock = vi.hoisted(() => vi.fn()); -const readAllowFromStoreMock = vi.hoisted(() => vi.fn()); -const upsertPairingRequestMock = vi.hoisted(() => vi.fn()); -const streamMock = vi.hoisted(() => vi.fn()); -const signalCheckMock = vi.hoisted(() => vi.fn()); -const signalRpcRequestMock = vi.hoisted(() => vi.fn()); +type SignalToolResultTestMocks = { + waitForTransportReadyMock: MockFn; + sendMock: MockFn; + replyMock: MockFn; + updateLastRouteMock: MockFn; + readAllowFromStoreMock: MockFn; + upsertPairingRequestMock: MockFn; + streamMock: MockFn; + signalCheckMock: MockFn; + signalRpcRequestMock: MockFn; +}; -export function getSignalToolResultTestMocks() { +const waitForTransportReadyMock = vi.hoisted(() => vi.fn()) as unknown as MockFn; +const sendMock = vi.hoisted(() => vi.fn()) as unknown as MockFn; +const replyMock = vi.hoisted(() => vi.fn()) as unknown as MockFn; +const updateLastRouteMock = vi.hoisted(() => vi.fn()) as unknown as MockFn; +const readAllowFromStoreMock = vi.hoisted(() => vi.fn()) as unknown as MockFn; +const upsertPairingRequestMock = vi.hoisted(() => vi.fn()) as unknown as MockFn; +const streamMock = vi.hoisted(() => vi.fn()) as unknown as MockFn; +const signalCheckMock = vi.hoisted(() => vi.fn()) as unknown as MockFn; +const signalRpcRequestMock = vi.hoisted(() => vi.fn()) as unknown as MockFn; + +export function getSignalToolResultTestMocks(): SignalToolResultTestMocks { return { waitForTransportReadyMock, sendMock, diff --git a/src/telegram/send.test-harness.ts b/src/telegram/send.test-harness.ts index 79d05ded658..528ec2fb5fa 100644 --- a/src/telegram/send.test-harness.ts +++ b/src/telegram/send.test-harness.ts @@ -1,4 +1,5 @@ import { beforeEach, vi } from "vitest"; +import type { MockFn } from "../test-utils/vitest-mock-fn.js"; const { botApi, botCtorSpy } = vi.hoisted(() => ({ botApi: { @@ -20,6 +21,13 @@ const { loadConfig } = vi.hoisted(() => ({ loadConfig: vi.fn(() => ({})), })); +type TelegramSendTestMocks = { + botApi: Record; + botCtorSpy: MockFn; + loadConfig: MockFn; + loadWebMedia: MockFn; +}; + vi.mock("../web/media.js", () => ({ loadWebMedia, })); @@ -48,7 +56,7 @@ vi.mock("../config/config.js", async (importOriginal) => { }; }); -export function getTelegramSendTestMocks() { +export function getTelegramSendTestMocks(): TelegramSendTestMocks { return { botApi, botCtorSpy, loadConfig, loadWebMedia }; }