test: require voice-call async gates

This commit is contained in:
Peter Steinberger
2026-05-08 19:11:44 +01:00
parent a91267c1d9
commit c8d7db55ad
2 changed files with 29 additions and 13 deletions

View File

@@ -40,12 +40,15 @@ const createDeferred = (): {
resolve: () => void;
reject: (error: Error) => void;
} => {
let resolve!: () => void;
let reject!: (error: Error) => void;
let resolve: (() => void) | undefined;
let reject: ((error: Error) => void) | undefined;
const promise = new Promise<void>((resolvePromise, rejectPromise) => {
resolve = resolvePromise;
reject = rejectPromise;
});
if (!resolve || !reject) {
throw new Error("Expected deferred callbacks to be initialized");
}
return { promise, resolve, reject };
};
@@ -80,10 +83,13 @@ describe("MediaStreamHandler TTS queue", () => {
const started: number[] = [];
const finished: number[] = [];
let resolveFirst!: () => void;
let resolveFirst: (() => void) | undefined;
const firstGate = new Promise<void>((resolve) => {
resolveFirst = resolve;
});
if (!resolveFirst) {
throw new Error("Expected first TTS gate resolver to be initialized");
}
const first = handler.queueTts("stream-1", async () => {
started.push(1);

View File

@@ -1081,14 +1081,19 @@ describe("VoiceCallWebhookServer pre-auth webhook guards", () => {
const server = new VoiceCallWebhookServer(config, manager, twilioProvider);
let enteredReads = 0;
let releaseReads!: () => void;
let unblockReadBodies!: () => void;
let releaseReads: (() => void) | undefined;
let unblockReadBodies: (() => void) | undefined;
const enteredEightReads = new Promise<void>((resolve) => {
releaseReads = resolve;
});
const unblockReads = new Promise<void>((resolve) => {
unblockReadBodies = resolve;
});
if (!releaseReads || !unblockReadBodies) {
throw new Error("Expected webhook read gates to be initialized");
}
const releaseEnteredReads = releaseReads;
const unblockStartedReads = unblockReadBodies;
const readBodySpy = vi.spyOn(
server as unknown as {
readBody: (req: unknown, maxBytes: number, timeoutMs?: number) => Promise<string>;
@@ -1098,7 +1103,7 @@ describe("VoiceCallWebhookServer pre-auth webhook guards", () => {
readBodySpy.mockImplementation(async () => {
enteredReads += 1;
if (enteredReads === 8) {
releaseReads();
releaseEnteredReads();
}
if (enteredReads <= 8) {
await unblockReads;
@@ -1118,12 +1123,12 @@ describe("VoiceCallWebhookServer pre-auth webhook guards", () => {
expect(rejected.status).toBe(429);
expect(await rejected.text()).toBe("Too Many Requests");
unblockReadBodies();
unblockStartedReads();
const settled = await Promise.all(inFlightRequests);
expect(settled.map((response) => response.status)).toEqual(Array(8).fill(200));
} finally {
unblockReadBodies();
unblockStartedReads();
readBodySpy.mockRestore();
await server.stop();
}
@@ -1148,14 +1153,19 @@ describe("VoiceCallWebhookServer pre-auth webhook guards", () => {
).runWebhookPipeline.bind(server);
let enteredReads = 0;
let releaseReads!: () => void;
let unblockReadBodies!: () => void;
let releaseReads: (() => void) | undefined;
let unblockReadBodies: (() => void) | undefined;
const enteredEightReads = new Promise<void>((resolve) => {
releaseReads = resolve;
});
const unblockReads = new Promise<void>((resolve) => {
unblockReadBodies = resolve;
});
if (!releaseReads || !unblockReadBodies) {
throw new Error("Expected webhook read gates to be initialized");
}
const releaseEnteredReads = releaseReads;
const unblockStartedReads = unblockReadBodies;
const readBodySpy = vi.spyOn(
server as unknown as {
readBody: (req: unknown, maxBytes: number, timeoutMs?: number) => Promise<string>;
@@ -1165,7 +1175,7 @@ describe("VoiceCallWebhookServer pre-auth webhook guards", () => {
readBodySpy.mockImplementation(async () => {
enteredReads += 1;
if (enteredReads === 8) {
releaseReads();
releaseEnteredReads();
}
await unblockReads;
return "CallSid=CA123&SpeechResult=hello";
@@ -1193,12 +1203,12 @@ describe("VoiceCallWebhookServer pre-auth webhook guards", () => {
expect(rejected.body).toBe("Too Many Requests");
expect(readBodySpy).toHaveBeenCalledTimes(8);
unblockReadBodies();
unblockStartedReads();
const settled = await Promise.all(inFlightRequests);
expect(settled.map((response) => response.statusCode)).toEqual(Array(8).fill(200));
} finally {
unblockReadBodies();
unblockStartedReads();
readBodySpy.mockRestore();
}
});