163 lines
5.7 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it, jest } from '@jest/globals';
import { CommandsManager } from '../../src/components/CommandsManager';
import { OpenViduMeet } from '../../src/components/OpenViduMeet';
import '../../src/index';
import { WebComponentCommand, WebComponentEvent } from '@openvidu-meet/typings';
describe('OpenViduMeet WebComponent Commands', () => {
let component: OpenViduMeet;
let commandsManager: CommandsManager;
beforeEach(() => {
component = document.createElement('openvidu-meet') as OpenViduMeet;
commandsManager = component['commandsManager'] as CommandsManager;
document.body.appendChild(component);
});
afterEach(() => {
document.body.removeChild(component);
jest.restoreAllMocks();
document.body.innerHTML = '';
});
it('should update allowedOrigin when setAllowedOrigin is called', () => {
const testOrigin = 'https://example.com';
commandsManager.setTargetOrigin(testOrigin);
// Check if it was updated
expect(commandsManager['targetIframeOrigin']).toBe(testOrigin);
expect((component as any).commandsManager.targetIframeOrigin).toBe(testOrigin);
});
it('should send initialize command with initialize()', () => {
const spy = jest.spyOn(commandsManager as any, 'sendMessage');
const testOrigin = 'https://example.com';
Object.defineProperty(window, 'location', {
value: { origin: testOrigin },
writable: true
});
commandsManager.initialize();
expect(spy).toHaveBeenCalledWith({
command: WebComponentCommand.INITIALIZE,
payload: { domain: testOrigin }
});
});
it('should subscribe and trigger event with on()', () => {
const callback = jest.fn();
commandsManager.on(component, WebComponentEvent.READY, callback);
const event = new CustomEvent(WebComponentEvent.READY, { detail: { foo: 'bar' } });
component.dispatchEvent(event);
expect(callback).toHaveBeenCalledWith({ foo: 'bar' });
});
it('should not subscribe unsupported events with on()', () => {
const callback = jest.fn();
commandsManager.on(component, 'not-supported' as any, callback);
const event = new CustomEvent('not-supported', { detail: { foo: 'bar' } });
component.dispatchEvent(event);
expect(callback).not.toHaveBeenCalled();
});
it('should subscribe and trigger event only once with once()', () => {
const callback = jest.fn();
commandsManager.once(component, WebComponentEvent.READY, callback);
const event = new CustomEvent(WebComponentEvent.READY, { detail: 123 });
component.dispatchEvent(event);
component.dispatchEvent(event);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(123);
});
it('should unsubscribe a specific handler with off()', () => {
const callback = jest.fn();
commandsManager.on(component, WebComponentEvent.READY, callback);
commandsManager.off(component, WebComponentEvent.READY, callback);
const event = new CustomEvent(WebComponentEvent.READY, {});
component.dispatchEvent(event);
expect(callback).not.toHaveBeenCalled();
});
it('should unsubscribe all handlers for an event with off()', () => {
const cb1 = jest.fn();
const cb2 = jest.fn();
commandsManager.on(component, WebComponentEvent.READY, cb1);
commandsManager.on(component, WebComponentEvent.READY, cb2);
commandsManager.off(component, WebComponentEvent.READY);
const event = new CustomEvent(WebComponentEvent.READY, {});
component.dispatchEvent(event);
expect(cb1).not.toHaveBeenCalled();
expect(cb2).not.toHaveBeenCalled();
});
it('should call commandsManager.leaveRoom when leaveRoom is called', () => {
const leaveRoomSpy = jest.spyOn(component['commandsManager'], 'leaveRoom');
const sendMessageSpy = jest.spyOn(commandsManager, 'sendMessage' as keyof CommandsManager);
component.leaveRoom();
expect(leaveRoomSpy).toHaveBeenCalled();
expect(sendMessageSpy).toHaveBeenCalledTimes(1);
expect(sendMessageSpy).toHaveBeenCalledWith({ command: WebComponentCommand.LEAVE_ROOM });
});
it('should call commandsManager.endMeeting when endMeeting is called', () => {
const endMeetingSpy = jest.spyOn(component['commandsManager'], 'endMeeting');
const sendMessageSpy = jest.spyOn(commandsManager, 'sendMessage' as keyof CommandsManager);
component.endMeeting();
expect(endMeetingSpy).toHaveBeenCalled();
expect(sendMessageSpy).toHaveBeenCalledTimes(1);
expect(sendMessageSpy).toHaveBeenCalledWith({ command: WebComponentCommand.END_MEETING });
});
it('should call commandsManager.kickParticipant when kickParticipant is called', () => {
const participantIdentity = 'test-participant';
const kickParticipantSpy = jest.spyOn(component['commandsManager'], 'kickParticipant');
const sendMessageSpy = jest.spyOn(commandsManager, 'sendMessage' as keyof CommandsManager);
component.kickParticipant(participantIdentity);
expect(kickParticipantSpy).toHaveBeenCalledWith(participantIdentity);
expect(sendMessageSpy).toHaveBeenCalledTimes(1);
expect(sendMessageSpy).toHaveBeenCalledWith({
command: WebComponentCommand.KICK_PARTICIPANT,
payload: { participantIdentity }
});
});
it('should send message to iframe with correct origin', () => {
// Mock iframe contentWindow and postMessage
const mockPostMessage = jest.fn();
const iframe = component.shadowRoot?.querySelector('iframe');
// Mock the contentWindow
Object.defineProperty(iframe, 'contentWindow', {
value: { postMessage: mockPostMessage },
writable: true
});
// Set allowed origin
const testOrigin = 'https://example.com';
(component as any).commandsManager.setTargetOrigin(testOrigin);
// Send a message
(component as any).commandsManager.sendMessage({ command: 'TEST' });
// Check if postMessage was called correctly
expect(mockPostMessage).toHaveBeenCalledWith({ command: 'TEST' }, testOrigin);
});
});