From 33a3a56ee1b336f17aef197df7c856f74b72ac58 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 15 Feb 2026 14:24:06 +0000 Subject: [PATCH] refactor(auto-reply): share agent-runner test harness mocks --- ...nt-runner.heartbeat-typing.test-harness.ts | 31 ++++------------ .../agent-runner.memory-flush.test-harness.ts | 31 ++++------------ .../reply/agent-runner.test-harness.mocks.ts | 37 +++++++++++++++++++ 3 files changed, 53 insertions(+), 46 deletions(-) create mode 100644 src/auto-reply/reply/agent-runner.test-harness.mocks.ts diff --git a/src/auto-reply/reply/agent-runner.heartbeat-typing.test-harness.ts b/src/auto-reply/reply/agent-runner.heartbeat-typing.test-harness.ts index 5f8917975..b88c004f6 100644 --- a/src/auto-reply/reply/agent-runner.heartbeat-typing.test-harness.ts +++ b/src/auto-reply/reply/agent-runner.heartbeat-typing.test-harness.ts @@ -4,6 +4,11 @@ import type { TypingMode } from "../../config/types.js"; import type { TemplateContext } from "../templating.js"; import type { GetReplyOptions } from "../types.js"; import type { FollowupRun, QueueSettings } from "./queue.js"; +import { + embeddedPiMockFactory, + modelFallbackMockFactory, + queueMockFactory, +} from "./agent-runner.test-harness.mocks.js"; import { createMockTypingController } from "./test-helpers.js"; // Avoid exporting vitest mock types (TS2742 under pnpm + d.ts emit). @@ -40,34 +45,14 @@ export function installRunReplyAgentTypingHeartbeatTestHooks() { } vi.mock("../../agents/model-fallback.js", () => ({ - runWithModelFallback: async ({ - provider, - model, - run, - }: { - provider: string; - model: string; - run: (provider: string, model: string) => Promise; - }) => ({ - result: await run(provider, model), - provider, - model, - }), + ...modelFallbackMockFactory(), })); vi.mock("../../agents/pi-embedded.js", () => ({ - queueEmbeddedPiMessage: vi.fn().mockReturnValue(false), - runEmbeddedPiAgent: (params: unknown) => state.runEmbeddedPiAgentMock(params), + ...embeddedPiMockFactory(state), })); -vi.mock("./queue.js", async () => { - const actual = await vi.importActual("./queue.js"); - return { - ...actual, - enqueueFollowupRun: vi.fn(), - scheduleFollowupDrain: vi.fn(), - }; -}); +vi.mock("./queue.js", queueMockFactory); export function createMinimalRun(params?: { opts?: GetReplyOptions; diff --git a/src/auto-reply/reply/agent-runner.memory-flush.test-harness.ts b/src/auto-reply/reply/agent-runner.memory-flush.test-harness.ts index 6168b2ed3..820b096fd 100644 --- a/src/auto-reply/reply/agent-runner.memory-flush.test-harness.ts +++ b/src/auto-reply/reply/agent-runner.memory-flush.test-harness.ts @@ -3,6 +3,11 @@ import path from "node:path"; import { vi } from "vitest"; import type { TemplateContext } from "../templating.js"; import type { FollowupRun, QueueSettings } from "./queue.js"; +import { + embeddedPiMockFactory, + modelFallbackMockFactory, + queueMockFactory, +} from "./agent-runner.test-harness.mocks.js"; import { createMockTypingController } from "./test-helpers.js"; // Avoid exporting vitest mock types (TS2742 under pnpm + d.ts emit). @@ -31,19 +36,7 @@ export function getRunCliAgentMock(): AnyMock { export type { EmbeddedRunParams }; vi.mock("../../agents/model-fallback.js", () => ({ - runWithModelFallback: async ({ - provider, - model, - run, - }: { - provider: string; - model: string; - run: (provider: string, model: string) => Promise; - }) => ({ - result: await run(provider, model), - provider, - model, - }), + ...modelFallbackMockFactory(), })); vi.mock("../../agents/cli-runner.js", () => ({ @@ -51,18 +44,10 @@ vi.mock("../../agents/cli-runner.js", () => ({ })); vi.mock("../../agents/pi-embedded.js", () => ({ - queueEmbeddedPiMessage: vi.fn().mockReturnValue(false), - runEmbeddedPiAgent: (params: unknown) => state.runEmbeddedPiAgentMock(params), + ...embeddedPiMockFactory(state), })); -vi.mock("./queue.js", async () => { - const actual = await vi.importActual("./queue.js"); - return { - ...actual, - enqueueFollowupRun: vi.fn(), - scheduleFollowupDrain: vi.fn(), - }; -}); +vi.mock("./queue.js", queueMockFactory); export async function seedSessionStore(params: { storePath: string; diff --git a/src/auto-reply/reply/agent-runner.test-harness.mocks.ts b/src/auto-reply/reply/agent-runner.test-harness.mocks.ts new file mode 100644 index 000000000..01888f761 --- /dev/null +++ b/src/auto-reply/reply/agent-runner.test-harness.mocks.ts @@ -0,0 +1,37 @@ +import { vi } from "vitest"; + +export function modelFallbackMockFactory(): Record { + return { + runWithModelFallback: async ({ + provider, + model, + run, + }: { + provider: string; + model: string; + run: (provider: string, model: string) => Promise; + }) => ({ + result: await run(provider, model), + provider, + model, + }), + }; +} + +export function embeddedPiMockFactory(state: { + runEmbeddedPiAgentMock: (params: unknown) => unknown; +}): Record { + return { + queueEmbeddedPiMessage: vi.fn().mockReturnValue(false), + runEmbeddedPiAgent: (params: unknown) => state.runEmbeddedPiAgentMock(params), + }; +} + +export async function queueMockFactory(): Promise> { + const actual = await vi.importActual("./queue.js"); + return { + ...actual, + enqueueFollowupRun: vi.fn(), + scheduleFollowupDrain: vi.fn(), + }; +}