From 156ee544edaea7c654382ed0ed907e234bf6d498 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 12 Apr 2026 16:43:23 +0100 Subject: [PATCH] test(agents): share notify heartbeat wake helper --- src/agents/bash-tools.test.ts | 53 +++++++++++++---------------------- 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/src/agents/bash-tools.test.ts b/src/agents/bash-tools.test.ts index 3fcca88dbb6..9cc6a248d84 100644 --- a/src/agents/bash-tools.test.ts +++ b/src/agents/bash-tools.test.ts @@ -232,6 +232,19 @@ async function startBackgroundCommand(tool: ExecToolInstance, command: string) { return requireRunningSessionId(result); } +async function expectNotifyOnExitWake(tool: ExecToolInstance, expected: Record) { + const wakeHandler = vi.fn().mockResolvedValue({ status: "skipped", reason: "disabled" }); + const dispose = setHeartbeatWakeHandler( + wakeHandler as unknown as Parameters[0], + ); + try { + await startBackgroundCommand(tool, echoAfterDelay("notify")); + await expect.poll(() => wakeHandler.mock.calls[0]?.[0], NOTIFY_POLL_OPTIONS).toEqual(expected); + } finally { + dispose(); + } +} + async function drainNotifyEvents(sessionKey = DEFAULT_NOTIFY_SESSION_KEY) { return await drainFormattedSystemEvents({ cfg: notifyCfg, @@ -606,42 +619,16 @@ describe("exec notifyOnExit", () => { }); it("scopes notifyOnExit heartbeat wake to the exec session key", async () => { - const tool = createNotifyOnExitExecTool(); - const wakeHandler = vi.fn().mockResolvedValue({ status: "skipped", reason: "disabled" }); - const dispose = setHeartbeatWakeHandler( - wakeHandler as unknown as Parameters[0], - ); - try { - const _sessionId = await startBackgroundCommand(tool, echoAfterDelay("notify")); - - await expect - .poll(() => wakeHandler.mock.calls[0]?.[0], NOTIFY_POLL_OPTIONS) - .toMatchObject({ - reason: "exec-event", - sessionKey: DEFAULT_NOTIFY_SESSION_KEY, - }); - } finally { - dispose(); - } + await expectNotifyOnExitWake(createNotifyOnExitExecTool(), { + reason: "exec-event", + sessionKey: DEFAULT_NOTIFY_SESSION_KEY, + }); }); it("keeps notifyOnExit heartbeat wake unscoped for non-agent session keys", async () => { - const tool = createNotifyOnExitExecTool({ sessionKey: "global" }); - const wakeHandler = vi.fn().mockResolvedValue({ status: "skipped", reason: "disabled" }); - const dispose = setHeartbeatWakeHandler( - wakeHandler as unknown as Parameters[0], - ); - try { - const _sessionId = await startBackgroundCommand(tool, echoAfterDelay("notify")); - - await expect - .poll(() => wakeHandler.mock.calls[0]?.[0], NOTIFY_POLL_OPTIONS) - .toEqual({ - reason: "exec-event", - }); - } finally { - dispose(); - } + await expectNotifyOnExitWake(createNotifyOnExitExecTool({ sessionKey: "global" }), { + reason: "exec-event", + }); }); it.each(NOOP_NOTIFY_CASES)("$label", runNotifyNoopCase);