154 lines
5.7 KiB
TypeScript
154 lines
5.7 KiB
TypeScript
import { test, expect, BrowserContext, Browser, Page, chromium } from '@playwright/test';
|
|
import { waitForElementInIframe } from '../helpers/function-helpers';
|
|
import fs from 'fs';
|
|
import defaultConfig from '../../playwright.config';
|
|
|
|
test.describe('Web Component E2E Tests', () => {
|
|
const testAppUrl = 'http://localhost:5080';
|
|
const testRoomPrefix = 'test-room';
|
|
|
|
let browser: Browser;
|
|
let context: BrowserContext;
|
|
let page: Page;
|
|
|
|
test.beforeAll(async () => {
|
|
// Create a test room before all tests
|
|
const tempBrowser = await chromium.launch({
|
|
headless: defaultConfig.use?.headless || false
|
|
});
|
|
const tempContext = await tempBrowser.newContext();
|
|
const tempPage = await tempContext.newPage();
|
|
await tempPage.goto(testAppUrl);
|
|
await tempPage.waitForSelector('.create-room');
|
|
await tempPage.fill('#room-id-prefix', testRoomPrefix);
|
|
await tempPage.click('.create-room-btn');
|
|
await tempPage.waitForSelector(`#${testRoomPrefix}`);
|
|
await tempBrowser.close();
|
|
});
|
|
|
|
test.beforeEach(async () => {
|
|
browser = await chromium.launch({
|
|
headless: defaultConfig.use?.headless || false
|
|
});
|
|
const storageState = fs.existsSync('test_localstorage_state.json')
|
|
? { storageState: 'test_localstorage_state.json' }
|
|
: {};
|
|
context = await browser.newContext(storageState);
|
|
page = await context.newPage();
|
|
await page.goto(testAppUrl);
|
|
await page.waitForSelector('.rooms-container');
|
|
await page.waitForSelector(`#${testRoomPrefix}`);
|
|
await page.click('.dropdown-button');
|
|
await page.waitForSelector('#join-as-moderator');
|
|
await page.waitForSelector('#join-as-publisher');
|
|
});
|
|
|
|
test.afterEach(async ({}, testInfo) => {
|
|
if (testInfo.status !== testInfo.expectedStatus) {
|
|
console.log(`Test falló: ${testInfo.title}`);
|
|
|
|
// Take screenshot if the test fails
|
|
if (page && !page.isClosed()) {
|
|
try {
|
|
const screenshotBuffer = await page.screenshot({
|
|
fullPage: true,
|
|
type: 'png'
|
|
});
|
|
|
|
const screenshotBase64 = screenshotBuffer.toString('base64');
|
|
|
|
console.log('Screenshot en base64:');
|
|
console.log(`data:image/png;base64,${screenshotBase64}`);
|
|
} catch (error) {
|
|
console.error('Error taking screenshot:', error);
|
|
}
|
|
}
|
|
}
|
|
await context.storageState({ path: 'test_localstorage_state.json' });
|
|
await browser.close();
|
|
});
|
|
|
|
test.describe('Component Rendering', () => {
|
|
test('should load the web component with proper iframe', async () => {
|
|
await page.click('#join-as-moderator');
|
|
const component = page.locator('openvidu-meet');
|
|
await expect(component).toBeVisible();
|
|
|
|
const hasIframe = await page.evaluate(() => {
|
|
const component = document.querySelector('openvidu-meet');
|
|
return !!component?.shadowRoot?.querySelector('iframe');
|
|
});
|
|
expect(hasIframe).toBeTruthy();
|
|
});
|
|
});
|
|
|
|
test.describe('Event Handling', () => {
|
|
test('should successfully join as moderator and receive JOIN event', async () => {
|
|
await page.click('#join-as-moderator');
|
|
await waitForElementInIframe(page, 'ov-session');
|
|
await page.waitForSelector('.event-JOIN');
|
|
const joinElements = await page.locator('.event-JOIN').all();
|
|
expect(joinElements.length).toBe(1);
|
|
});
|
|
|
|
test('should successfully join as publisher and receive JOIN event', async () => {
|
|
await page.click('#join-as-publisher');
|
|
await waitForElementInIframe(page, 'ov-session');
|
|
await page.waitForSelector('.event-JOIN');
|
|
const joinElements = await page.locator('.event-JOIN').all();
|
|
expect(joinElements.length).toBe(1);
|
|
});
|
|
|
|
test('should successfully join to room and receive LEFT event when using leave command', async () => {
|
|
await page.click('#join-as-moderator');
|
|
await waitForElementInIframe(page, 'ov-session');
|
|
await page.click('#leave-room-btn');
|
|
await page.waitForSelector('.event-LEFT');
|
|
const leftElements = await page.locator('.event-LEFT').all();
|
|
expect(leftElements.length).toBe(1);
|
|
});
|
|
|
|
test('should successfully join to room and receive LEFT event when using disconnect button', async () => {
|
|
await page.click('#join-as-moderator');
|
|
await waitForElementInIframe(page, 'ov-session');
|
|
const button = await waitForElementInIframe(page, '#leave-btn');
|
|
await button.click();
|
|
await page.waitForSelector('.event-LEFT');
|
|
const leftElements = await page.locator('.event-LEFT').all();
|
|
expect(leftElements.length).toBe(1);
|
|
});
|
|
|
|
test('should successfully join to room and receive MEETING_ENDED event when using end meeting command', async () => {
|
|
await page.click('#join-as-moderator');
|
|
await waitForElementInIframe(page, 'ov-session');
|
|
await page.click('#end-meeting-btn');
|
|
await page.waitForSelector('.event-MEETING_ENDED');
|
|
const meetingEndedElements = await page.locator('.event-MEETING_ENDED').all();
|
|
expect(meetingEndedElements.length).toBe(1);
|
|
|
|
// Check LEFT event does not exist
|
|
const leftEventElements = await page.locator('.event-LEFT').all();
|
|
expect(leftEventElements.length).toBe(0);
|
|
});
|
|
});
|
|
|
|
test.describe('Webhook Handling', () => {
|
|
test('should successfully receive meetingStarted and meetingEnded webhooks', async () => {
|
|
await page.click('#join-as-moderator');
|
|
|
|
await page.waitForTimeout(1000); // Wait for 1 second to ensure the meeting has started
|
|
await page.screenshot({ path: 'screenshot.png' });
|
|
await waitForElementInIframe(page, 'ov-session');
|
|
await page.waitForSelector('.webhook-meetingStarted');
|
|
const meetingStartedElements = await page.locator('.webhook-meetingStarted').all();
|
|
expect(meetingStartedElements.length).toBe(1);
|
|
|
|
// End the meeting
|
|
await page.click('#end-meeting-btn');
|
|
await page.waitForSelector('.webhook-meetingEnded');
|
|
const meetingEndedElements = await page.locator('.webhook-meetingEnded').all();
|
|
expect(meetingEndedElements.length).toBe(1);
|
|
});
|
|
});
|
|
});
|