bigbluebutton-Github/bigbluebutton-tests/playwright/breakout/join.js
Gabriel Luiz Porfirio aa57d4528b
test: Add message to the test expect (#20718)
* first steps

* few messages added

* added more messages to the failed tests

* layouts,notifications

* more messages to help

* adding messages to the upload other presentations format

* messages for upload multiple presentation test

* added most of the expect messages

* updates for merging

* fixed broken tests
2024-07-30 18:49:02 -04:00

251 lines
12 KiB
JavaScript

const { default: test } = require('@playwright/test');
const { Create } = require('./create');
const utilScreenShare = require('../screenshare/util');
const e = require('../core/elements');
const { ELEMENT_WAIT_LONGER_TIME } = require('../core/constants');
const { getSettings } = require('../core/settings');
const { expect } = require('@playwright/test');
const { sleep } = require('../core/helpers');
const { getNotesLocator } = require('../sharednotes/util');
class Join extends Create {
constructor(browser, context) {
super(browser, context);
}
async joinRoom(shouldJoinAudio = false) {
await this.userPage.bringToFront();
if (shouldJoinAudio) {
await this.userPage.waitAndClick(e.joinAudio);
await this.userPage.joinMicrophone();
}
await this.userPage.waitAndClick(e.breakoutRoomsItem);
await this.userPage.waitAndClick(e.joinRoom1);
await this.userPage.hasElement(e.alreadyConnected, 'should display the element alreadyConnected', ELEMENT_WAIT_LONGER_TIME);
const breakoutUserPage = await this.userPage.getLastTargetPage(this.context);
await breakoutUserPage.bringToFront();
if (shouldJoinAudio) {
await this.userPage.hasElement(e.joinAudio, 'should display the join audio button');
} else {
await breakoutUserPage.closeAudioModal();
}
await breakoutUserPage.hasElement(e.presentationTitle, 'should display the presentation title on the breakout room');
return breakoutUserPage;
}
async joinAndShareWebcam() {
const breakoutPage = await this.joinRoom();
const { videoPreviewTimeout } = this.userPage.settings;
await breakoutPage.shareWebcam(true, videoPreviewTimeout);
}
async joinAndShareScreen() {
const breakoutPage = await this.joinRoom();
await utilScreenShare.startScreenshare(breakoutPage);
}
async joinWithAudio() {
const breakoutUserPage = await this.joinRoom(true);
await breakoutUserPage.hasElement(e.talkingIndicator, 'should display the talking indicator element');
await breakoutUserPage.hasElement(e.isTalking, 'should have the element isTalking active');
}
async messageToAllRooms() {
const breakoutUserPage = await this.joinRoom();
await breakoutUserPage.hasElement(e.presentationTitle, 'should have the presentation title once the user is on the breakout room.');
await this.modPage.waitAndClick(e.breakoutRoomsItem);
await this.modPage.hasElement(e.breakoutRemainingTime);
await this.modPage.type(e.chatBox, "test");
await this.modPage.waitAndClick(e.sendButton);
await breakoutUserPage.hasElement(e.chatUserMessageText, 'should have a test message on the public chat.');
}
async changeDurationTime() {
const breakoutUserPage = await this.joinRoom();
await breakoutUserPage.hasElement(e.presentationTitle);
await this.modPage.waitAndClick(e.breakoutRoomsItem);
await this.modPage.waitAndClick(e.breakoutOptionsMenu);
await this.modPage.waitAndClick(e.openBreakoutTimeManager);
await this.modPage.getLocator(e.inputSetTimeSelector).press('Backspace');
await this.modPage.type(e.inputSetTimeSelector, '2');
await this.modPage.waitAndClick(e.sendButtonDurationTime);
await this.modPage.hasText(e.breakoutRemainingTime, /[11-12]:[0-5][0-9]/, 'should have the breakout room time remaining counting down on the main meeting');
await breakoutUserPage.hasText(e.timeRemaining, /[11-12]:[0-5][0-9]/, 'should have the time remaining counting down on the breakout room');
}
async inviteUserAfterCreatingRooms() {
await this.modPage.waitAndClick(e.breakoutRoomsItem);
await this.modPage.waitAndClick(e.breakoutOptionsMenu);
await this.modPage.waitAndClick(e.openUpdateBreakoutUsersModal);
await this.modPage.dragDropSelector(e.attendeeNotAssigned, e.breakoutBox1);
await this.modPage.hasText(e.breakoutBox1, /Attendee/, 'should have the attende name on the second breakout room box.');
await this.modPage.waitAndClick(e.modalConfirmButton);
await this.userPage.hasElement(e.modalConfirmButton, 'should display the modal confirm button for the attende to join the meeting');
await this.userPage.waitAndClick(e.modalDismissButton);
}
async usernameShowsBelowRoomsName() {
const breakoutUserPage = await this.joinRoom();
await this.modPage.waitAndClick(e.breakoutRoomsItem);
await this.modPage.hasText(e.userNameBreakoutRoom, /Attendee/, 'should have the attende name on the breakout room below a room on the main breakout panel');
}
async showBreakoutRoomTimeRemaining() {
const breakoutUserPage = await this.joinRoom();
await breakoutUserPage.hasElement(e.presentationTitle, 'should display the presentation title on the breakout room');
await this.modPage.waitAndClick(e.breakoutRoomsItem);
await this.modPage.waitAndClick(e.breakoutOptionsMenu);
await this.modPage.waitAndClick(e.openBreakoutTimeManager);
await this.modPage.getLocator(e.inputSetTimeSelector).press('Backspace');
await this.modPage.type(e.inputSetTimeSelector, '2');
await this.modPage.waitAndClick(e.sendButtonDurationTime);
await this.modPage.hasText(e.breakoutRemainingTime, /[11-12]:[0-5][0-9]/, 'should have the breakout room time remaining counting down on the breakout main panel.');
await breakoutUserPage.hasText(e.timeRemaining, /[11-12]:[0-5][0-9]/, 'should display the remaining time inside the breakout rooom');
}
async endAllBreakoutRooms() {
await this.modPage.waitAndClick(e.breakoutRoomsItem);
await this.modPage.waitAndClick(e.breakoutOptionsMenu);
await this.modPage.waitAndClick(e.endAllBreakouts);
await this.modPage.wasRemoved(e.breakoutRoomsItem, 'should not have the breakout rooms item displayed anymore');
}
async moveUserToOtherRoom() {
const breakoutUserPage = await this.joinRoom();
await breakoutUserPage.hasElement(e.presentationTitle, 'should display the presentation title inside the breakout room');
await this.modPage.waitAndClick(e.breakoutRoomsItem);
await this.modPage.hasText(e.userNameBreakoutRoom, /Attendee/, 'should display the user name below the first breakout room name');
await this.modPage.waitAndClick(e.breakoutOptionsMenu);
await this.modPage.waitAndClick(e.openUpdateBreakoutUsersModal);
await this.modPage.dragDropSelector(e.moveUser, e.breakoutBox2);
await this.modPage.waitAndClick(e.modalConfirmButton);
await this.userPage.hasElement(e.modalConfirmButton, 'should display the modal confirm button for the user to join the breakout room');
await breakoutUserPage.page.isClosed();
await this.userPage.waitAndClick(e.modalConfirmButton);
await this.modPage.hasText(e.userNameBreakoutRoom2, /Attendee/, 'should display the user name below the first breakout room name', ELEMENT_WAIT_LONGER_TIME);
}
async exportBreakoutNotes() {
const { sharedNotesEnabled } = getSettings();
if(!sharedNotesEnabled) {
await this.modPage.hasElement(e.chatButton, 'should display the chat button to access the public chat');
return this.modPage.wasRemoved(e.sharedNotes, 'should have removed the shared notes.');
}
const breakoutUserPage = await this.joinRoom();
await breakoutUserPage.hasElement(e.presentationTitle, 'should display the presentation title inside the breakout room.');
await breakoutUserPage.waitAndClick(e.sharedNotes);
await breakoutUserPage.hasElement(e.hideNotesLabel, 'should display the hide notes element when shared notes is opened');
const notesLocator = getNotesLocator(breakoutUserPage);
await notesLocator.type(e.message);
await sleep(1000); // making sure there's enough time for the typing to finish
await this.modPage.waitAndClick(e.breakoutRoomsItem);
await this.modPage.waitAndClick(e.breakoutOptionsMenu);
// close all notifications displayed before ending rooms
for (const closeButton of await this.modPage.getLocator(e.closeToastBtn).all()) {
await closeButton.click();
}
await this.modPage.waitAndClick(e.endAllBreakouts);
await this.modPage.hasElement(e.presentationUploadProgressToast, 'should display the presentation upload progress toast');
await this.modPage.waitAndClick(e.actions);
const shareNotesPDF = await this.modPage.getLocatorByIndex(e.actionsItem, 1);
await expect(shareNotesPDF, 'should have the Notes name on the share notes pdf').toHaveText(/Notes/, { timeout: 30000 });
await expect(this.modPage.getLocatorByIndex(e.actionsItem, 2)).toHaveText("Upload/Manage presentations"); //This checks if no other content was exported.
await this.modPage.checkElementCount(e.actionsItem, 8);
await shareNotesPDF.click();
const wbBox = await this.modPage.getLocator(e.whiteboard);
await expect(wbBox).toHaveScreenshot('capture-breakout-notes.png', {
maxDiffPixels: 1000,
});
}
async exportBreakoutWhiteboard() {
const { sharedNotesEnabled } = getSettings();
if(!sharedNotesEnabled) {
await this.modPage.hasElement(e.chatButton, 'should display the chat button to access the public chat');
return this.modPage.wasRemoved(e.sharedNotes, 'should have removed the shared notes');
}
const breakoutUserPage = await this.joinRoom();
await breakoutUserPage.hasElement(e.presentationTitle, 'should have the presentation title displayed on the breakout room');
await breakoutUserPage.waitAndClick(e.sharedNotes);
await breakoutUserPage.hasElement(e.hideNotesLabel, 'should display the hide notes element when shared notes is opened');
// draw a line
await breakoutUserPage.hasElement(e.whiteboard, 'should display the whiteboard on breakout room', ELEMENT_WAIT_LONGER_TIME);
await breakoutUserPage.waitAndClick(e.wbShapesButton);
await breakoutUserPage.waitAndClick(e.wbLineShape);
const wbBreakout = await breakoutUserPage.page.$(e.whiteboard);
const wbBoxBreakout = await wbBreakout.boundingBox();
await breakoutUserPage.page.mouse.move(wbBoxBreakout.x + 0.3 * wbBoxBreakout.width, wbBoxBreakout.y + 0.3 * wbBoxBreakout.height);
await breakoutUserPage.page.mouse.down();
await breakoutUserPage.page.mouse.move(wbBoxBreakout.x + 0.7 * wbBoxBreakout.width, wbBoxBreakout.y + 0.7 * wbBoxBreakout.height);
await breakoutUserPage.page.mouse.up();
await sleep(1000); // making sure there's enough time for the typing to finish
await this.modPage.waitAndClick(e.breakoutRoomsItem);
await this.modPage.waitAndClick(e.breakoutOptionsMenu);
// close all notifications displayed before ending rooms
for (const closeButton of await this.modPage.getLocator(e.closeToastBtn).all()) {
await closeButton.click();
}
await this.modPage.waitAndClick(e.endAllBreakouts);
await this.modPage.hasElement(e.presentationUploadProgressToast, 'should display the presentation upload progress toast', ELEMENT_WAIT_LONGER_TIME);
await this.modPage.waitAndClick(e.actions);
const whiteboardPDF = await this.modPage.getLocatorByIndex(e.actionsItem, 1);
await expect(whiteboardPDF).toHaveText(/Whiteboard/, { timeout: 30000 });
await expect(this.modPage.getLocatorByIndex(e.actionsItem, 2)).toHaveText("Upload/Manage presentations"); //This checks if no other content was exported.
await this.modPage.checkElementCount(e.actionsItem, 8);
await whiteboardPDF.click();
await this.modPage.waitAndClick('i[type="info"]');
await this.modPage.waitAndClick(e.currentPresentationToast);
//! avoiding the following screenshot comparison due to https://github.com/microsoft/playwright/issues/18827
// const wbBox = await this.modPage.getLocator(e.whiteboard);
// await expect(wbBox).toHaveScreenshot('capture-breakout-whiteboard.png', {
// maxDiffPixels: 1500,
// });
}
async userCanChooseRoom() {
await this.userPage.bringToFront();
await this.userPage.hasElementEnabled(e.selectBreakoutRoomBtn);
await this.userPage.hasElementEnabled(e.modalConfirmButton);
await this.userPage.checkElementCount(e.roomOption, 2);
await this.userPage.getLocator(`${e.fullscreenModal} >> select`).selectOption({index: 1});
await this.userPage.waitAndClick(e.modalConfirmButton);
const breakoutUserPage = await this.userPage.getLastTargetPage(this.context);
await breakoutUserPage.bringToFront();
await breakoutUserPage.hasElement(e.presentationTitle, 'should display the presentation title on the breakout room', ELEMENT_WAIT_LONGER_TIME);
}
}
exports.Join = Join;