test: guard realtime talk mock events

This commit is contained in:
Peter Steinberger 2026-05-11 23:32:16 +01:00
parent ddf83d16f7
commit 5f2bd36180
No known key found for this signature in database
2 changed files with 33 additions and 6 deletions

View file

@ -171,6 +171,18 @@ function latestWebSocket(): MockGoogleLiveWebSocket {
return ws;
}
function requireFirstTalkEvent(onTalkEvent: ReturnType<typeof vi.fn>): Record<string, unknown> {
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<string, unknown>;
}
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 () => {

View file

@ -46,6 +46,21 @@ class FakePeerConnection extends EventTarget {
}
}
function requireTalkEvent(
onTalkEvent: ReturnType<typeof vi.fn>,
index: number,
): Record<string, unknown> {
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<string, unknown>;
}
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");