test: update room member token response validation and permissions handling
This commit is contained in:
parent
18426e2111
commit
f01ec31c1b
@ -618,12 +618,27 @@ export const expectValidGetRecordingUrlResponse = (response: Response, recording
|
||||
|
||||
export const expectValidRoomMemberTokenResponse = (
|
||||
response: Response,
|
||||
roomId: string,
|
||||
baseRole: MeetRoomMemberRole,
|
||||
joinMeeting = false,
|
||||
participantName?: string,
|
||||
participantIdentityPrefix?: string
|
||||
validations: {
|
||||
roomId: string;
|
||||
memberId?: string;
|
||||
baseRole: MeetRoomMemberRole;
|
||||
customPermissions?: Partial<MeetRoomMemberPermissions>;
|
||||
effectivePermissions: MeetRoomMemberPermissions;
|
||||
joinMeeting?: boolean;
|
||||
participantName?: string;
|
||||
participantIdentityPrefix?: string;
|
||||
}
|
||||
) => {
|
||||
const {
|
||||
roomId,
|
||||
memberId,
|
||||
baseRole,
|
||||
effectivePermissions,
|
||||
customPermissions,
|
||||
joinMeeting = false,
|
||||
participantName,
|
||||
participantIdentityPrefix
|
||||
} = validations;
|
||||
expect(response.status).toBe(200);
|
||||
expect(response.body).toHaveProperty('token');
|
||||
|
||||
@ -639,8 +654,8 @@ export const expectValidRoomMemberTokenResponse = (
|
||||
expect(decodedToken.sub?.startsWith(participantIdentityPrefix)).toBe(true);
|
||||
}
|
||||
|
||||
// const livekitPermissions = getLiveKitPermissions(roomId, getPermissions(baseRole));
|
||||
expect(decodedToken).toHaveProperty('video');
|
||||
const livekitPermissions = getLiveKitPermissions(roomId, effectivePermissions);
|
||||
expect(decodedToken).toHaveProperty('video', livekitPermissions);
|
||||
} else {
|
||||
expect(decodedToken).not.toHaveProperty('name');
|
||||
expect(decodedToken).not.toHaveProperty('sub');
|
||||
@ -649,65 +664,40 @@ export const expectValidRoomMemberTokenResponse = (
|
||||
|
||||
expect(decodedToken).toHaveProperty('metadata');
|
||||
const metadata = JSON.parse(decodedToken.metadata || '{}');
|
||||
expect(metadata).toHaveProperty('iat');
|
||||
expect(metadata).toHaveProperty('livekitUrl');
|
||||
expect(metadata).toHaveProperty('roomId', roomId);
|
||||
expect(metadata).toHaveProperty('baseRole', baseRole);
|
||||
const permissions = getPermissions(baseRole);
|
||||
expect(metadata).toHaveProperty('effectivePermissions', permissions);
|
||||
};
|
||||
|
||||
export const getPermissions = (role: MeetRoomMemberRole): MeetRoomMemberPermissions => {
|
||||
switch (role) {
|
||||
case MeetRoomMemberRole.MODERATOR:
|
||||
return {
|
||||
canRecord: true,
|
||||
canRetrieveRecordings: true,
|
||||
canDeleteRecordings: true,
|
||||
canJoinMeeting: true,
|
||||
canShareAccessLinks: true,
|
||||
canMakeModerator: true,
|
||||
canKickParticipants: true,
|
||||
canEndMeeting: true,
|
||||
canPublishVideo: true,
|
||||
canPublishAudio: true,
|
||||
canShareScreen: true,
|
||||
canReadChat: true,
|
||||
canWriteChat: true,
|
||||
canChangeVirtualBackground: true
|
||||
};
|
||||
case MeetRoomMemberRole.SPEAKER:
|
||||
return {
|
||||
canRecord: false,
|
||||
canRetrieveRecordings: true,
|
||||
canDeleteRecordings: false,
|
||||
canJoinMeeting: true,
|
||||
canShareAccessLinks: false,
|
||||
canMakeModerator: false,
|
||||
canKickParticipants: false,
|
||||
canEndMeeting: false,
|
||||
canPublishVideo: true,
|
||||
canPublishAudio: true,
|
||||
canShareScreen: true,
|
||||
canReadChat: true,
|
||||
canWriteChat: true,
|
||||
canChangeVirtualBackground: true
|
||||
};
|
||||
if (memberId) {
|
||||
expect(metadata).toHaveProperty('memberId', memberId);
|
||||
} else {
|
||||
expect(metadata).not.toHaveProperty('memberId');
|
||||
}
|
||||
|
||||
if (customPermissions) {
|
||||
expect(metadata).toHaveProperty('customPermissions', customPermissions);
|
||||
} else {
|
||||
expect(metadata).not.toHaveProperty('customPermissions');
|
||||
}
|
||||
|
||||
expect(metadata).toHaveProperty('effectivePermissions', effectivePermissions);
|
||||
};
|
||||
|
||||
const getLiveKitPermissions = (roomId: string, permissions: MeetRoomMemberPermissions): LiveKitPermissions => {
|
||||
const canPublishSources: TrackSource[] = [];
|
||||
|
||||
if (permissions.canPublishAudio) {
|
||||
canPublishSources.push(TrackSource.MICROPHONE);
|
||||
canPublishSources.push('microphone' as unknown as TrackSource);
|
||||
}
|
||||
|
||||
if (permissions.canPublishVideo) {
|
||||
canPublishSources.push(TrackSource.CAMERA);
|
||||
canPublishSources.push('camera' as unknown as TrackSource);
|
||||
}
|
||||
|
||||
if (permissions.canShareScreen) {
|
||||
canPublishSources.push(TrackSource.SCREEN_SHARE);
|
||||
canPublishSources.push(TrackSource.SCREEN_SHARE_AUDIO);
|
||||
canPublishSources.push('screen_share' as unknown as TrackSource);
|
||||
canPublishSources.push('screen_share_audio' as unknown as TrackSource);
|
||||
}
|
||||
|
||||
const livekitPermissions: LiveKitPermissions = {
|
||||
|
||||
@ -43,11 +43,9 @@ describe('Meetings API Tests', () => {
|
||||
expect(response.status).toBe(200);
|
||||
|
||||
// Check if the participant has been removed from LiveKit
|
||||
try {
|
||||
await livekitService.getParticipant(roomData.room.roomId, participantIdentity);
|
||||
} catch (error) {
|
||||
expect((error as OpenViduMeetError).statusCode).toBe(404);
|
||||
}
|
||||
await expect(livekitService.getParticipant(roomData.room.roomId, participantIdentity)).rejects.toThrow(
|
||||
OpenViduMeetError
|
||||
);
|
||||
});
|
||||
|
||||
it('should fail with 404 if participant does not exist', async () => {
|
||||
|
||||
@ -4,7 +4,6 @@ import { container } from '../../../../src/config/dependency-injector.config.js'
|
||||
import { MEET_ENV } from '../../../../src/environment.js';
|
||||
import { FrontendEventService } from '../../../../src/services/frontend-event.service.js';
|
||||
import { LiveKitService } from '../../../../src/services/livekit.service.js';
|
||||
import { getPermissions } from '../../../helpers/assertion-helpers.js';
|
||||
import {
|
||||
deleteAllRooms,
|
||||
disconnectFakeParticipants,
|
||||
@ -32,15 +31,15 @@ describe('Meetings API Tests', () => {
|
||||
});
|
||||
|
||||
describe('Update Participant Tests', () => {
|
||||
const setParticipantMetadata = async (roomId: string, baseRole: MeetRoomMemberRole) => {
|
||||
const setParticipantMetadata = async (roomData: RoomData, baseRole: MeetRoomMemberRole) => {
|
||||
const metadata: MeetRoomMemberTokenMetadata = {
|
||||
iat: Date.now(),
|
||||
livekitUrl: MEET_ENV.LIVEKIT_URL,
|
||||
roomId,
|
||||
roomId: roomData.room.roomId,
|
||||
baseRole,
|
||||
effectivePermissions: getPermissions(baseRole)
|
||||
effectivePermissions: roomData.room.roles[baseRole].permissions
|
||||
};
|
||||
await updateParticipantMetadata(roomId, participantIdentity, metadata);
|
||||
await updateParticipantMetadata(roomData.room.roomId, participantIdentity, metadata);
|
||||
};
|
||||
|
||||
beforeEach(async () => {
|
||||
@ -51,7 +50,7 @@ describe('Meetings API Tests', () => {
|
||||
const frontendEventService = container.get(FrontendEventService);
|
||||
const sendSignalSpy = jest.spyOn(frontendEventService as any, 'sendSignal');
|
||||
|
||||
await setParticipantMetadata(roomData.room.roomId, MeetRoomMemberRole.SPEAKER);
|
||||
await setParticipantMetadata(roomData, MeetRoomMemberRole.SPEAKER);
|
||||
|
||||
const response = await updateParticipant(
|
||||
roomData.room.roomId,
|
||||
@ -68,7 +67,7 @@ describe('Meetings API Tests', () => {
|
||||
const metadata = JSON.parse(participant.metadata || '{}');
|
||||
expect(metadata).toHaveProperty('roomId', roomData.room.roomId);
|
||||
expect(metadata).toHaveProperty('baseRole', MeetRoomMemberRole.MODERATOR);
|
||||
const permissions = getPermissions(MeetRoomMemberRole.MODERATOR);
|
||||
const permissions = roomData.room.roles.moderator.permissions;
|
||||
expect(metadata).toHaveProperty('effectivePermissions', permissions);
|
||||
|
||||
// Verify sendSignal method has been called twice
|
||||
@ -108,7 +107,7 @@ describe('Meetings API Tests', () => {
|
||||
});
|
||||
|
||||
it('should update participant role from moderator to speaker', async () => {
|
||||
await setParticipantMetadata(roomData.room.roomId, MeetRoomMemberRole.MODERATOR);
|
||||
await setParticipantMetadata(roomData, MeetRoomMemberRole.MODERATOR);
|
||||
|
||||
const response = await updateParticipant(
|
||||
roomData.room.roomId,
|
||||
@ -125,7 +124,7 @@ describe('Meetings API Tests', () => {
|
||||
const metadata = JSON.parse(participant.metadata || '{}');
|
||||
expect(metadata).toHaveProperty('roomId', roomData.room.roomId);
|
||||
expect(metadata).toHaveProperty('baseRole', MeetRoomMemberRole.SPEAKER);
|
||||
const permissions = getPermissions(MeetRoomMemberRole.SPEAKER);
|
||||
const permissions = roomData.room.roles.speaker.permissions;
|
||||
expect(metadata).toHaveProperty('effectivePermissions', permissions);
|
||||
});
|
||||
|
||||
|
||||
@ -4,7 +4,6 @@ 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 { getPermissions } from '../../../helpers/assertion-helpers.js';
|
||||
import {
|
||||
deleteAllRooms,
|
||||
disconnectFakeParticipants,
|
||||
@ -33,7 +32,7 @@ describe('Meeting API Security Tests', () => {
|
||||
app = await startTestServer();
|
||||
({ accessToken: rootAdminAccessToken } = await loginRootAdmin());
|
||||
|
||||
roomData = await setupSingleRoom();
|
||||
roomData = await setupSingleRoom(true);
|
||||
roomId = roomData.room.roomId;
|
||||
roomMember = await setupRoomMember(roomId, {
|
||||
name: 'External Member',
|
||||
@ -105,7 +104,7 @@ describe('Meeting API Security Tests', () => {
|
||||
livekitUrl: MEET_ENV.LIVEKIT_URL,
|
||||
roomId,
|
||||
baseRole: MeetRoomMemberRole.SPEAKER,
|
||||
effectivePermissions: getPermissions(MeetRoomMemberRole.SPEAKER)
|
||||
effectivePermissions: roomData.room.roles.speaker.permissions
|
||||
};
|
||||
await updateParticipantMetadata(roomId, participantIdentity, metadata);
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user