2022-12-31 05:49:18 +08:00
|
|
|
const { default: test } = require('@playwright/test');
|
2021-12-02 12:12:14 +08:00
|
|
|
const { Create } = require('./create');
|
2021-11-30 21:42:57 +08:00
|
|
|
const utilScreenShare = require('../screenshare/util');
|
|
|
|
const e = require('../core/elements');
|
2024-09-27 22:30:37 +08:00
|
|
|
const { ELEMENT_WAIT_LONGER_TIME, ELEMENT_WAIT_EXTRA_LONG_TIME } = require('../core/constants');
|
2022-06-08 02:52:22 +08:00
|
|
|
const { getSettings } = require('../core/settings');
|
2022-09-30 19:17:15 +08:00
|
|
|
const { expect } = require('@playwright/test');
|
2022-11-26 03:54:32 +08:00
|
|
|
const { sleep } = require('../core/helpers');
|
2022-12-31 05:49:18 +08:00
|
|
|
const { getNotesLocator } = require('../sharednotes/util');
|
2024-09-27 22:30:37 +08:00
|
|
|
const { uploadMultiplePresentations } = require('../presentation/util.js');
|
2021-11-30 21:42:57 +08:00
|
|
|
|
|
|
|
class Join extends Create {
|
|
|
|
constructor(browser, context) {
|
|
|
|
super(browser, context);
|
|
|
|
}
|
|
|
|
|
|
|
|
async joinRoom(shouldJoinAudio = false) {
|
2021-12-02 12:12:14 +08:00
|
|
|
await this.userPage.bringToFront();
|
2021-11-30 21:42:57 +08:00
|
|
|
if (shouldJoinAudio) {
|
2021-12-02 12:12:14 +08:00
|
|
|
await this.userPage.waitAndClick(e.joinAudio);
|
|
|
|
await this.userPage.joinMicrophone();
|
2021-11-30 21:42:57 +08:00
|
|
|
}
|
|
|
|
|
2021-12-02 12:12:14 +08:00
|
|
|
await this.userPage.waitAndClick(e.breakoutRoomsItem);
|
|
|
|
await this.userPage.waitAndClick(e.joinRoom1);
|
|
|
|
await this.userPage.waitForSelector(e.alreadyConnected, ELEMENT_WAIT_LONGER_TIME);
|
2021-11-30 21:42:57 +08:00
|
|
|
|
2021-12-02 12:12:14 +08:00
|
|
|
const breakoutUserPage = await this.userPage.getLastTargetPage(this.context);
|
|
|
|
await breakoutUserPage.bringToFront();
|
2021-11-30 21:42:57 +08:00
|
|
|
|
2022-07-02 04:55:32 +08:00
|
|
|
if (shouldJoinAudio) {
|
|
|
|
await this.userPage.waitForSelector(e.joinAudio);
|
|
|
|
} else {
|
|
|
|
await breakoutUserPage.closeAudioModal();
|
|
|
|
}
|
2022-04-21 19:19:08 +08:00
|
|
|
await breakoutUserPage.waitForSelector(e.presentationTitle);
|
2021-12-02 12:12:14 +08:00
|
|
|
return breakoutUserPage;
|
2021-11-30 21:42:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async joinAndShareWebcam() {
|
|
|
|
const breakoutPage = await this.joinRoom();
|
|
|
|
|
2022-06-08 02:52:22 +08:00
|
|
|
const { videoPreviewTimeout } = getSettings();
|
2022-03-29 21:53:07 +08:00
|
|
|
await breakoutPage.shareWebcam(true, videoPreviewTimeout);
|
2021-11-30 21:42:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async joinAndShareScreen() {
|
|
|
|
const breakoutPage = await this.joinRoom();
|
|
|
|
|
|
|
|
await utilScreenShare.startScreenshare(breakoutPage);
|
|
|
|
}
|
|
|
|
|
|
|
|
async joinWithAudio() {
|
2021-12-02 12:12:14 +08:00
|
|
|
const breakoutUserPage = await this.joinRoom(true);
|
2021-11-30 21:42:57 +08:00
|
|
|
|
2021-12-02 12:12:14 +08:00
|
|
|
await breakoutUserPage.waitForSelector(e.talkingIndicator);
|
|
|
|
await breakoutUserPage.hasElement(e.isTalking);
|
2021-11-30 21:42:57 +08:00
|
|
|
}
|
2022-09-16 02:31:10 +08:00
|
|
|
|
2024-09-27 22:30:37 +08:00
|
|
|
async joinRoomWithModerator() {
|
|
|
|
await this.modPage.bringToFront();
|
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.breakoutRoomsItem);
|
|
|
|
await this.modPage.waitAndClick(e.askJoinRoom2);
|
|
|
|
//await this.modPage.waitAndClick(e.joinRoom1);
|
|
|
|
await this.modPage.waitForSelector(e.alreadyConnected, ELEMENT_WAIT_LONGER_TIME);
|
|
|
|
|
|
|
|
const breakoutModPage = await this.modPage.getLastTargetPage(this.context);
|
|
|
|
await breakoutModPage.bringToFront();
|
|
|
|
|
|
|
|
await breakoutModPage.closeAudioModal();
|
|
|
|
|
|
|
|
await breakoutModPage.waitForSelector(e.presentationTitle);
|
|
|
|
return breakoutModPage;
|
|
|
|
}
|
|
|
|
|
2022-09-16 02:31:10 +08:00
|
|
|
async messageToAllRooms() {
|
|
|
|
const breakoutUserPage = await this.joinRoom();
|
2022-09-23 04:17:15 +08:00
|
|
|
await breakoutUserPage.hasElement(e.presentationTitle);
|
2022-09-16 02:31:10 +08:00
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.breakoutRoomsItem);
|
2022-09-23 04:17:15 +08:00
|
|
|
await this.modPage.type(e.chatBox, "test");
|
2022-09-16 02:31:10 +08:00
|
|
|
await this.modPage.waitAndClick(e.sendButton);
|
|
|
|
|
|
|
|
await breakoutUserPage.hasElement(e.chatUserMessageText);
|
|
|
|
}
|
|
|
|
|
|
|
|
async changeDurationTime() {
|
|
|
|
const breakoutUserPage = await this.joinRoom();
|
2022-09-23 04:17:15 +08:00
|
|
|
await breakoutUserPage.hasElement(e.presentationTitle);
|
2022-09-16 02:31:10 +08:00
|
|
|
|
|
|
|
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);
|
2022-10-06 04:41:22 +08:00
|
|
|
await this.modPage.hasText(e.breakoutRemainingTime, /[11-12]:[0-5][0-9]/);
|
2022-09-16 02:31:10 +08:00
|
|
|
|
2022-10-06 04:35:19 +08:00
|
|
|
await breakoutUserPage.hasText(e.timeRemaining, /[11-12]:[0-5][0-9]/);
|
2022-09-16 02:31:10 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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.userTest, e.breakoutBox1);
|
|
|
|
await this.modPage.hasText(e.breakoutBox1, /Attendee/);
|
|
|
|
await this.modPage.waitAndClick(e.modalConfirmButton);
|
|
|
|
|
|
|
|
await this.userPage.hasElement(e.modalConfirmButton);
|
|
|
|
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/);
|
|
|
|
}
|
|
|
|
|
|
|
|
async showBreakoutRoomTimeRemaining() {
|
|
|
|
const breakoutUserPage = await this.joinRoom();
|
2022-09-23 04:17:15 +08:00
|
|
|
await breakoutUserPage.hasElement(e.presentationTitle);
|
2022-09-16 02:31:10 +08:00
|
|
|
|
|
|
|
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);
|
2022-10-06 04:41:22 +08:00
|
|
|
await this.modPage.hasText(e.breakoutRemainingTime, /[11-12]:[0-5][0-9]/);
|
2022-09-16 02:31:10 +08:00
|
|
|
|
2022-11-26 03:54:32 +08:00
|
|
|
await breakoutUserPage.hasText(e.timeRemaining, /[11-12]:[0-5][0-9]/);
|
2022-09-16 02:31:10 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
2022-09-30 19:17:15 +08:00
|
|
|
|
|
|
|
async moveUserToOtherRoom() {
|
|
|
|
const breakoutUserPage = await this.joinRoom();
|
|
|
|
await breakoutUserPage.hasElement(e.presentationTitle);
|
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.breakoutRoomsItem);
|
|
|
|
await this.modPage.hasText(e.userNameBreakoutRoom, /Attendee/);
|
|
|
|
|
|
|
|
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.waitForSelector(e.modalConfirmButton);
|
2023-02-14 21:59:46 +08:00
|
|
|
await breakoutUserPage.page.isClosed();
|
2022-09-30 19:17:15 +08:00
|
|
|
|
|
|
|
await this.userPage.waitAndClick(e.modalConfirmButton);
|
|
|
|
await this.modPage.hasText(e.userNameBreakoutRoom2, /Attendee/);
|
|
|
|
}
|
2022-12-31 05:49:18 +08:00
|
|
|
|
|
|
|
async exportBreakoutNotes() {
|
|
|
|
const { sharedNotesEnabled } = getSettings();
|
|
|
|
test.fail(!sharedNotesEnabled, 'Shared notes is disabled');
|
|
|
|
|
|
|
|
const breakoutUserPage = await this.joinRoom();
|
|
|
|
await breakoutUserPage.hasElement(e.presentationTitle);
|
|
|
|
await breakoutUserPage.waitAndClick(e.sharedNotes);
|
|
|
|
await breakoutUserPage.waitForSelector(e.hideNotesLabel);
|
|
|
|
|
|
|
|
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);
|
2023-07-21 04:07:18 +08:00
|
|
|
// close all notifications displayed before ending rooms
|
|
|
|
for (const closeButton of await this.modPage.getLocator(e.closeToastBtn).all()) {
|
|
|
|
await closeButton.click();
|
|
|
|
}
|
2022-12-31 05:49:18 +08:00
|
|
|
await this.modPage.waitAndClick(e.endAllBreakouts);
|
|
|
|
|
|
|
|
await this.modPage.hasElement(e.presentationUploadProgressToast);
|
|
|
|
await this.modPage.waitAndClick(e.actions);
|
2023-04-05 22:06:00 +08:00
|
|
|
const shareNotesPDF = await this.modPage.getLocatorByIndex(e.actionsItem, 1);
|
|
|
|
await expect(shareNotesPDF).toHaveText(/Notes/, { timeout: 30000 });
|
|
|
|
await expect(this.modPage.getLocatorByIndex(e.actionsItem, 2)).toHaveText("Upload/Manage presentations"); //This checks if no other content was exported.
|
2023-07-21 04:07:18 +08:00
|
|
|
await this.modPage.checkElementCount(e.actionsItem, 9);
|
2023-04-05 22:06:00 +08:00
|
|
|
await shareNotesPDF.click();
|
|
|
|
|
|
|
|
const wbBox = await this.modPage.getLocator(e.whiteboard);
|
|
|
|
await expect(wbBox).toHaveScreenshot('capture-breakout-notes.png', {
|
2022-12-31 05:49:18 +08:00
|
|
|
maxDiffPixels: 1000,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async exportBreakoutWhiteboard() {
|
|
|
|
const { sharedNotesEnabled } = getSettings();
|
|
|
|
test.fail(!sharedNotesEnabled, 'Shared notes is disabled');
|
|
|
|
|
|
|
|
const breakoutUserPage = await this.joinRoom();
|
|
|
|
await breakoutUserPage.hasElement(e.presentationTitle);
|
|
|
|
await breakoutUserPage.waitAndClick(e.sharedNotes);
|
|
|
|
await breakoutUserPage.waitForSelector(e.hideNotesLabel);
|
|
|
|
|
|
|
|
// draw a line
|
|
|
|
await breakoutUserPage.waitForSelector(e.whiteboard, 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);
|
2023-07-21 04:07:18 +08:00
|
|
|
// close all notifications displayed before ending rooms
|
|
|
|
for (const closeButton of await this.modPage.getLocator(e.closeToastBtn).all()) {
|
|
|
|
await closeButton.click();
|
|
|
|
}
|
2022-12-31 05:49:18 +08:00
|
|
|
await this.modPage.waitAndClick(e.endAllBreakouts);
|
|
|
|
|
|
|
|
await this.modPage.waitForSelector(e.presentationUploadProgressToast, ELEMENT_WAIT_LONGER_TIME);
|
|
|
|
await this.modPage.waitAndClick(e.actions);
|
2023-04-05 22:06:00 +08:00
|
|
|
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.
|
2023-07-21 04:07:18 +08:00
|
|
|
await this.modPage.checkElementCount(e.actionsItem, 9);
|
2023-04-05 22:06:00 +08:00
|
|
|
await whiteboardPDF.click();
|
|
|
|
await this.modPage.waitAndClick('i[type="info"]');
|
2023-04-11 22:53:01 +08:00
|
|
|
await this.modPage.waitAndClick(e.currentPresentationToast);
|
2023-04-05 22:06:00 +08:00
|
|
|
|
2023-07-21 04:07:18 +08:00
|
|
|
//! below lines commented due to https://github.com/bigbluebutton/bigbluebutton/issues/18233
|
|
|
|
//! once it's fixed, re-add lines to the code
|
|
|
|
// const wbBox = await this.modPage.getLocator(e.whiteboard);
|
|
|
|
// await expect(wbBox).toHaveScreenshot('capture-breakout-whiteboard.png', {
|
|
|
|
// maxDiffPixels: 1000,
|
|
|
|
// });
|
2022-12-31 05:49:18 +08:00
|
|
|
}
|
2023-01-31 22:01:56 +08:00
|
|
|
|
2023-02-10 03:43:49 +08:00
|
|
|
async userCanChooseRoom() {
|
2023-01-31 22:01:56 +08:00
|
|
|
await this.userPage.bringToFront();
|
2023-02-10 03:43:49 +08:00
|
|
|
|
|
|
|
await this.userPage.checkElementCount(e.roomOption, 2);
|
2023-01-31 22:01:56 +08:00
|
|
|
|
2023-02-13 21:37:14 +08:00
|
|
|
await this.userPage.getLocator(`${e.fullscreenModal} >> select`).selectOption({index: 1});
|
2023-01-31 22:01:56 +08:00
|
|
|
await this.userPage.waitAndClick(e.modalConfirmButton);
|
|
|
|
|
|
|
|
const breakoutUserPage = await this.userPage.getLastTargetPage(this.context);
|
|
|
|
await breakoutUserPage.bringToFront();
|
2023-02-13 21:37:14 +08:00
|
|
|
await breakoutUserPage.waitForSelector(e.presentationTitle, ELEMENT_WAIT_LONGER_TIME);
|
2023-01-31 22:01:56 +08:00
|
|
|
}
|
2024-09-27 22:30:37 +08:00
|
|
|
|
|
|
|
async breakoutWithDifferentPresentations() {
|
|
|
|
await this.modPage.waitForSelector(e.whiteboard);
|
|
|
|
await uploadMultiplePresentations(this.modPage, [e.uploadPresentationFileName, e.questionSlideFileName]);
|
|
|
|
const closeToasBtnLocator = this.modPage.getLocator(e.closeToastBtn).last();
|
|
|
|
await expect(closeToasBtnLocator).toBeHidden({ timeout: 15000});
|
|
|
|
await this.modPage.waitAndClick(e.manageUsers);
|
|
|
|
await this.modPage.waitAndClick(e.createBreakoutRooms);
|
|
|
|
await this.modPage.waitForSelector(e.randomlyAssign);
|
|
|
|
await this.modPage.dragDropSelector(e.userTest, e.breakoutBox1);
|
|
|
|
const changeSlideBreakoutLocator = await this.modPage.getLocator(e.changeSlideBreakoutRoom1).first();
|
|
|
|
await changeSlideBreakoutLocator.selectOption({ label: 'mockPollSlide.pdf' });
|
|
|
|
await this.modPage.waitAndClick(e.modalConfirmButton);
|
|
|
|
await this.userPage.waitAndClick(e.modalDismissButton);
|
|
|
|
const breakoutUserPage = await this.joinRoom();
|
|
|
|
await breakoutUserPage.hasElement(e.whiteboard, ELEMENT_WAIT_EXTRA_LONG_TIME);
|
|
|
|
await this.modPage.waitForSelector(e.breakoutRoomsItem);
|
|
|
|
const breakoutModPage = await this.joinRoomWithModerator();
|
|
|
|
await breakoutModPage.hasElement(e.presentationTitle);
|
|
|
|
await breakoutModPage.hasElement(e.whiteboard, ELEMENT_WAIT_EXTRA_LONG_TIME);
|
|
|
|
const modWbLocator = breakoutModPage.getLocator(e.whiteboard);
|
|
|
|
await expect(modWbLocator).toHaveScreenshot('moderator-first-room-slide.png');
|
|
|
|
const userWbLocator = breakoutUserPage.getLocator(e.whiteboard);
|
|
|
|
await expect(userWbLocator).toHaveScreenshot('attendee-second-room-slide.png');
|
|
|
|
}
|
2021-11-30 21:42:57 +08:00
|
|
|
}
|
|
|
|
|
2021-12-02 12:12:14 +08:00
|
|
|
exports.Join = Join;
|