test(talk): cover two-phase browser voice teardown

This commit is contained in:
Vincent Koc
2026-08-02 19:39:19 +08:00
parent d4f18d9197
commit fbd502f83d
2 changed files with 28 additions and 2 deletions
@@ -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();
}
@@ -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();