test: add explicit harness mock types

This commit is contained in:
Gustavo Madeira Santana
2026-02-14 16:46:06 -05:00
parent 123ae82fca
commit f94c06c53f
4 changed files with 63 additions and 22 deletions
+9 -4
View File
@@ -256,7 +256,12 @@ vi.mock("./doctor-state-migrations.js", () => ({
runLegacyStateMigrations, 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({ readConfigFileSnapshot.mockResolvedValue({
path: "/tmp/openclaw.json", path: "/tmp/openclaw.json",
exists: true, exists: true,
@@ -270,9 +275,9 @@ export async function arrangeLegacyStateMigrationTest() {
const { doctorCommand } = await import("./doctor.js"); const { doctorCommand } = await import("./doctor.js");
const runtime = { const runtime = {
log: vi.fn(), log: vi.fn() as unknown as MockFn,
error: vi.fn(), error: vi.fn() as unknown as MockFn,
exit: vi.fn(), exit: vi.fn() as unknown as MockFn,
}; };
detectLegacyStateMigrations.mockClear(); detectLegacyStateMigrations.mockClear();
+22 -7
View File
@@ -1,6 +1,21 @@
import { vi } from "vitest"; 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 { return {
loadWebMedia: vi.fn().mockResolvedValue({ loadWebMedia: vi.fn().mockResolvedValue({
buffer: Buffer.from("img"), buffer: Buffer.from("img"),
@@ -17,12 +32,12 @@ export function discordWebMediaMockFactory() {
}; };
} }
export function makeDiscordRest() { export function makeDiscordRest(): DiscordRestFactoryResult {
const postMock = vi.fn(); const postMock = vi.fn() as unknown as MockFn;
const putMock = vi.fn(); const putMock = vi.fn() as unknown as MockFn;
const getMock = vi.fn(); const getMock = vi.fn() as unknown as MockFn;
const patchMock = vi.fn(); const patchMock = vi.fn() as unknown as MockFn;
const deleteMock = vi.fn(); const deleteMock = vi.fn() as unknown as MockFn;
return { return {
rest: { rest: {
+23 -10
View File
@@ -1,18 +1,31 @@
import { beforeEach, vi } from "vitest"; 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 { resetInboundDedupe } from "../auto-reply/reply/inbound-dedupe.js";
import { resetSystemEventsForTest } from "../infra/system-events.js"; import { resetSystemEventsForTest } from "../infra/system-events.js";
const waitForTransportReadyMock = vi.hoisted(() => vi.fn()); type SignalToolResultTestMocks = {
const sendMock = vi.hoisted(() => vi.fn()); waitForTransportReadyMock: MockFn;
const replyMock = vi.hoisted(() => vi.fn()); sendMock: MockFn;
const updateLastRouteMock = vi.hoisted(() => vi.fn()); replyMock: MockFn;
const readAllowFromStoreMock = vi.hoisted(() => vi.fn()); updateLastRouteMock: MockFn;
const upsertPairingRequestMock = vi.hoisted(() => vi.fn()); readAllowFromStoreMock: MockFn;
const streamMock = vi.hoisted(() => vi.fn()); upsertPairingRequestMock: MockFn;
const signalCheckMock = vi.hoisted(() => vi.fn()); streamMock: MockFn;
const signalRpcRequestMock = vi.hoisted(() => vi.fn()); 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 { return {
waitForTransportReadyMock, waitForTransportReadyMock,
sendMock, sendMock,
+9 -1
View File
@@ -1,4 +1,5 @@
import { beforeEach, vi } from "vitest"; import { beforeEach, vi } from "vitest";
import type { MockFn } from "../test-utils/vitest-mock-fn.js";
const { botApi, botCtorSpy } = vi.hoisted(() => ({ const { botApi, botCtorSpy } = vi.hoisted(() => ({
botApi: { botApi: {
@@ -20,6 +21,13 @@ const { loadConfig } = vi.hoisted(() => ({
loadConfig: vi.fn(() => ({})), loadConfig: vi.fn(() => ({})),
})); }));
type TelegramSendTestMocks = {
botApi: Record<string, MockFn>;
botCtorSpy: MockFn;
loadConfig: MockFn;
loadWebMedia: MockFn;
};
vi.mock("../web/media.js", () => ({ vi.mock("../web/media.js", () => ({
loadWebMedia, loadWebMedia,
})); }));
@@ -48,7 +56,7 @@ vi.mock("../config/config.js", async (importOriginal) => {
}; };
}); });
export function getTelegramSendTestMocks() { export function getTelegramSendTestMocks(): TelegramSendTestMocks {
return { botApi, botCtorSpy, loadConfig, loadWebMedia }; return { botApi, botCtorSpy, loadConfig, loadWebMedia };
} }