test: update recording test for avoiding garbage recordings

This commit is contained in:
Carlos Santos 2025-06-04 13:49:28 +02:00
parent 7532b44043
commit c51ea8e18c
2 changed files with 19 additions and 9 deletions

View File

@ -36,9 +36,9 @@ export interface TestContext {
* @param withParticipant Whether to join a fake participant in the room. * @param withParticipant Whether to join a fake participant in the room.
* @returns Room data including secrets and cookies. * @returns Room data including secrets and cookies.
*/ */
export const setupSingleRoom = async (withParticipant = false): Promise<RoomData> => { export const setupSingleRoom = async (roomPrefix: string, withParticipant = false): Promise<RoomData> => {
const room = await createRoom({ const room = await createRoom({
roomIdPrefix: 'TEST_ROOM' roomIdPrefix: roomPrefix
}); });
// Extract the room secrets and generate participant tokens, saved as cookies // Extract the room secrets and generate participant tokens, saved as cookies
@ -70,7 +70,7 @@ export const setupMultiRoomTestContext = async (numRooms: number, withParticipan
const rooms: RoomData[] = []; const rooms: RoomData[] = [];
for (let i = 0; i < numRooms; i++) { for (let i = 0; i < numRooms; i++) {
const roomData = await setupSingleRoom(withParticipants); const roomData = await setupSingleRoom('TEST_ROOM', withParticipants);
rooms.push(roomData); rooms.push(roomData);
} }
@ -98,7 +98,7 @@ export const setupSingleRoomWithRecording = async (
stopRecordingCond = false, stopRecordingCond = false,
stopDelay?: StringValue stopDelay?: StringValue
): Promise<RoomData> => { ): Promise<RoomData> => {
const roomData = await setupSingleRoom(true); const roomData = await setupSingleRoom('TEST_ROOM', true);
const response = await startRecording(roomData.room.roomId, roomData.moderatorCookie); const response = await startRecording(roomData.room.roomId, roomData.moderatorCookie);
expectValidStartRecordingResponse(response, roomData.room.roomId); expectValidStartRecordingResponse(response, roomData.room.roomId);
roomData.recordingId = response.body.recordingId; roomData.recordingId = response.body.recordingId;

View File

@ -79,6 +79,7 @@ describe('Recording API Race Conditions Tests', () => {
expect(startRoomCompositeSpy).toHaveBeenCalled(); expect(startRoomCompositeSpy).toHaveBeenCalled();
console.log('Recording start response:', result.body); console.log('Recording start response:', result.body);
expect(result.status).toBe(500); // Service Unavailable due to failure expect(result.status).toBe(500); // Service Unavailable due to failure
expect(result.body.error).toContain('Internal Server Error');
} finally { } finally {
// Cleanup // Cleanup
startRoomCompositeSpy.mockRestore(); startRoomCompositeSpy.mockRestore();
@ -95,13 +96,21 @@ describe('Recording API Race Conditions Tests', () => {
context = await setupMultiRoomTestContext(1, true); context = await setupMultiRoomTestContext(1, true);
const roomData = context.getRoomByIndex(0)!; const roomData = context.getRoomByIndex(0)!;
// Track active mock promises to ensure we can handle timeouts correctly
const activeMockPromises: Promise<any>[] = [];
// Mock the startRoomComposite method to simulate a delay // Mock the startRoomComposite method to simulate a delay
// const originalStartRoomComposite = recordingService['livekitService'].startRoomComposite; // const originalStartRoomComposite = recordingService['livekitService'].startRoomComposite;
const startRoomCompositeSpy = jest const startRoomCompositeSpy = jest
.spyOn(recordingService['livekitService'], 'startRoomComposite') .spyOn(recordingService['livekitService'], 'startRoomComposite')
.mockImplementation(async (...args) => { .mockImplementation(async (...args) => {
await sleep('6s'); // Longer than 3s timeout const mockPromise = (async () => {
throw new Error('Request failed with status 503: Service Unavailable'); await sleep('4s'); // Longer than 1s timeout
throw new Error('Request failed with status 503: Service Unavailable');
})();
activeMockPromises.push(mockPromise);
return mockPromise;
}); });
// Mock the handleRecordingLockTimeout method to prevent actual timeout handling // Mock the handleRecordingLockTimeout method to prevent actual timeout handling
@ -121,13 +130,14 @@ describe('Recording API Race Conditions Tests', () => {
roomData.room.roomId roomData.room.roomId
); );
expect(releaseLockSpy).toHaveBeenCalled(); expect(releaseLockSpy).toHaveBeenCalled();
expect(startRoomCompositeSpy).toHaveBeenCalled(); expect(startRoomCompositeSpy).toHaveBeenCalledTimes(1);
console.log('Recording start response:', result.body); console.log('Recording start response:', result.body);
expect(result.body.message).toContain('timed out while starting'); expect(result.body.message).toContain('timed out while starting');
expect(result.status).toBe(503); // Service Unavailable due to timeout expect(result.status).toBe(503); // Service Unavailable due to timeout
await Promise.allSettled(activeMockPromises);
} finally { } finally {
// Cleanup // Cleanup after mock finishes
startRoomCompositeSpy.mockRestore(); startRoomCompositeSpy.mockRestore();
handleTimeoutSpy.mockRestore(); handleTimeoutSpy.mockRestore();
releaseLockSpy.mockRestore(); releaseLockSpy.mockRestore();
@ -159,7 +169,7 @@ describe('Recording API Race Conditions Tests', () => {
if (callCount === 1) { if (callCount === 1) {
// First call (room1) - timeout // First call (room1) - timeout
await sleep('5s'); await sleep('5s');
return originalStartRoomComposite.apply(recordingService['livekitService'], args); throw new Error('Request failed with status 503: Service Unavailable');
} else { } else {
// Subsequent calls - work normally // Subsequent calls - work normally
return originalStartRoomComposite.apply(recordingService['livekitService'], args); return originalStartRoomComposite.apply(recordingService['livekitService'], args);