2024-05-02 19:58:18 +08:00
|
|
|
const { expect } = require('@playwright/test');
|
2022-11-22 21:44:28 +08:00
|
|
|
const playwright = require("playwright");
|
2021-11-18 04:07:14 +08:00
|
|
|
const Page = require('../core/page');
|
|
|
|
const e = require('../core/elements');
|
2022-06-08 02:52:22 +08:00
|
|
|
const { waitAndClearDefaultPresentationNotification } = require('../notifications/util');
|
2022-02-04 22:13:42 +08:00
|
|
|
const { sleep } = require('../core/helpers');
|
2022-09-13 01:10:57 +08:00
|
|
|
const { checkTextContent, checkElementLengthEqualTo } = require('../core/util');
|
2022-12-08 02:53:56 +08:00
|
|
|
const { checkAvatarIcon, checkIsPresenter, checkMutedUsers } = require('./util');
|
2023-01-11 00:59:08 +08:00
|
|
|
const { getNotesLocator } = require('../sharednotes/util');
|
2022-03-29 21:53:07 +08:00
|
|
|
const { getSettings } = require('../core/settings');
|
2023-07-25 05:07:51 +08:00
|
|
|
const { ELEMENT_WAIT_TIME } = require('../core/constants');
|
2021-11-16 00:42:29 +08:00
|
|
|
|
|
|
|
class MultiUsers {
|
2021-12-01 13:35:41 +08:00
|
|
|
constructor(browser, context) {
|
|
|
|
this.browser = browser;
|
|
|
|
this.context = context;
|
2021-11-16 00:42:29 +08:00
|
|
|
}
|
|
|
|
|
2022-06-24 09:38:49 +08:00
|
|
|
async initPages(page1, waitAndClearDefaultPresentationNotificationModPage = false) {
|
2021-12-01 13:35:41 +08:00
|
|
|
await this.initModPage(page1);
|
2022-06-24 09:38:49 +08:00
|
|
|
if (waitAndClearDefaultPresentationNotificationModPage) {
|
2022-09-13 01:10:57 +08:00
|
|
|
await waitAndClearDefaultPresentationNotification(this.modPage);
|
2022-06-24 09:38:49 +08:00
|
|
|
}
|
2021-12-01 13:35:41 +08:00
|
|
|
await this.initUserPage();
|
|
|
|
}
|
|
|
|
|
2021-12-15 01:10:44 +08:00
|
|
|
async initModPage(page, shouldCloseAudioModal = true, { fullName = 'Moderator', ...restOptions } = {}) {
|
|
|
|
const options = {
|
|
|
|
...restOptions,
|
2022-02-08 02:01:47 +08:00
|
|
|
fullName,
|
2021-12-15 01:10:44 +08:00
|
|
|
};
|
|
|
|
|
2021-12-01 13:35:41 +08:00
|
|
|
this.modPage = new Page(this.browser, page);
|
2021-12-15 01:10:44 +08:00
|
|
|
await this.modPage.init(true, shouldCloseAudioModal, options);
|
2021-12-01 13:35:41 +08:00
|
|
|
}
|
|
|
|
|
2022-02-08 02:01:47 +08:00
|
|
|
async initModPage2(shouldCloseAudioModal = true, context = this.context, { fullName = 'Moderator2', useModMeetingId = true, ...restOptions } = {}) {
|
|
|
|
const options = {
|
|
|
|
...restOptions,
|
|
|
|
fullName,
|
|
|
|
meetingId: (useModMeetingId) ? this.modPage.meetingId : undefined,
|
|
|
|
};
|
|
|
|
const page = await context.newPage();
|
|
|
|
this.modPage2 = new Page(this.browser, page);
|
|
|
|
await this.modPage2.init(true, shouldCloseAudioModal, options);
|
|
|
|
}
|
2023-01-13 19:16:49 +08:00
|
|
|
|
2021-12-15 01:10:44 +08:00
|
|
|
async initUserPage(shouldCloseAudioModal = true, context = this.context, { fullName = 'Attendee', useModMeetingId = true, ...restOptions } = {}) {
|
|
|
|
const options = {
|
|
|
|
...restOptions,
|
|
|
|
fullName,
|
|
|
|
meetingId: (useModMeetingId) ? this.modPage.meetingId : undefined,
|
|
|
|
};
|
|
|
|
|
2021-12-10 21:30:29 +08:00
|
|
|
const page = await context.newPage();
|
2021-12-01 13:35:41 +08:00
|
|
|
this.userPage = new Page(this.browser, page);
|
2021-12-15 01:10:44 +08:00
|
|
|
await this.userPage.init(false, shouldCloseAudioModal, options);
|
2021-11-16 00:42:29 +08:00
|
|
|
}
|
|
|
|
|
2022-11-22 21:44:28 +08:00
|
|
|
async initUserPage1(shouldCloseAudioModal = true, { fullName = 'Attendee', useModMeetingId = true, ...restOptions } = {}) {
|
|
|
|
const options = {
|
|
|
|
...restOptions,
|
|
|
|
fullName,
|
|
|
|
meetingId: (useModMeetingId) ? this.modPage.meetingId : undefined,
|
|
|
|
};
|
|
|
|
|
|
|
|
const page = await (await playwright.chromium.launch()).newPage();
|
|
|
|
this.userPage1 = new Page(this.browser, page);
|
|
|
|
await this.userPage1.init(false, shouldCloseAudioModal, options);
|
|
|
|
}
|
|
|
|
|
2022-01-29 03:52:22 +08:00
|
|
|
async initUserPage2(shouldCloseAudioModal = true, context = this.context, { fullName = 'Attendee2', useModMeetingId = true, ...restOptions } = {}) {
|
|
|
|
const options = {
|
|
|
|
...restOptions,
|
|
|
|
fullName,
|
|
|
|
meetingId: (useModMeetingId) ? this.modPage.meetingId : undefined,
|
|
|
|
};
|
|
|
|
|
|
|
|
const page = await context.newPage();
|
|
|
|
this.userPage2 = new Page(this.browser, page);
|
|
|
|
await this.userPage2.init(false, shouldCloseAudioModal, options);
|
|
|
|
}
|
|
|
|
|
2021-11-23 05:51:16 +08:00
|
|
|
async userPresence() {
|
2022-09-23 04:17:15 +08:00
|
|
|
await this.modPage.checkElementCount(e.currentUser, 1);
|
|
|
|
await this.modPage.checkElementCount(e.userListItem, 1);
|
|
|
|
await this.userPage.checkElementCount(e.currentUser, 1);
|
|
|
|
await this.userPage.checkElementCount(e.userListItem, 1);
|
2021-12-10 21:30:29 +08:00
|
|
|
}
|
|
|
|
|
2022-02-08 02:45:42 +08:00
|
|
|
async makePresenter() {
|
|
|
|
await this.modPage.waitAndClick(e.userListItem);
|
|
|
|
await this.modPage.waitAndClick(e.makePresenter);
|
2022-07-02 04:55:32 +08:00
|
|
|
await this.modPage.wasRemoved(e.wbToolbar);
|
2022-02-08 02:45:42 +08:00
|
|
|
|
|
|
|
await this.userPage.hasElement(e.startScreenSharing);
|
|
|
|
await this.userPage.hasElement(e.presentationToolbarWrapper);
|
2022-07-02 04:55:32 +08:00
|
|
|
await this.userPage.hasElement(e.wbToolbar);
|
2022-02-08 02:45:42 +08:00
|
|
|
await this.userPage.hasElement(e.actions);
|
2023-09-16 03:38:43 +08:00
|
|
|
await this.userPage.hasElement(e.userListItem);
|
2022-03-02 04:11:45 +08:00
|
|
|
const isPresenter = await checkIsPresenter(this.userPage);
|
2023-09-16 03:38:43 +08:00
|
|
|
await expect(isPresenter).toBeTruthy();
|
2022-02-08 02:45:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async takePresenter() {
|
2022-03-02 04:11:45 +08:00
|
|
|
await this.modPage2.waitAndClick(e.currentUser);
|
2022-02-08 02:45:42 +08:00
|
|
|
await this.modPage2.waitAndClick(e.takePresenter);
|
2022-07-02 04:55:32 +08:00
|
|
|
await this.modPage.wasRemoved(e.wbToolbar);
|
2022-02-08 02:45:42 +08:00
|
|
|
|
|
|
|
await this.modPage2.hasElement(e.startScreenSharing);
|
2022-07-02 04:55:32 +08:00
|
|
|
await this.modPage2.hasElement(e.wbToolbar);
|
2022-02-08 02:45:42 +08:00
|
|
|
await this.modPage2.hasElement(e.presentationToolbarWrapper);
|
2023-09-16 03:38:43 +08:00
|
|
|
await this.modPage2.hasElement(e.userListItem);
|
2022-03-02 04:11:45 +08:00
|
|
|
const isPresenter = await checkIsPresenter(this.modPage2);
|
2023-09-16 03:38:43 +08:00
|
|
|
await expect(isPresenter).toBeTruthy();
|
2022-02-08 02:45:42 +08:00
|
|
|
await this.modPage2.waitAndClick(e.actions);
|
|
|
|
await this.modPage2.hasElement(e.managePresentations);
|
|
|
|
await this.modPage2.hasElement(e.polling);
|
|
|
|
await this.modPage2.hasElement(e.shareExternalVideoBtn);
|
|
|
|
}
|
|
|
|
|
2022-02-08 02:01:47 +08:00
|
|
|
async promoteToModerator() {
|
|
|
|
await checkAvatarIcon(this.userPage, false);
|
|
|
|
await this.userPage.wasRemoved(e.manageUsers);
|
|
|
|
await this.modPage.waitAndClick(e.userListItem);
|
|
|
|
await this.modPage.waitAndClick(e.promoteToModerator);
|
|
|
|
await checkAvatarIcon(this.userPage);
|
|
|
|
await this.userPage.hasElement(e.manageUsers);
|
|
|
|
}
|
|
|
|
|
|
|
|
async demoteToViewer() {
|
|
|
|
await checkAvatarIcon(this.modPage2);
|
|
|
|
await this.modPage2.hasElement(e.manageUsers);
|
|
|
|
await this.modPage.waitAndClick(e.userListItem);
|
|
|
|
await this.modPage.waitAndClick(e.demoteToViewer);
|
|
|
|
await checkAvatarIcon(this.modPage2, false);
|
|
|
|
await this.modPage2.wasRemoved(e.manageUsers);
|
|
|
|
}
|
|
|
|
|
2022-03-29 21:53:07 +08:00
|
|
|
async raiseAndLowerHand() {
|
2023-07-25 05:07:51 +08:00
|
|
|
const { reactionsButton } = getSettings();
|
|
|
|
if (!reactionsButton) {
|
|
|
|
await this.modPage.waitForSelector(e.whiteboard);
|
|
|
|
await this.modPage.hasElement(e.joinAudio);
|
|
|
|
await this.modPage.wasRemoved(e.reactionsButton);
|
|
|
|
return;
|
|
|
|
}
|
2022-03-29 21:53:07 +08:00
|
|
|
|
2022-07-02 04:55:32 +08:00
|
|
|
await this.initUserPage();
|
2023-07-25 05:07:51 +08:00
|
|
|
await this.userPage.waitAndClick(e.reactionsButton);
|
2022-01-20 03:57:13 +08:00
|
|
|
await this.userPage.waitAndClick(e.raiseHandBtn);
|
2023-08-23 04:25:50 +08:00
|
|
|
await this.userPage.waitAndClick(e.reactionsButton);
|
2022-01-20 03:57:13 +08:00
|
|
|
await this.userPage.hasElement(e.lowerHandBtn);
|
2023-09-14 04:11:15 +08:00
|
|
|
await this.modPage.comparingSelectorsBackgroundColor(e.avatarsWrapperAvatar, `${e.userListItem}`);
|
2023-07-25 05:07:51 +08:00
|
|
|
await sleep(1000);
|
2022-01-20 03:57:13 +08:00
|
|
|
await this.userPage.waitAndClick(e.lowerHandBtn);
|
2023-08-23 04:25:50 +08:00
|
|
|
await this.userPage.waitAndClick(e.reactionsButton);
|
2022-01-20 03:57:13 +08:00
|
|
|
await this.userPage.hasElement(e.raiseHandBtn);
|
2021-12-10 21:30:29 +08:00
|
|
|
}
|
2022-02-08 03:22:48 +08:00
|
|
|
|
2023-02-04 04:04:45 +08:00
|
|
|
async raiseHandRejected() {
|
2023-07-25 05:07:51 +08:00
|
|
|
const { reactionsButton } = getSettings();
|
|
|
|
if (!reactionsButton) {
|
|
|
|
await this.modPage.waitForSelector(e.whiteboard);
|
|
|
|
await this.modPage.hasElement(e.joinAudio);
|
|
|
|
await this.modPage.wasRemoved(e.reactionsButton);
|
|
|
|
return
|
|
|
|
}
|
2023-02-04 04:04:45 +08:00
|
|
|
|
|
|
|
await waitAndClearDefaultPresentationNotification(this.modPage);
|
|
|
|
await this.initUserPage();
|
2023-07-25 05:07:51 +08:00
|
|
|
await this.userPage.waitAndClick(e.reactionsButton);
|
2023-02-04 04:04:45 +08:00
|
|
|
await this.userPage.waitAndClick(e.raiseHandBtn);
|
2023-08-23 04:25:50 +08:00
|
|
|
await this.userPage.waitAndClick(e.reactionsButton);
|
2023-02-04 04:04:45 +08:00
|
|
|
await this.userPage.hasElement(e.lowerHandBtn);
|
2023-07-25 05:07:51 +08:00
|
|
|
await this.userPage.press('Escape');
|
2023-09-14 04:11:15 +08:00
|
|
|
await this.modPage.comparingSelectorsBackgroundColor(e.avatarsWrapperAvatar, `${e.userListItem}`);
|
2023-02-04 04:04:45 +08:00
|
|
|
await this.modPage.waitAndClick(e.raiseHandRejection);
|
2023-07-25 05:07:51 +08:00
|
|
|
await this.userPage.waitAndClick(e.reactionsButton);
|
2023-02-04 04:04:45 +08:00
|
|
|
await this.userPage.hasElement(e.raiseHandBtn);
|
|
|
|
}
|
|
|
|
|
2022-02-08 03:22:48 +08:00
|
|
|
async toggleUserList() {
|
|
|
|
await this.modPage.hasElement(e.chatWelcomeMessageText);
|
|
|
|
await this.modPage.hasElement(e.chatBox);
|
|
|
|
await this.modPage.hasElement(e.chatButton);
|
|
|
|
await this.modPage.waitAndClick(e.userListToggleBtn);
|
|
|
|
await this.modPage.wasRemoved(e.chatWelcomeMessageText);
|
|
|
|
await this.modPage.wasRemoved(e.chatBox);
|
|
|
|
await this.modPage.wasRemoved(e.chatButton);
|
|
|
|
await this.modPage.waitAndClick(e.userListToggleBtn);
|
|
|
|
await this.modPage.wasRemoved(e.chatWelcomeMessageText);
|
|
|
|
await this.modPage.wasRemoved(e.chatBox);
|
|
|
|
await this.modPage.hasElement(e.chatButton);
|
|
|
|
}
|
2022-03-21 23:04:43 +08:00
|
|
|
|
|
|
|
async saveUserNames(testInfo) {
|
|
|
|
await this.modPage.waitAndClick(e.manageUsers);
|
2023-02-16 02:41:21 +08:00
|
|
|
const downloadUserNamesListLocator = this.modPage.getLocator(e.downloadUserNamesList);
|
|
|
|
const { content } = await this.modPage.handleDownload(downloadUserNamesListLocator, testInfo);
|
2022-03-21 23:04:43 +08:00
|
|
|
|
|
|
|
const dataToCheck = [
|
|
|
|
this.modPage.username,
|
|
|
|
this.userPage.username,
|
|
|
|
this.modPage.meetingId,
|
|
|
|
];
|
|
|
|
await checkTextContent(content, dataToCheck);
|
|
|
|
}
|
2021-12-10 21:30:29 +08:00
|
|
|
|
2022-09-13 01:10:57 +08:00
|
|
|
async pinningWebcams() {
|
|
|
|
await this.modPage.shareWebcam();
|
|
|
|
await this.modPage2.shareWebcam();
|
|
|
|
await this.userPage.shareWebcam();
|
|
|
|
await this.modPage.page.waitForFunction(
|
|
|
|
checkElementLengthEqualTo,
|
|
|
|
[e.webcamVideoItem, 3],
|
|
|
|
{ timeout: ELEMENT_WAIT_TIME },
|
|
|
|
);
|
|
|
|
// Pin first webcam (Mod2)
|
|
|
|
await this.modPage.waitAndClick(`:nth-match(${e.dropdownWebcamButton}, 3)`);
|
|
|
|
await this.modPage.waitAndClick(`:nth-match(${e.pinWebcamBtn}, 2)`);
|
|
|
|
await this.modPage.hasText(`:nth-match(${e.dropdownWebcamButton}, 1)`, this.modPage2.username);
|
|
|
|
await this.modPage2.hasText(`:nth-match(${e.dropdownWebcamButton}, 1)`, this.modPage2.username);
|
|
|
|
await this.userPage.hasText(`:nth-match(${e.dropdownWebcamButton}, 1)`, this.modPage2.username);
|
|
|
|
// Pin second webcam (user)
|
|
|
|
await this.modPage.waitAndClick(`:nth-match(${e.dropdownWebcamButton}, 3)`);
|
|
|
|
await this.modPage.waitAndClick(`:nth-match(${e.pinWebcamBtn}, 3)`);
|
|
|
|
await this.modPage.hasText(`:nth-match(${e.dropdownWebcamButton}, 1)`, this.userPage.username);
|
|
|
|
await this.modPage.hasText(`:nth-match(${e.dropdownWebcamButton}, 2)`, this.modPage2.username);
|
|
|
|
await this.userPage.hasText(`:nth-match(${e.dropdownWebcamButton}, 1)`, this.modPage2.username);
|
|
|
|
await this.userPage.hasText(`:nth-match(${e.dropdownWebcamButton}, 2)`, this.userPage.username);
|
|
|
|
await this.modPage2.hasText(`:nth-match(${e.dropdownWebcamButton}, 1)`, this.userPage.username);
|
|
|
|
await this.modPage2.hasText(`:nth-match(${e.dropdownWebcamButton}, 2)`, this.modPage2.username);
|
|
|
|
}
|
|
|
|
|
2021-11-23 05:51:16 +08:00
|
|
|
async whiteboardAccess() {
|
2021-12-02 12:12:14 +08:00
|
|
|
await this.modPage.waitForSelector(e.whiteboard);
|
|
|
|
await this.modPage.waitAndClick(e.userListItem);
|
|
|
|
await this.modPage.waitAndClick(e.changeWhiteboardAccess);
|
2022-07-02 04:55:32 +08:00
|
|
|
await this.modPage.waitForSelector(e.multiUsersWhiteboardOff);
|
|
|
|
const resp = await this.modPage.page.evaluate((multiUsersWbBtn) => {
|
|
|
|
return document.querySelector(multiUsersWbBtn).parentElement.children[1].innerText;
|
|
|
|
}, e.multiUsersWhiteboardOff);
|
2021-11-23 05:51:16 +08:00
|
|
|
await expect(resp).toBeTruthy();
|
|
|
|
}
|
2022-12-08 02:53:56 +08:00
|
|
|
|
|
|
|
async muteAllUsers() {
|
|
|
|
await this.modPage.joinMicrophone();
|
|
|
|
await this.modPage2.joinMicrophone();
|
|
|
|
await this.userPage.joinMicrophone();
|
|
|
|
await this.modPage.waitAndClick(e.manageUsers);
|
|
|
|
await this.modPage.waitAndClick(e.muteAll);
|
|
|
|
|
|
|
|
await checkMutedUsers(this.modPage);
|
|
|
|
await checkMutedUsers(this.modPage2);
|
|
|
|
await checkMutedUsers(this.userPage);
|
|
|
|
}
|
|
|
|
|
|
|
|
async muteAllUsersExceptPresenter(){
|
|
|
|
await this.modPage.joinMicrophone();
|
|
|
|
await this.modPage2.joinMicrophone();
|
|
|
|
await this.userPage.joinMicrophone();
|
|
|
|
await this.modPage.waitAndClick(e.manageUsers);
|
|
|
|
await this.modPage.waitAndClick(e.muteAllExceptPresenter);
|
|
|
|
|
|
|
|
await this.modPage.hasElement(e.isTalking);
|
|
|
|
await checkMutedUsers(this.modPage2);
|
|
|
|
await checkMutedUsers(this.userPage);
|
|
|
|
}
|
2022-12-22 02:30:08 +08:00
|
|
|
|
2022-12-09 02:32:31 +08:00
|
|
|
async giveAndRemoveWhiteboardAccess() {
|
|
|
|
await this.whiteboardAccess();
|
|
|
|
|
|
|
|
await this.modPage.waitForSelector(e.whiteboard);
|
|
|
|
await this.modPage.waitAndClick(e.userListItem);
|
|
|
|
await this.modPage.waitAndClick(e.changeWhiteboardAccess);
|
|
|
|
|
|
|
|
await this.modPage.hasElement(e.multiUsersWhiteboardOn);
|
|
|
|
}
|
2023-01-13 19:16:49 +08:00
|
|
|
|
|
|
|
async removeUser() {
|
|
|
|
await this.modPage.waitAndClick(e.userListItem);
|
|
|
|
await this.modPage.waitAndClick(e.removeUser);
|
|
|
|
await this.modPage.waitAndClick(e.removeUserConfirmationBtn);
|
2023-01-20 20:35:39 +08:00
|
|
|
await this.modPage.wasRemoved(e.userListItem);
|
2023-01-13 19:16:49 +08:00
|
|
|
|
2023-01-13 22:33:16 +08:00
|
|
|
//Will be modified when the issue is fixed and accept just one of both screens
|
|
|
|
//https://github.com/bigbluebutton/bigbluebutton/issues/16463
|
|
|
|
try {
|
|
|
|
await this.modPage2.hasElement(e.errorScreenMessage);
|
|
|
|
} catch (err) {
|
|
|
|
await this.modPage2.hasElement(e.meetingEndedModalTitle);
|
|
|
|
}
|
2023-01-13 19:16:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async removeUserAndPreventRejoining(context) {
|
|
|
|
await this.modPage.waitAndClick(e.userListItem);
|
|
|
|
await this.modPage.waitAndClick(e.removeUser);
|
|
|
|
await this.modPage.waitAndClick(e.confirmationCheckbox);
|
|
|
|
await this.modPage.waitAndClick(e.removeUserConfirmationBtn);
|
2023-01-20 20:35:39 +08:00
|
|
|
await this.modPage.wasRemoved(e.userListItem);
|
2023-01-13 19:16:49 +08:00
|
|
|
|
2023-08-23 04:25:50 +08:00
|
|
|
// Will be modified when the issue is fixed and accept just one of both screens
|
|
|
|
// https://github.com/bigbluebutton/bigbluebutton/issues/16463
|
2023-01-13 22:33:16 +08:00
|
|
|
try {
|
|
|
|
await this.modPage2.hasElement(e.errorScreenMessage);
|
2023-08-23 04:25:50 +08:00
|
|
|
} catch {
|
2023-01-13 22:33:16 +08:00
|
|
|
await this.modPage2.hasElement(e.meetingEndedModalTitle);
|
|
|
|
}
|
2023-08-23 04:25:50 +08:00
|
|
|
|
2024-03-07 01:28:18 +08:00
|
|
|
await this.initModPage2(false, context, { meetingId: this.modPage.meetingId, joinParameter: 'userID=Moderator2', shouldCheckAllInitialSteps: false });
|
2023-08-23 04:25:50 +08:00
|
|
|
|
|
|
|
// Due to same reason above, sometimes it displays different messages
|
|
|
|
try {
|
|
|
|
await this.modPage2.hasText(e.userBannedMessage2, /banned/);
|
|
|
|
} catch {
|
|
|
|
await this.modPage2.hasText(e.userBannedMessage1, /removed/);
|
|
|
|
}
|
2023-01-13 19:16:49 +08:00
|
|
|
}
|
2021-11-16 00:42:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
exports.MultiUsers = MultiUsers;
|