mirror of https://github.com/openclaw/openclaw.git
147 lines
5.0 KiB
TypeScript
147 lines
5.0 KiB
TypeScript
import { beforeEach, vi } from "vitest";
|
|
import { resetInboundDedupe } from "../auto-reply/reply/inbound-dedupe.js";
|
|
import { resetSystemEventsForTest } from "../infra/system-events.js";
|
|
import type { MockFn } from "../test-utils/vitest-mock-fn.js";
|
|
import type { SignalDaemonExitEvent, SignalDaemonHandle } from "./daemon.js";
|
|
|
|
type SignalToolResultTestMocks = {
|
|
waitForTransportReadyMock: MockFn;
|
|
sendMock: MockFn;
|
|
replyMock: MockFn;
|
|
updateLastRouteMock: MockFn;
|
|
readAllowFromStoreMock: MockFn;
|
|
upsertPairingRequestMock: MockFn;
|
|
streamMock: MockFn;
|
|
signalCheckMock: MockFn;
|
|
signalRpcRequestMock: MockFn;
|
|
spawnSignalDaemonMock: MockFn;
|
|
};
|
|
|
|
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;
|
|
const spawnSignalDaemonMock = vi.hoisted(() => vi.fn()) as unknown as MockFn;
|
|
|
|
export function getSignalToolResultTestMocks(): SignalToolResultTestMocks {
|
|
return {
|
|
waitForTransportReadyMock,
|
|
sendMock,
|
|
replyMock,
|
|
updateLastRouteMock,
|
|
readAllowFromStoreMock,
|
|
upsertPairingRequestMock,
|
|
streamMock,
|
|
signalCheckMock,
|
|
signalRpcRequestMock,
|
|
spawnSignalDaemonMock,
|
|
};
|
|
}
|
|
|
|
export let config: Record<string, unknown> = {};
|
|
|
|
export function setSignalToolResultTestConfig(next: Record<string, unknown>) {
|
|
config = next;
|
|
}
|
|
|
|
export const flush = () => new Promise((resolve) => setTimeout(resolve, 0));
|
|
|
|
export function createMockSignalDaemonHandle(
|
|
overrides: {
|
|
stop?: MockFn;
|
|
exited?: Promise<SignalDaemonExitEvent>;
|
|
isExited?: () => boolean;
|
|
} = {},
|
|
): SignalDaemonHandle {
|
|
const stop = overrides.stop ?? (vi.fn() as unknown as MockFn);
|
|
const exited = overrides.exited ?? new Promise<SignalDaemonExitEvent>(() => {});
|
|
const isExited = overrides.isExited ?? (() => false);
|
|
return {
|
|
stop: stop as unknown as () => void,
|
|
exited,
|
|
isExited,
|
|
};
|
|
}
|
|
|
|
vi.mock("../config/config.js", async (importOriginal) => {
|
|
const actual = await importOriginal<typeof import("../config/config.js")>();
|
|
return {
|
|
...actual,
|
|
loadConfig: () => config,
|
|
};
|
|
});
|
|
|
|
vi.mock("../auto-reply/reply.js", () => ({
|
|
getReplyFromConfig: (...args: unknown[]) => replyMock(...args),
|
|
}));
|
|
|
|
vi.mock("./send.js", () => ({
|
|
sendMessageSignal: (...args: unknown[]) => sendMock(...args),
|
|
sendTypingSignal: vi.fn().mockResolvedValue(true),
|
|
sendReadReceiptSignal: vi.fn().mockResolvedValue(true),
|
|
}));
|
|
|
|
vi.mock("../pairing/pairing-store.js", () => ({
|
|
readChannelAllowFromStore: (...args: unknown[]) => readAllowFromStoreMock(...args),
|
|
upsertChannelPairingRequest: (...args: unknown[]) => upsertPairingRequestMock(...args),
|
|
}));
|
|
|
|
vi.mock("../config/sessions.js", async (importOriginal) => {
|
|
const actual = await importOriginal<typeof import("../config/sessions.js")>();
|
|
return {
|
|
...actual,
|
|
resolveStorePath: vi.fn(() => "/tmp/openclaw-sessions.json"),
|
|
updateLastRoute: (...args: unknown[]) => updateLastRouteMock(...args),
|
|
readSessionUpdatedAt: vi.fn(() => undefined),
|
|
recordSessionMetaFromInbound: vi.fn().mockResolvedValue(undefined),
|
|
};
|
|
});
|
|
|
|
vi.mock("./client.js", () => ({
|
|
streamSignalEvents: (...args: unknown[]) => streamMock(...args),
|
|
signalCheck: (...args: unknown[]) => signalCheckMock(...args),
|
|
signalRpcRequest: (...args: unknown[]) => signalRpcRequestMock(...args),
|
|
}));
|
|
|
|
vi.mock("./daemon.js", async (importOriginal) => {
|
|
const actual = await importOriginal<typeof import("./daemon.js")>();
|
|
return {
|
|
...actual,
|
|
spawnSignalDaemon: (...args: unknown[]) => spawnSignalDaemonMock(...args),
|
|
};
|
|
});
|
|
|
|
vi.mock("../infra/transport-ready.js", () => ({
|
|
waitForTransportReady: (...args: unknown[]) => waitForTransportReadyMock(...args),
|
|
}));
|
|
|
|
export function installSignalToolResultTestHooks() {
|
|
beforeEach(() => {
|
|
resetInboundDedupe();
|
|
config = {
|
|
messages: { responsePrefix: "PFX" },
|
|
channels: {
|
|
signal: { autoStart: false, dmPolicy: "open", allowFrom: ["*"] },
|
|
},
|
|
};
|
|
|
|
sendMock.mockReset().mockResolvedValue(undefined);
|
|
replyMock.mockReset();
|
|
updateLastRouteMock.mockReset();
|
|
streamMock.mockReset();
|
|
signalCheckMock.mockReset().mockResolvedValue({});
|
|
signalRpcRequestMock.mockReset().mockResolvedValue({});
|
|
spawnSignalDaemonMock.mockReset().mockReturnValue(createMockSignalDaemonHandle());
|
|
readAllowFromStoreMock.mockReset().mockResolvedValue([]);
|
|
upsertPairingRequestMock.mockReset().mockResolvedValue({ code: "PAIRCODE", created: true });
|
|
waitForTransportReadyMock.mockReset().mockResolvedValue(undefined);
|
|
|
|
resetSystemEventsForTest();
|
|
});
|
|
}
|