From e7c42884fc3bca124986169a0c6f22527e14b497 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 16 Jan 2026 20:45:06 +0000 Subject: [PATCH] test: cover transport readiness waits --- src/infra/transport-ready.test.ts | 14 ++++++ ...ends-tool-summaries-responseprefix.test.ts | 46 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/src/infra/transport-ready.test.ts b/src/infra/transport-ready.test.ts index 7a072c53a..6d18a265b 100644 --- a/src/infra/transport-ready.test.ts +++ b/src/infra/transport-ready.test.ts @@ -37,4 +37,18 @@ describe("waitForTransportReady", () => { ).rejects.toThrow("test transport not ready"); expect(runtime.error).toHaveBeenCalled(); }); + + it("returns early when aborted", async () => { + const runtime = { log: vi.fn(), error: vi.fn(), exit: vi.fn() }; + const controller = new AbortController(); + controller.abort(); + await waitForTransportReady({ + label: "test transport", + timeoutMs: 200, + runtime, + abortSignal: controller.signal, + check: async () => ({ ok: false, error: "still down" }), + }); + expect(runtime.error).not.toHaveBeenCalled(); + }); }); diff --git a/src/signal/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts b/src/signal/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts index bd3d4e572..d16892646 100644 --- a/src/signal/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts +++ b/src/signal/monitor.tool-result.sends-tool-summaries-responseprefix.test.ts @@ -7,6 +7,7 @@ import { resolveAgentRoute } from "../routing/resolve-route.js"; import { normalizeE164 } from "../utils.js"; import { monitorSignalProvider } from "./monitor.js"; +const waitForTransportReadyMock = vi.hoisted(() => vi.fn()); const sendMock = vi.fn(); const replyMock = vi.fn(); const updateLastRouteMock = vi.fn(); @@ -54,6 +55,10 @@ vi.mock("./daemon.js", () => ({ spawnSignalDaemon: vi.fn(() => ({ stop: vi.fn() })), })); +vi.mock("../infra/transport-ready.js", () => ({ + waitForTransportReady: (...args: unknown[]) => waitForTransportReadyMock(...args), +})); + const flush = () => new Promise((resolve) => setTimeout(resolve, 0)); beforeEach(() => { @@ -72,10 +77,51 @@ beforeEach(() => { signalRpcRequestMock.mockReset().mockResolvedValue({}); readAllowFromStoreMock.mockReset().mockResolvedValue([]); upsertPairingRequestMock.mockReset().mockResolvedValue({ code: "PAIRCODE", created: true }); + waitForTransportReadyMock.mockReset().mockResolvedValue(undefined); resetSystemEventsForTest(); }); describe("monitorSignalProvider tool results", () => { + it("uses bounded readiness checks when auto-starting the daemon", async () => { + const runtime = { + log: vi.fn(), + error: vi.fn(), + exit: ((code: number): never => { + throw new Error(`exit ${code}`); + }) as (code: number) => never, + }; + config = { + ...config, + channels: { + ...config.channels, + signal: { autoStart: true, dmPolicy: "open", allowFrom: ["*"] }, + }, + }; + const abortController = new AbortController(); + streamMock.mockImplementation(async () => { + abortController.abort(); + return; + }); + await monitorSignalProvider({ + autoStart: true, + baseUrl: "http://127.0.0.1:8080", + abortSignal: abortController.signal, + runtime, + }); + + expect(waitForTransportReadyMock).toHaveBeenCalledTimes(1); + expect(waitForTransportReadyMock).toHaveBeenCalledWith( + expect.objectContaining({ + label: "signal daemon", + timeoutMs: 30_000, + logAfterMs: 10_000, + logIntervalMs: 10_000, + pollIntervalMs: 150, + runtime, + abortSignal: abortController.signal, + }), + ); + }); it("sends tool summaries with responsePrefix", async () => { const abortController = new AbortController(); replyMock.mockImplementation(async (_ctx, opts) => {