diff --git a/ui/src/pages/chat/realtime-talk-lifecycle.test.ts b/ui/src/pages/chat/realtime-talk-lifecycle.test.ts index 8790e2d61c6f..a5fd9d330d8a 100644 --- a/ui/src/pages/chat/realtime-talk-lifecycle.test.ts +++ b/ui/src/pages/chat/realtime-talk-lifecycle.test.ts @@ -803,13 +803,19 @@ describe("RealtimeTalkSession lifecycle", () => { ); expect(createCount).toBe(16); + await vi.advanceTimersByTimeAsync(30_000); + expect(closeSignals.every((signal) => !signal.aborted)).toBe(true); + await expect(recovered.start()).rejects.toThrow( + "Too many active or closing realtime Talk voice sessions", + ); + await vi.advanceTimersByTimeAsync(30_000); expect(closeSignals.every((signal) => signal.aborted)).toBe(true); await recovered.start(); expect(createCount).toBe(17); recovered.stop(); - await vi.advanceTimersByTimeAsync(30_000); + await vi.advanceTimersByTimeAsync(60_000); } finally { vi.useRealTimers(); } diff --git a/ui/src/pages/chat/realtime-talk-transcript-queue.test.ts b/ui/src/pages/chat/realtime-talk-transcript-queue.test.ts index 412cea068e98..a54138a689ca 100644 --- a/ui/src/pages/chat/realtime-talk-transcript-queue.test.ts +++ b/ui/src/pages/chat/realtime-talk-transcript-queue.test.ts @@ -182,6 +182,7 @@ describe("RealtimeTalkSession transcript queue", () => { it("aborts a detached transcript drain before releasing its client owner", async () => { vi.useFakeTimers(); const transcriptSignals: AbortSignal[] = []; + const closeSignals: AbortSignal[] = []; try { const request = vi.fn( async ( @@ -207,6 +208,13 @@ describe("RealtimeTalkSession transcript queue", () => { signal.addEventListener("abort", () => reject(new Error("aborted")), { once: true }); }); } + if (method === "talk.client.close") { + const signal = options?.signal; + if (!signal) { + throw new Error("expected close abort signal"); + } + closeSignals.push(signal); + } return { ok: true }; }, ); @@ -235,7 +243,19 @@ describe("RealtimeTalkSession transcript queue", () => { expect( request.mock.calls.filter(([method]) => method === "talk.client.transcript"), ).toHaveLength(1); - expect(request.mock.calls.some(([method]) => method === "talk.client.close")).toBe(false); + expect(request).toHaveBeenCalledWith( + "talk.client.close", + { + sessionKey: "agent:main:main", + voiceSessionId: "voice-drain-timeout", + }, + { + signal: closeSignals[0], + timeoutMs: 30_000, + }, + ); + expect(closeSignals[0]).not.toBe(transcriptSignals[0]); + expect(closeSignals[0]?.aborted).toBe(false); expect(onStatus.mock.calls.filter(([status]) => status === "error")).toHaveLength(0); } finally { vi.useRealTimers();