From 5f2bd3618060be7ccff589462dee830a7acb092a Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 11 May 2026 23:32:16 +0100 Subject: [PATCH] test: guard realtime talk mock events --- ui/src/ui/realtime-talk-google-live.test.ts | 20 ++++++++++++++++---- ui/src/ui/realtime-talk-webrtc.test.ts | 19 +++++++++++++++++-- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/ui/src/ui/realtime-talk-google-live.test.ts b/ui/src/ui/realtime-talk-google-live.test.ts index b98f2196501..57c58bdbcfd 100644 --- a/ui/src/ui/realtime-talk-google-live.test.ts +++ b/ui/src/ui/realtime-talk-google-live.test.ts @@ -171,6 +171,18 @@ function latestWebSocket(): MockGoogleLiveWebSocket { return ws; } +function requireFirstTalkEvent(onTalkEvent: ReturnType): Record { + const [call] = onTalkEvent.mock.calls; + if (!call) { + throw new Error("expected talk event"); + } + const [event] = call; + if (!event || typeof event !== "object" || Array.isArray(event)) { + throw new Error("expected talk event record"); + } + return event as Record; +} + describe("GoogleLiveRealtimeTalkTransport", () => { beforeEach(() => { wsInstances.length = 0; @@ -201,10 +213,10 @@ describe("GoogleLiveRealtimeTalkTransport", () => { expect(ws.binaryType).toBe("arraybuffer"); await vi.waitFor(() => expect(onStatus).toHaveBeenCalledWith("listening")); - const readyEvent = onTalkEvent.mock.calls[0]?.[0]; - expect(readyEvent?.type).toBe("session.ready"); - expect(readyEvent?.sessionId).toBe("main:google:provider-websocket"); - expect(readyEvent?.transport).toBe("provider-websocket"); + const readyEvent = requireFirstTalkEvent(onTalkEvent); + expect(readyEvent.type).toBe("session.ready"); + expect(readyEvent.sessionId).toBe("main:google:provider-websocket"); + expect(readyEvent.transport).toBe("provider-websocket"); }); it("decodes Blob setup messages", async () => { diff --git a/ui/src/ui/realtime-talk-webrtc.test.ts b/ui/src/ui/realtime-talk-webrtc.test.ts index 437e725d41f..06a0da54dd6 100644 --- a/ui/src/ui/realtime-talk-webrtc.test.ts +++ b/ui/src/ui/realtime-talk-webrtc.test.ts @@ -46,6 +46,21 @@ class FakePeerConnection extends EventTarget { } } +function requireTalkEvent( + onTalkEvent: ReturnType, + index: number, +): Record { + const call = onTalkEvent.mock.calls[index]; + if (!call) { + throw new Error(`expected talk event at index ${index}`); + } + const [event] = call; + if (!event || typeof event !== "object" || Array.isArray(event)) { + throw new Error(`expected talk event record at index ${index}`); + } + return event as Record; +} + describe("WebRtcSdpRealtimeTalkTransport", () => { afterEach(() => { vi.unstubAllGlobals(); @@ -237,12 +252,12 @@ describe("WebRtcSdpRealtimeTalkTransport", () => { "output.text.done", ]); expect(onTalkEvent.mock.calls.map(([event]) => event.turnId)).toEqual(["turn-1", "turn-1"]); - const userTranscriptEvent = onTalkEvent.mock.calls[0]?.[0]; + const userTranscriptEvent = requireTalkEvent(onTalkEvent, 0); expect(userTranscriptEvent.itemId).toBe("input-1"); expect(userTranscriptEvent.payload).toEqual({ role: "user", text: "hello" }); expect(userTranscriptEvent.sessionId).toBe("main:openai:webrtc"); expect(userTranscriptEvent.transport).toBe("webrtc"); - const assistantTranscriptEvent = onTalkEvent.mock.calls[1]?.[0]; + const assistantTranscriptEvent = requireTalkEvent(onTalkEvent, 1); expect(assistantTranscriptEvent.itemId).toBe("response-1"); expect(assistantTranscriptEvent.payload).toEqual({ text: "hi there" }); expect(assistantTranscriptEvent.sessionId).toBe("main:openai:webrtc");