diff --git a/extensions/voice-call/src/manager.closed-loop.test.ts b/extensions/voice-call/src/manager.closed-loop.test.ts index 298ccf4964b0..1aaf2cf09cdf 100644 --- a/extensions/voice-call/src/manager.closed-loop.test.ts +++ b/extensions/voice-call/src/manager.closed-loop.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest"; +import { describe, expect, it, vi } from "vitest"; import { createManagerHarness, FakeProvider, markCallAnswered } from "./manager.test-harness.js"; function requireCall( @@ -20,6 +20,18 @@ function requireTurnToken(provider: Awaited>["manager"], + callId: string, +) { + const waiters = ( + manager as unknown as { + transcriptWaiters: Map; + } + ).transcriptWaiters; + expect(waiters.has(callId)).toBe(true); +} + describe("CallManager closed-loop turns", () => { it("completes a closed-loop turn without live audio", async () => { const { manager, provider } = await createManagerHarness({ @@ -32,7 +44,10 @@ describe("CallManager closed-loop turns", () => { markCallAnswered(manager, started.callId, "evt-closed-loop-answered"); const turnPromise = manager.continueCall(started.callId, "How can I help?"); - await new Promise((resolve) => setTimeout(resolve, 0)); + await vi.waitFor(() => { + expect(provider.startListeningCalls).toHaveLength(1); + expectTranscriptWaiter(manager, started.callId); + }); manager.processEvent({ id: "evt-closed-loop-speech", @@ -107,7 +122,10 @@ describe("CallManager closed-loop turns", () => { markCallAnswered(manager, started.callId, "evt-turn-token-answered"); const turnPromise = manager.continueCall(started.callId, "Prompt"); - await new Promise((resolve) => setTimeout(resolve, 0)); + await vi.waitFor(() => { + expect(provider.startListeningCalls).toHaveLength(1); + expectTranscriptWaiter(manager, started.callId); + }); const expectedTurnToken = requireTurnToken(provider); @@ -122,11 +140,7 @@ describe("CallManager closed-loop turns", () => { turnToken: "wrong-token", }); - const pendingState = await Promise.race([ - turnPromise.then(() => "resolved"), - new Promise<"pending">((resolve) => setTimeout(() => resolve("pending"), 0)), - ]); - expect(pendingState).toBe("pending"); + expectTranscriptWaiter(manager, started.callId); manager.processEvent({ id: "evt-turn-token-good", @@ -158,7 +172,10 @@ describe("CallManager closed-loop turns", () => { markCallAnswered(manager, started.callId, "evt-multi-answered"); const firstTurn = manager.continueCall(started.callId, "First question"); - await new Promise((resolve) => setTimeout(resolve, 0)); + await vi.waitFor(() => { + expect(provider.startListeningCalls).toHaveLength(1); + expectTranscriptWaiter(manager, started.callId); + }); manager.processEvent({ id: "evt-multi-speech-1", type: "call.speech", @@ -171,7 +188,10 @@ describe("CallManager closed-loop turns", () => { await firstTurn; const secondTurn = manager.continueCall(started.callId, "Second question"); - await new Promise((resolve) => setTimeout(resolve, 0)); + await vi.waitFor(() => { + expect(provider.startListeningCalls).toHaveLength(2); + expectTranscriptWaiter(manager, started.callId); + }); manager.processEvent({ id: "evt-multi-speech-2", type: "call.speech", @@ -212,7 +232,10 @@ describe("CallManager closed-loop turns", () => { for (let i = 1; i <= 5; i++) { const turnPromise = manager.continueCall(started.callId, `Prompt ${i}`); - await new Promise((resolve) => setTimeout(resolve, 0)); + await vi.waitFor(() => { + expect(provider.startListeningCalls).toHaveLength(i); + expectTranscriptWaiter(manager, started.callId); + }); manager.processEvent({ id: `evt-loop-speech-${i}`, type: "call.speech", diff --git a/extensions/voice-call/src/manager.notify.test.ts b/extensions/voice-call/src/manager.notify.test.ts index a325f119dd64..c67e6cc3fdfe 100644 --- a/extensions/voice-call/src/manager.notify.test.ts +++ b/extensions/voice-call/src/manager.notify.test.ts @@ -91,7 +91,7 @@ function requireSingleStartListeningCall(provider: FakeProvider) { type HarnessManager = Awaited>["manager"]; async function waitForPlaybackDispatch() { - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => setImmediate(resolve)); } async function initiateCallWithMessage(