diff --git a/backend/tests/integration/api/rooms/get-room.test.ts b/backend/tests/integration/api/rooms/get-room.test.ts new file mode 100644 index 0000000..f4adb8a --- /dev/null +++ b/backend/tests/integration/api/rooms/get-room.test.ts @@ -0,0 +1,133 @@ +import { describe, it, expect, beforeAll, afterAll, afterEach } from '@jest/globals'; +import { createRoom, deleteAllRooms, startTestServer, stopTestServer, getRoom } from '../../../utils/helpers.js'; + +describe('OpenVidu Meet Room API Tests', () => { + beforeAll(async () => { + await startTestServer(); + }); + + afterAll(async () => { + await stopTestServer(); + }); + + afterEach(async () => { + // Remove all rooms created + await deleteAllRooms(); + }); + + describe('Get Room Tests', () => { + it('should successfully retrieve a room by its ID', async () => { + const createdRoom = await createRoom({ + roomIdPrefix: 'test-room' + }); + + const response = await getRoom(createdRoom.roomId); + expect(response.status).toBe(200); + expect(response.body).toBeDefined(); + expect(response.body.roomIdPrefix).toBe('test-room'); + + expect(response.body.roomId).toBe(createdRoom.roomId); + expect(response.body.creationDate).toBeDefined(); + expect(response.body.autoDeletionDate).not.toBeDefined(); + expect(response.body.preferences).toEqual({ + recordingPreferences: { enabled: true }, + chatPreferences: { enabled: true }, + virtualBackgroundPreferences: { enabled: true } + }); + expect(response.body.moderatorRoomUrl).toBeDefined(); + expect(response.body.publisherRoomUrl).toBeDefined(); + }); + + it('should retrieve a room with custom preferences', async () => { + // Create a room with custom preferences + const createdRoom = await createRoom({ + roomIdPrefix: 'custom-prefs', + preferences: { + recordingPreferences: { enabled: false }, + chatPreferences: { enabled: false }, + virtualBackgroundPreferences: { enabled: true } + } + }); + + // Get the roomId from the created room + const roomId = createdRoom.roomId; + + // Retrieve the room by its ID + const response = await getRoom(roomId); + + // Verify custom preferences + expect(response.status).toBe(200); + expect(response.body.roomId).toBe(roomId); + expect(response.body.preferences).toEqual({ + recordingPreferences: { enabled: false }, + chatPreferences: { enabled: false }, + virtualBackgroundPreferences: { enabled: true } + }); + }); + + it('should retrieve only specified fields when using fields parameter', async () => { + // Create a room + const createdRoom = await createRoom({ + roomIdPrefix: 'field-filtered' + }); + + // Get the room with field filtering + const response = await getRoom(createdRoom.roomId, 'roomId,roomIdPrefix'); + + // Verify that only the requested fields are returned + expect(response.status).toBe(200); + expect(response.body.roomId).toBeDefined(); + expect(response.body.roomIdPrefix).toBeDefined(); + + // Other fields should not be present + expect(response.body.creationDate).not.toBeDefined(); + expect(response.body.preferences).not.toBeDefined(); + expect(response.body.moderatorRoomUrl).not.toBeDefined(); + expect(response.body.publisherRoomUrl).not.toBeDefined(); + }); + + it('should handle roomId with characters that need sanitization', async () => { + // Create a room + const createdRoom = await createRoom({ + roomIdPrefix: 'test-room' + }); + + const dirtyRoomId = ' ' + createdRoom.roomId + ' '; // Add spaces that should be trimmed + + const response = await getRoom(dirtyRoomId); + + // The endpoint should sanitize the roomId and still find the room + expect(response.status).toBe(200); + expect(response.body.roomId).toBe(createdRoom.roomId); + }); + + it('should retrieve a room with autoDeletionDate', async () => { + // Use validAutoDeletionDate that's defined in the test file or create here + const validAutoDeletionDate = Date.now() + 2 * 60 * 60 * 1000; // 2 hours ahead + + // Create a room with autoDeletionDate + const createdRoom = await createRoom({ + roomIdPrefix: 'deletion-date', + autoDeletionDate: validAutoDeletionDate + }); + + // Get the room + const response = await getRoom(createdRoom.roomId); + + // Verify autoDeletionDate + expect(response.status).toBe(200); + expect(response.body.autoDeletionDate).toBe(validAutoDeletionDate); + }); + }); + + describe('Get Room Validation failures', () => { + it('should fail when roomId becomes empty after sanitization', async () => { + const response = await getRoom('!!-*!@#$%^&*()_+{}|:"<>?'); + + expect(response.status).toBe(422); + // Expect an error message indicating the resulting roomId is empty. + expect(response.body.error).toContain('Unprocessable Entity'); + expect(JSON.stringify(response.body.details)).toContain('roomId cannot be empty after sanitization'); + }); + }); +}); diff --git a/backend/tests/utils/helpers.ts b/backend/tests/utils/helpers.ts index 244cd59..aa55b0b 100644 --- a/backend/tests/utils/helpers.ts +++ b/backend/tests/utils/helpers.ts @@ -194,6 +194,25 @@ export const assertSuccessRoomsResponse = ( expect(body.pagination.maxItems).toBe(expectedMaxItems); }; +/** + * Retrieves information about a specific room from the API. + * + * @param roomId - The unique identifier of the room to retrieve + * @param fields - Optional fields to filter in the response + * @returns A Promise that resolves to the room data + * @throws Error if the app instance is not defined + */ +export const getRoom = async (roomId: string, fields?: string) => { + if (!app) { + throw new Error('App instance is not defined'); + } + + return await request(app) + .get(`${MEET_API_BASE_PATH_V1}/rooms/${roomId}`) + .set(API_KEY_HEADER, MEET_API_KEY) + .query({ fields }); +}; + export const assertEmptyRooms = async () => { if (!app) { throw new Error('App instance is not defined');