257 lines
7.6 KiB
TypeScript
257 lines
7.6 KiB
TypeScript
import { afterAll, beforeAll, describe, expect, it } from '@jest/globals';
|
|
import { MeetRecordingAccess, MeetRoom } from '@openvidu-meet/typings';
|
|
import { Express } from 'express';
|
|
import request from 'supertest';
|
|
import { INTERNAL_CONFIG } from '../../../../src/config/internal-config.js';
|
|
import { MEET_ENV } from '../../../../src/environment.js';
|
|
import { expectValidRoom } from '../../../helpers/assertion-helpers.js';
|
|
import {
|
|
createRoom,
|
|
deleteAllRecordings,
|
|
deleteAllRooms,
|
|
getFullPath,
|
|
getRoomConfig,
|
|
startRecording,
|
|
startTestServer,
|
|
updateRoomConfig
|
|
} from '../../../helpers/request-helpers.js';
|
|
import { setupMultiRoomTestContext } from '../../../helpers/test-scenarios.js';
|
|
|
|
const ROOMS_PATH = getFullPath(`${INTERNAL_CONFIG.API_BASE_PATH_V1}/rooms`);
|
|
|
|
describe('E2EE Room Configuration Tests', () => {
|
|
let app: Express;
|
|
|
|
beforeAll(async () => {
|
|
app = await startTestServer();
|
|
});
|
|
|
|
afterAll(async () => {
|
|
await deleteAllRecordings();
|
|
await deleteAllRooms();
|
|
});
|
|
|
|
describe('E2EE Default Configuration', () => {
|
|
it('Should create a room with E2EE disabled by default', async () => {
|
|
const room = await createRoom({
|
|
roomName: 'Test E2EE Default'
|
|
});
|
|
|
|
expectValidRoom(room, 'Test E2EE Default');
|
|
expect(room.config.e2ee).toBeDefined();
|
|
expect(room.config.e2ee.enabled).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('E2EE Enabled Configuration', () => {
|
|
it('Should create a room with E2EE enabled and recording automatically disabled', async () => {
|
|
const payload = {
|
|
roomName: 'Test E2EE Enabled',
|
|
config: {
|
|
recording: {
|
|
enabled: true, // This should be automatically disabled
|
|
allowAccessTo: MeetRecordingAccess.ADMIN_MODERATOR_SPEAKER
|
|
},
|
|
chat: { enabled: true },
|
|
virtualBackground: { enabled: true },
|
|
e2ee: { enabled: true },
|
|
captions: { enabled: true }
|
|
}
|
|
};
|
|
|
|
const room = await createRoom(payload);
|
|
|
|
expect(room.roomName).toBe('Test E2EE Enabled');
|
|
expect(room.config.e2ee.enabled).toBe(true);
|
|
expect(room.config.recording.enabled).toBe(false); // Recording should be disabled
|
|
});
|
|
});
|
|
|
|
describe('E2EE and Recording Interaction', () => {
|
|
it('Should not allow starting recording in a room with E2EE enabled', async () => {
|
|
const context = await setupMultiRoomTestContext(1, true, {
|
|
e2ee: { enabled: true }
|
|
});
|
|
|
|
const { room } = context.getRoomByIndex(0)!;
|
|
|
|
// Try to start recording (should fail because recording is not enabled in room config)
|
|
const response = await startRecording(room.roomId);
|
|
|
|
// The endpoint returns 403 when the recording endpoint doesn't exist for disabled recording rooms
|
|
expect(response.status).toBe(403);
|
|
expect(response.body.message).toBe(`Recording is disabled for room '${room.roomId}'`);
|
|
});
|
|
|
|
it('Should disable recording when updating room config to enable E2EE', async () => {
|
|
// Create room with recording enabled and E2EE disabled
|
|
const room = await createRoom({
|
|
roomName: 'Test E2EE Update',
|
|
config: {
|
|
recording: {
|
|
enabled: true,
|
|
allowAccessTo: MeetRecordingAccess.ADMIN_MODERATOR_SPEAKER
|
|
},
|
|
chat: { enabled: true },
|
|
virtualBackground: { enabled: true },
|
|
e2ee: { enabled: false },
|
|
captions: { enabled: true }
|
|
}
|
|
});
|
|
|
|
expect(room.config.recording.enabled).toBe(true);
|
|
expect(room.config.e2ee?.enabled).toBe(false);
|
|
|
|
// Update room to enable E2EE (recording should be automatically disabled)
|
|
const updatedConfig = {
|
|
e2ee: { enabled: true }
|
|
};
|
|
const response = await updateRoomConfig(room.roomId, updatedConfig);
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
// Fetch the updated room to verify changes
|
|
const { status, body: config } = await getRoomConfig(room.roomId);
|
|
|
|
expect(status).toBe(200);
|
|
expect(config.e2ee.enabled).toBe(true);
|
|
expect(config.recording.enabled).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('E2EE Validation Tests', () => {
|
|
it('Should fail when e2ee is not an object', async () => {
|
|
const payload = {
|
|
roomName: 'Test Invalid E2EE',
|
|
config: {
|
|
recording: {
|
|
enabled: true,
|
|
allowAccessTo: MeetRecordingAccess.ADMIN_MODERATOR_SPEAKER
|
|
},
|
|
chat: { enabled: true },
|
|
virtualBackground: { enabled: true },
|
|
e2ee: 'invalid-e2ee', // Should be an object
|
|
captions: { enabled: true }
|
|
}
|
|
};
|
|
|
|
const response = await request(app)
|
|
.post(ROOMS_PATH)
|
|
.set(INTERNAL_CONFIG.API_KEY_HEADER, MEET_ENV.INITIAL_API_KEY)
|
|
.send(payload)
|
|
.expect(422);
|
|
|
|
expect(JSON.stringify(response.body.details)).toContain('Expected object');
|
|
});
|
|
|
|
it('Should fail when e2ee.enabled is not a boolean', async () => {
|
|
const payload = {
|
|
roomName: 'Test Invalid E2EE Enabled',
|
|
config: {
|
|
recording: {
|
|
enabled: true,
|
|
allowAccessTo: MeetRecordingAccess.ADMIN_MODERATOR_SPEAKER
|
|
},
|
|
chat: { enabled: true },
|
|
virtualBackground: { enabled: true },
|
|
e2ee: { enabled: 'yes' }, // Should be a boolean
|
|
captions: { enabled: true }
|
|
}
|
|
};
|
|
|
|
const response = await request(app)
|
|
.post(ROOMS_PATH)
|
|
.set(INTERNAL_CONFIG.API_KEY_HEADER, MEET_ENV.INITIAL_API_KEY)
|
|
.send(payload)
|
|
.expect(422);
|
|
|
|
expect(JSON.stringify(response.body.details)).toContain('Expected boolean');
|
|
});
|
|
});
|
|
|
|
describe('E2EE Update Configuration Tests', () => {
|
|
it('Should successfully update room config with E2EE disabled to enabled', async () => {
|
|
const room = await createRoom({
|
|
roomName: 'Test E2EE Update Enabled'
|
|
});
|
|
|
|
expect(room.config.e2ee.enabled).toBe(false);
|
|
|
|
const { status, body } = await updateRoomConfig(room.roomId, {
|
|
recording: {
|
|
enabled: false,
|
|
allowAccessTo: MeetRecordingAccess.ADMIN_MODERATOR_SPEAKER
|
|
},
|
|
chat: { enabled: true },
|
|
virtualBackground: { enabled: true },
|
|
e2ee: { enabled: true },
|
|
captions: { enabled: true }
|
|
});
|
|
|
|
expect(status).toBe(200);
|
|
expect(body.message).toBeDefined();
|
|
|
|
// Fetch the updated room to verify changes
|
|
const { body: config } = await getRoomConfig(room.roomId);
|
|
|
|
expect(config.e2ee.enabled).toBe(true);
|
|
expect(config.recording.enabled).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('E2EE and Room Status Tests', () => {
|
|
it('Should return E2EE configuration when listing rooms', async () => {
|
|
await deleteAllRooms();
|
|
|
|
const room1 = await createRoom({
|
|
roomName: 'E2EE Enabled Room',
|
|
config: {
|
|
recording: {
|
|
enabled: false,
|
|
allowAccessTo: MeetRecordingAccess.ADMIN_MODERATOR_SPEAKER
|
|
},
|
|
chat: { enabled: true },
|
|
virtualBackground: { enabled: true },
|
|
e2ee: { enabled: true },
|
|
captions: { enabled: true }
|
|
}
|
|
});
|
|
|
|
const room2 = await createRoom({
|
|
roomName: 'E2EE Disabled Room',
|
|
config: {
|
|
recording: {
|
|
enabled: true,
|
|
allowAccessTo: MeetRecordingAccess.ADMIN_MODERATOR_SPEAKER
|
|
},
|
|
chat: { enabled: true },
|
|
virtualBackground: { enabled: true },
|
|
e2ee: { enabled: false },
|
|
captions: { enabled: true }
|
|
}
|
|
});
|
|
|
|
const response = await request(app)
|
|
.get(ROOMS_PATH)
|
|
.set(INTERNAL_CONFIG.API_KEY_HEADER, MEET_ENV.INITIAL_API_KEY)
|
|
.expect(200);
|
|
|
|
// Filter out any rooms from other test suites
|
|
const testRooms = response.body.rooms.filter(
|
|
(r: MeetRoom) => r.roomId === room1.roomId || r.roomId === room2.roomId
|
|
);
|
|
|
|
expect(testRooms).toHaveLength(2);
|
|
|
|
const e2eeEnabledRoom = testRooms.find((r: MeetRoom) => r.roomId === room1.roomId);
|
|
const e2eeDisabledRoom = testRooms.find((r: MeetRoom) => r.roomId === room2.roomId);
|
|
|
|
expect(e2eeEnabledRoom.config.e2ee.enabled).toBe(true);
|
|
expect(e2eeEnabledRoom.config.recording.enabled).toBe(false);
|
|
|
|
expect(e2eeDisabledRoom.config.e2ee.enabled).toBe(false);
|
|
expect(e2eeDisabledRoom.config.recording.enabled).toBe(true);
|
|
});
|
|
});
|
|
});
|