158 lines
5.2 KiB
TypeScript
158 lines
5.2 KiB
TypeScript
import { afterAll, beforeAll, beforeEach, describe, expect, it, jest } from '@jest/globals';
|
|
import { container } from '../../../../src/config/index.js';
|
|
import { LIVEKIT_URL } from '../../../../src/environment.js';
|
|
import { FrontendEventService, LiveKitService } from '../../../../src/services/index.js';
|
|
import { MeetTokenMetadata, ParticipantRole } from '../../../../src/typings/ce/index.js';
|
|
import { getPermissions } from '../../../helpers/assertion-helpers.js';
|
|
import {
|
|
deleteAllRooms,
|
|
deleteRoom,
|
|
disconnectFakeParticipants,
|
|
startTestServer,
|
|
updateParticipant,
|
|
updateParticipantMetadata
|
|
} from '../../../helpers/request-helpers.js';
|
|
import { RoomData, setupSingleRoom } from '../../../helpers/test-scenarios.js';
|
|
import { MeetSignalType } from '../../../../src/typings/ce/event.model.js';
|
|
|
|
const participantIdentity = 'TEST_PARTICIPANT';
|
|
|
|
describe('Meetings API Tests', () => {
|
|
let livekitService: LiveKitService;
|
|
let roomData: RoomData;
|
|
|
|
beforeAll(async () => {
|
|
startTestServer();
|
|
livekitService = container.get(LiveKitService);
|
|
});
|
|
|
|
afterAll(async () => {
|
|
await disconnectFakeParticipants();
|
|
await deleteAllRooms();
|
|
});
|
|
|
|
describe('Update Participant Tests', () => {
|
|
const setParticipantMetadata = async (roomId: string, role: ParticipantRole) => {
|
|
const metadata: MeetTokenMetadata = {
|
|
livekitUrl: LIVEKIT_URL,
|
|
roles: [
|
|
{
|
|
role: role,
|
|
permissions: getPermissions(roomId, role).openvidu
|
|
}
|
|
],
|
|
selectedRole: role
|
|
};
|
|
await updateParticipantMetadata(roomId, participantIdentity, metadata);
|
|
};
|
|
|
|
beforeEach(async () => {
|
|
roomData = await setupSingleRoom(true);
|
|
});
|
|
|
|
it('should update participant role from speaker to moderator', async () => {
|
|
const frontendEventService = container.get(FrontendEventService);
|
|
const sendSignalSpy = jest.spyOn(frontendEventService as any, 'sendSignal');
|
|
|
|
await setParticipantMetadata(roomData.room.roomId, ParticipantRole.SPEAKER);
|
|
|
|
const response = await updateParticipant(
|
|
roomData.room.roomId,
|
|
participantIdentity,
|
|
ParticipantRole.MODERATOR,
|
|
roomData.moderatorCookie
|
|
);
|
|
expect(response.status).toBe(200);
|
|
|
|
// Check if the participant has been updated
|
|
const participant = await livekitService.getParticipant(roomData.room.roomId, participantIdentity);
|
|
expect(participant).toBeDefined();
|
|
expect(participant).toHaveProperty('metadata');
|
|
const metadata = JSON.parse(participant.metadata || '{}');
|
|
expect(metadata).toHaveProperty('roles');
|
|
expect(metadata.roles).toContainEqual(expect.objectContaining({ role: ParticipantRole.MODERATOR }));
|
|
expect(metadata).toHaveProperty('selectedRole', ParticipantRole.MODERATOR);
|
|
|
|
// Verify sendSignal method has been called twice
|
|
expect(sendSignalSpy).toHaveBeenCalledTimes(2);
|
|
|
|
expect(sendSignalSpy).toHaveBeenNthCalledWith(1,
|
|
roomData.room.roomId,
|
|
{
|
|
roomId: roomData.room.roomId,
|
|
participantIdentity,
|
|
newRole: ParticipantRole.MODERATOR,
|
|
secret: expect.any(String),
|
|
timestamp: expect.any(Number)
|
|
},
|
|
{
|
|
topic: MeetSignalType.MEET_PARTICIPANT_ROLE_UPDATED,
|
|
destinationIdentities: [participantIdentity]
|
|
}
|
|
);
|
|
|
|
expect(sendSignalSpy).toHaveBeenNthCalledWith(2,
|
|
roomData.room.roomId,
|
|
{
|
|
roomId: roomData.room.roomId,
|
|
participantIdentity,
|
|
newRole: ParticipantRole.MODERATOR,
|
|
secret: undefined,
|
|
timestamp: expect.any(Number)
|
|
},
|
|
{
|
|
topic: MeetSignalType.MEET_PARTICIPANT_ROLE_UPDATED,
|
|
destinationIdentities: []
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should update participant role from moderator to speaker', async () => {
|
|
await setParticipantMetadata(roomData.room.roomId, ParticipantRole.MODERATOR);
|
|
|
|
const response = await updateParticipant(
|
|
roomData.room.roomId,
|
|
participantIdentity,
|
|
ParticipantRole.SPEAKER,
|
|
roomData.moderatorCookie
|
|
);
|
|
expect(response.status).toBe(200);
|
|
|
|
// Check if the participant has been updated
|
|
const participant = await livekitService.getParticipant(roomData.room.roomId, participantIdentity);
|
|
expect(participant).toBeDefined();
|
|
expect(participant).toHaveProperty('metadata');
|
|
const metadata = JSON.parse(participant.metadata || '{}');
|
|
expect(metadata).toHaveProperty('roles');
|
|
expect(metadata.roles).toContainEqual(expect.objectContaining({ role: ParticipantRole.SPEAKER }));
|
|
expect(metadata).toHaveProperty('selectedRole', ParticipantRole.SPEAKER);
|
|
});
|
|
|
|
it('should fail with 404 if participant does not exist', async () => {
|
|
const response = await updateParticipant(
|
|
roomData.room.roomId,
|
|
'NON_EXISTENT_PARTICIPANT',
|
|
ParticipantRole.MODERATOR,
|
|
roomData.moderatorCookie
|
|
);
|
|
expect(response.status).toBe(404);
|
|
expect(response.body.error).toBe('Participant Error');
|
|
});
|
|
|
|
it('should fail with 404 if room does not exist', async () => {
|
|
// Delete the room to ensure it does not exist
|
|
let response = await deleteRoom(roomData.room.roomId, { force: true });
|
|
expect(response.status).toBe(204);
|
|
|
|
response = await updateParticipant(
|
|
roomData.room.roomId,
|
|
participantIdentity,
|
|
ParticipantRole.MODERATOR,
|
|
roomData.moderatorCookie
|
|
);
|
|
expect(response.status).toBe(404);
|
|
expect(response.body.error).toBe('Room Error');
|
|
});
|
|
});
|
|
});
|