Skip to content

Commit 5cc00ad

Browse files
committed
Wait for async functions in tests
1 parent 678ad38 commit 5cc00ad

File tree

1 file changed

+72
-17
lines changed

1 file changed

+72
-17
lines changed

spec/unit/matrixrtc/MatrixRTCSession.spec.ts

Lines changed: 72 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -244,35 +244,64 @@ describe("MatrixRTCSession", () => {
244244
foci_preferred: [mockFocus],
245245
};
246246

247-
function testSession(
247+
let sendStateEventMock: jest.Mock;
248+
let sendStateFutureMock: jest.Mock;
249+
250+
let sentStateEvent: Promise<void>;
251+
let sentStateFuture: Promise<void>;
252+
253+
beforeEach(() => {
254+
sentStateEvent = new Promise((resolve) => {
255+
sendStateEventMock = jest.fn(resolve);
256+
});
257+
sentStateFuture = new Promise((resolve) => {
258+
sendStateFutureMock = jest.fn(() => {
259+
resolve();
260+
return {
261+
future_group_id: "g",
262+
send_token: "s",
263+
cancel_token: "c",
264+
refresh_token: "r",
265+
};
266+
});
267+
});
268+
client.sendStateEvent = sendStateEventMock;
269+
client._unstable_sendStateFuture = sendStateFutureMock;
270+
});
271+
272+
async function testSession(
248273
membershipData: CallMembershipData[] | SessionMembershipData,
249274
shouldUseLegacy: boolean,
250-
): void {
275+
): Promise<void> {
251276
sess = MatrixRTCSession.roomSessionForRoom(client, makeMockRoom(membershipData));
252277

253278
const makeNewLegacyMembershipsMock = jest.spyOn(sess as any, "makeNewLegacyMemberships");
254279
const makeNewMembershipMock = jest.spyOn(sess as any, "makeNewMembership");
255280

256281
sess.joinRoomSession([mockFocus], mockFocus, joinSessionConfig);
282+
await Promise.race([sentStateEvent, new Promise((resolve) => setTimeout(resolve, 500))]);
257283

258284
expect(makeNewLegacyMembershipsMock).toHaveBeenCalledTimes(shouldUseLegacy ? 1 : 0);
259285
expect(makeNewMembershipMock).toHaveBeenCalledTimes(shouldUseLegacy ? 0 : 1);
286+
287+
await Promise.race([sentStateFuture, new Promise((resolve) => setTimeout(resolve, 500))]);
288+
expect(client._unstable_sendStateFuture).toHaveBeenCalledTimes(shouldUseLegacy ? 0 : 1);
260289
}
261290

262-
it("uses legacy events if there are any active legacy calls", () => {
263-
testSession([expiredLegacyMembershipData, legacyMembershipData, sessionMembershipData], true);
291+
it("uses legacy events if there are any active legacy calls", async () => {
292+
await testSession([expiredLegacyMembershipData, legacyMembershipData, sessionMembershipData], true);
264293
});
265294

266-
it('uses legacy events if a non-legacy call is in a "memberships" array', () => {
267-
testSession([sessionMembershipData], true);
295+
it('uses legacy events if a non-legacy call is in a "memberships" array', async () => {
296+
await testSession([sessionMembershipData], true);
268297
});
269298

270-
it("uses non-legacy events if all legacy calls are expired", () => {
271-
testSession([expiredLegacyMembershipData], false);
299+
it("uses non-legacy events if all legacy calls are expired", async () => {
300+
await testSession([expiredLegacyMembershipData], false);
272301
});
273302

274-
it("uses non-legacy events if there are only non-legacy calls", () => {
275-
testSession(sessionMembershipData, false);
303+
it("uses non-legacy events if there are only non-legacy calls", async () => {
304+
await testSession(sessionMembershipData, false);
276305
});
277306
});
278307

@@ -350,12 +379,30 @@ describe("MatrixRTCSession", () => {
350379
describe("joining", () => {
351380
let mockRoom: Room;
352381
let sendStateEventMock: jest.Mock;
382+
let sendStateFutureMock: jest.Mock;
353383
let sendEventMock: jest.Mock;
354384

385+
let sentStateEvent: Promise<void>;
386+
let sentStateFuture: Promise<void>;
387+
355388
beforeEach(() => {
356-
sendStateEventMock = jest.fn();
389+
sentStateEvent = new Promise((resolve) => {
390+
sendStateEventMock = jest.fn(resolve);
391+
});
392+
sentStateFuture = new Promise((resolve) => {
393+
sendStateFutureMock = jest.fn(() => {
394+
resolve();
395+
return {
396+
future_group_id: "g",
397+
send_token: "s",
398+
cancel_token: "c",
399+
refresh_token: "r",
400+
};
401+
});
402+
});
357403
sendEventMock = jest.fn();
358404
client.sendStateEvent = sendStateEventMock;
405+
client._unstable_sendStateFuture = sendStateFutureMock;
359406
client.sendEvent = sendEventMock;
360407

361408
mockRoom = makeMockRoom([]);
@@ -376,9 +423,11 @@ describe("MatrixRTCSession", () => {
376423
expect(sess!.isJoined()).toEqual(true);
377424
});
378425

379-
it("sends a membership event when joining a call", () => {
426+
it("sends a membership event when joining a call", async () => {
427+
const realSetTimeout = setTimeout;
380428
jest.useFakeTimers();
381429
sess!.joinRoomSession([mockFocus], mockFocus);
430+
await Promise.race([sentStateEvent, new Promise((resolve) => realSetTimeout(resolve, 500))]);
382431
expect(client.sendStateEvent).toHaveBeenCalledWith(
383432
mockRoom!.roomId,
384433
EventType.GroupCallMemberPrefix,
@@ -399,20 +448,24 @@ describe("MatrixRTCSession", () => {
399448
},
400449
"@alice:example.org",
401450
);
451+
await Promise.race([sentStateFuture, new Promise((resolve) => realSetTimeout(resolve, 500))]);
452+
expect(client._unstable_sendStateFuture).toHaveBeenCalledTimes(0);
402453
jest.useRealTimers();
403454
});
404455

405456
describe("non-legacy calls", () => {
406457
const activeFocusConfig = { type: "livekit", livekit_service_url: "https://active.url" };
407458
const activeFocus = { type: "livekit", focus_selection: "oldest_membership" };
408459

409-
function testJoin(useOwnedStateEvents: boolean): void {
460+
async function testJoin(useOwnedStateEvents: boolean): Promise<void> {
461+
const realSetTimeout = setTimeout;
410462
if (useOwnedStateEvents) {
411463
mockRoom.getVersion = jest.fn().mockReturnValue("org.matrix.msc3779.default");
412464
}
413465

414466
jest.useFakeTimers();
415467
sess!.joinRoomSession([activeFocusConfig], activeFocus, { useLegacyMemberEvents: false });
468+
await Promise.race([sentStateEvent, new Promise((resolve) => realSetTimeout(resolve, 500))]);
416469
expect(client.sendStateEvent).toHaveBeenCalledWith(
417470
mockRoom!.roomId,
418471
EventType.GroupCallMemberPrefix,
@@ -426,15 +479,17 @@ describe("MatrixRTCSession", () => {
426479
} satisfies SessionMembershipData,
427480
`${!useOwnedStateEvents ? "_" : ""}@alice:example.org_AAAAAAA`,
428481
);
482+
await Promise.race([sentStateFuture, new Promise((resolve) => realSetTimeout(resolve, 500))]);
483+
expect(client._unstable_sendStateFuture).toHaveBeenCalledTimes(1);
429484
jest.useRealTimers();
430485
}
431486

432-
it("sends a membership event with session payload when joining a non-legacy call", () => {
433-
testJoin(false);
487+
it("sends a membership event with session payload when joining a non-legacy call", async () => {
488+
await testJoin(false);
434489
});
435490

436-
it("does not prefix the state key with _ for rooms that support user-owned state events", () => {
437-
testJoin(true);
491+
it("does not prefix the state key with _ for rooms that support user-owned state events", async () => {
492+
await testJoin(true);
438493
});
439494
});
440495

0 commit comments

Comments
 (0)