2022-06-08 02:52:22 +08:00
|
|
|
const { expect, test } = require('@playwright/test');
|
2021-12-02 12:12:14 +08:00
|
|
|
const { MultiUsers } = require('../user/multiusers');
|
2021-11-26 02:23:58 +08:00
|
|
|
const e = require('../core/elements');
|
|
|
|
const util = require('./util.js');
|
|
|
|
const utilPresentation = require('../presentation/util');
|
2023-05-10 00:48:40 +08:00
|
|
|
const { ELEMENT_WAIT_LONGER_TIME, ELEMENT_WAIT_TIME } = require('../core/constants');
|
2022-06-08 02:52:22 +08:00
|
|
|
const { getSettings } = require('../core/settings');
|
|
|
|
const { waitAndClearDefaultPresentationNotification } = require('../notifications/util');
|
2021-11-26 02:23:58 +08:00
|
|
|
|
2021-12-02 12:12:14 +08:00
|
|
|
class Polling extends MultiUsers {
|
2021-11-26 02:23:58 +08:00
|
|
|
constructor(browser, context) {
|
2021-12-02 12:12:14 +08:00
|
|
|
super(browser, context);
|
2021-11-26 02:23:58 +08:00
|
|
|
this.newInputText = 'new option';
|
|
|
|
}
|
|
|
|
|
|
|
|
async createPoll() {
|
|
|
|
await util.startPoll(this.modPage);
|
|
|
|
await this.modPage.hasElement(e.pollMenuButton);
|
2023-04-28 20:30:29 +08:00
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
2023-05-09 20:41:08 +08:00
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2021-11-26 02:23:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async pollAnonymous() {
|
|
|
|
await this.modPage.waitForSelector(e.whiteboard, ELEMENT_WAIT_LONGER_TIME);
|
|
|
|
await util.startPoll(this.modPage, false, true);
|
|
|
|
await this.modPage.waitForSelector(e.publishPollingLabel);
|
|
|
|
await this.userPage.waitAndClick(e.pollAnswerOptionBtn);
|
2021-12-01 22:02:26 +08:00
|
|
|
await this.userPage.wasRemoved(e.receivedAnswer);
|
2023-04-28 20:30:29 +08:00
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
2023-05-09 20:41:08 +08:00
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2021-11-26 02:23:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async quickPoll() {
|
2022-07-05 23:27:40 +08:00
|
|
|
await utilPresentation.uploadSinglePresentation(this.modPage, e.questionSlideFileName);
|
2021-11-26 02:23:58 +08:00
|
|
|
|
2022-08-12 08:13:36 +08:00
|
|
|
// The slide needs to be uploaded and converted, so wait a bit longer for this step
|
|
|
|
await this.modPage.waitAndClick(e.quickPoll, ELEMENT_WAIT_LONGER_TIME);
|
2021-11-26 02:23:58 +08:00
|
|
|
await this.modPage.waitForSelector(e.pollMenuButton);
|
|
|
|
|
|
|
|
await this.userPage.hasElement(e.pollingContainer);
|
2023-04-28 20:30:29 +08:00
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
2023-05-09 20:41:08 +08:00
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2021-11-26 02:23:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async pollUserResponse() {
|
|
|
|
await this.modPage.waitForSelector(e.whiteboard);
|
|
|
|
await util.openPoll(this.modPage);
|
|
|
|
|
|
|
|
await this.modPage.type(e.pollQuestionArea, e.pollQuestion);
|
|
|
|
await this.modPage.waitAndClick(e.userResponseBtn);
|
|
|
|
await this.modPage.waitAndClick(e.startPoll);
|
|
|
|
|
|
|
|
await this.userPage.waitForSelector(e.pollingContainer);
|
|
|
|
await this.userPage.type(e.pollAnswerOptionInput, e.answerMessage);
|
|
|
|
await this.userPage.waitAndClick(e.pollSubmitAnswer);
|
|
|
|
|
|
|
|
await this.modPage.hasText(e.receivedAnswer, e.answerMessage);
|
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.publishPollingLabel);
|
|
|
|
await this.modPage.waitForSelector(e.restartPoll);
|
|
|
|
|
2023-03-20 03:10:07 +08:00
|
|
|
await this.modPage.hasElement(e.wbDrawnRectangle);
|
|
|
|
await this.userPage.hasElement(e.wbDrawnRectangle);
|
2023-04-28 20:30:29 +08:00
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
2023-05-09 20:41:08 +08:00
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2021-11-26 02:23:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async stopPoll() {
|
|
|
|
await this.modPage.waitForSelector(e.whiteboard, ELEMENT_WAIT_LONGER_TIME);
|
|
|
|
await util.startPoll(this.modPage);
|
|
|
|
await this.userPage.waitForSelector(e.pollingContainer);
|
|
|
|
await this.modPage.waitAndClick(e.cancelPollBtn);
|
|
|
|
await this.userPage.wasRemoved(e.pollingContainer);
|
2022-03-29 21:53:07 +08:00
|
|
|
|
2023-04-28 20:30:29 +08:00
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
2023-05-09 20:41:08 +08:00
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2021-11-26 02:23:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async manageResponseChoices() {
|
|
|
|
await this.modPage.waitForSelector(e.whiteboard, ELEMENT_WAIT_LONGER_TIME);
|
|
|
|
await this.startNewPoll();
|
|
|
|
const initialRespCount = await this.modPage.getSelectorCount(e.pollOptionItem);
|
|
|
|
|
|
|
|
// Add
|
|
|
|
await this.modPage.waitAndClick(e.addPollItem);
|
|
|
|
await this.typeOnLastChoiceInput();
|
|
|
|
await this.modPage.waitAndClick(e.startPoll);
|
|
|
|
|
|
|
|
await expect(initialRespCount + 1).toEqual(await this.getAnswerOptionCount());
|
|
|
|
await this.checkLastOptionText();
|
|
|
|
|
|
|
|
// Delete
|
|
|
|
await this.startNewPoll();
|
|
|
|
await this.modPage.waitAndClick(e.deletePollOption);
|
|
|
|
await this.modPage.waitAndClick(e.startPoll);
|
|
|
|
|
|
|
|
await expect(initialRespCount - 1).toEqual(await this.getAnswerOptionCount());
|
|
|
|
|
|
|
|
// Edit
|
|
|
|
await this.startNewPoll();
|
|
|
|
await this.typeOnLastChoiceInput();
|
|
|
|
await this.modPage.waitAndClick(e.startPoll);
|
|
|
|
|
|
|
|
await expect(initialRespCount).toEqual(await this.getAnswerOptionCount());
|
|
|
|
await this.checkLastOptionText();
|
2023-04-28 20:30:29 +08:00
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.actions);
|
|
|
|
await this.modPage.waitAndClick(e.managePresentations);
|
|
|
|
await this.modPage.waitAndClick(e.removePresentation);
|
|
|
|
await this.modPage.waitAndClick(e.confirmManagePresentation);
|
2021-11-26 02:23:58 +08:00
|
|
|
}
|
|
|
|
|
2023-04-28 20:30:29 +08:00
|
|
|
async notAbleStartNewPollWithoutPresentation() {
|
|
|
|
await this.modPage.waitAndClick(e.actions);
|
|
|
|
await this.modPage.waitAndClick(e.managePresentations);
|
|
|
|
await this.modPage.waitAndClick(e.removePresentation);
|
|
|
|
await this.modPage.waitAndClick(e.confirmManagePresentation);
|
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.actions);
|
|
|
|
await this.modPage.waitAndClick(e.polling);
|
|
|
|
await this.modPage.hasElement(e.noPresentation);
|
|
|
|
}
|
|
|
|
|
2023-05-06 02:12:32 +08:00
|
|
|
async customInput() {
|
2023-04-28 20:30:29 +08:00
|
|
|
await utilPresentation.uploadSinglePresentation(this.modPage, e.questionSlideFileName);
|
2022-10-26 04:12:59 +08:00
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.actions);
|
|
|
|
await this.modPage.waitAndClick(e.polling);
|
|
|
|
await this.modPage.waitAndClickElement(e.autoOptioningPollBtn);
|
|
|
|
|
|
|
|
await this.modPage.type(e.pollQuestionArea, 'Test');
|
|
|
|
await this.modPage.waitAndClick(e.addPollItem);
|
|
|
|
await this.modPage.type(e.pollOptionItem, 'test1');
|
|
|
|
await this.modPage.waitAndClick(e.startPoll);
|
|
|
|
|
|
|
|
await this.userPage.hasElement(e.pollingContainer);
|
2022-11-30 23:50:43 +08:00
|
|
|
await this.userPage.waitAndClick(e.pollAnswerOptionBtn);
|
2022-10-26 04:12:59 +08:00
|
|
|
|
|
|
|
await this.modPage.hasText(e.currentPollQuestion, /Test/);
|
2022-10-27 04:25:48 +08:00
|
|
|
await this.modPage.hasText(e.answer1, '1');
|
2023-05-06 02:12:32 +08:00
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
2023-05-09 20:41:08 +08:00
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2022-10-26 04:12:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async allowMultipleChoices() {
|
|
|
|
await this.modPage.waitAndClick(e.actions);
|
|
|
|
await this.modPage.waitAndClick(e.polling);
|
|
|
|
await this.modPage.waitAndClickElement(e.autoOptioningPollBtn);
|
|
|
|
|
|
|
|
await this.modPage.type(e.pollQuestionArea, 'Test');
|
|
|
|
await this.modPage.waitAndClickElement(e.allowMultiple);
|
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.addPollItem);
|
|
|
|
await this.modPage.waitAndClick(e.startPoll);
|
|
|
|
await this.modPage.hasElement(e.errorNoValueInput);
|
|
|
|
|
|
|
|
await this.modPage.type(e.pollOptionItem1, 'test1');
|
|
|
|
await this.modPage.waitAndClick(e.addPollItem);
|
|
|
|
await this.modPage.type(e.pollOptionItem2, 'test2');
|
|
|
|
await this.modPage.waitAndClick(e.startPoll);
|
|
|
|
await this.modPage.hasText(e.currentPollQuestion, /Test/);
|
|
|
|
|
2023-02-14 21:59:46 +08:00
|
|
|
await this.userPage.waitAndClick(e.firstPollAnswerOptionBtn);
|
|
|
|
await this.userPage.waitAndClick(e.secondPollAnswerOptionBtn);
|
2022-10-26 04:12:59 +08:00
|
|
|
await this.userPage.waitAndClickElement(e.submitAnswersMultiple);
|
|
|
|
|
|
|
|
await this.modPage.hasText(e.answer1, '1');
|
|
|
|
await this.modPage.hasText(e.answer2, '1');
|
2023-05-06 02:12:32 +08:00
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
2023-05-09 20:41:08 +08:00
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2022-10-26 04:12:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async smartSlidesQuestions() {
|
2023-02-14 21:59:46 +08:00
|
|
|
await this.modPage.hasElement(e.whiteboard, ELEMENT_WAIT_LONGER_TIME);
|
2022-10-26 04:12:59 +08:00
|
|
|
await utilPresentation.uploadSinglePresentation(this.modPage, e.smartSlides1, ELEMENT_WAIT_LONGER_TIME);
|
2023-02-14 21:59:46 +08:00
|
|
|
await this.userPage.hasElement(e.currentUser);
|
2022-11-26 03:54:32 +08:00
|
|
|
|
2023-05-25 23:58:44 +08:00
|
|
|
// Type Response
|
2022-10-26 04:12:59 +08:00
|
|
|
await this.modPage.waitAndClick(e.quickPoll);
|
|
|
|
await this.userPage.hasElement(e.responsePollQuestion);
|
|
|
|
await this.userPage.type(e.pollAnswerOptionInput, 'test');
|
|
|
|
await this.userPage.waitAndClick(e.pollSubmitAnswer);
|
2023-05-06 02:12:32 +08:00
|
|
|
await this.userPage.wasRemoved(e.pollingContainer, ELEMENT_WAIT_LONGER_TIME);
|
2022-10-27 04:25:48 +08:00
|
|
|
await this.modPage.hasText(e.receivedAnswer, 'test');
|
|
|
|
|
2022-10-26 04:12:59 +08:00
|
|
|
await this.modPage.waitAndClick(e.publishPollingLabel);
|
2023-05-08 21:14:26 +08:00
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
2023-05-09 20:41:08 +08:00
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2023-05-06 02:12:32 +08:00
|
|
|
|
2023-05-25 23:58:44 +08:00
|
|
|
// Multiple Choices
|
2022-10-26 04:12:59 +08:00
|
|
|
await this.modPage.waitAndClick(e.nextSlide);
|
|
|
|
await this.modPage.waitAndClick(e.quickPoll);
|
2023-05-06 02:12:32 +08:00
|
|
|
await this.userPage.waitAndClick(e.firstPollAnswerDescOption);
|
2023-05-25 23:58:44 +08:00
|
|
|
await this.userPage.waitAndClick(e.secondPollAnswerDescOption);
|
2022-10-26 04:12:59 +08:00
|
|
|
await this.userPage.waitAndClick(e.submitAnswersMultiple);
|
|
|
|
await this.modPage.hasText(e.answer1, '1');
|
2023-05-25 23:58:44 +08:00
|
|
|
await this.modPage.hasText(e.answer2, '1');
|
2022-11-26 03:54:32 +08:00
|
|
|
|
2022-10-26 04:12:59 +08:00
|
|
|
await this.modPage.waitAndClick(e.publishPollingLabel);
|
2023-05-25 23:58:44 +08:00
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
|
|
|
|
|
|
|
// One option answer
|
2022-10-26 04:12:59 +08:00
|
|
|
await this.modPage.waitAndClick(e.nextSlide);
|
|
|
|
await this.modPage.waitAndClick(e.quickPoll);
|
2023-05-25 23:58:44 +08:00
|
|
|
await this.userPage.waitAndClick(e.pollAnswerOptionE);
|
|
|
|
await this.modPage.hasText(e.answerE, '1');
|
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.publishPollingLabel);
|
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2022-10-26 04:12:59 +08:00
|
|
|
|
2023-05-25 23:58:44 +08:00
|
|
|
// Yes/No/Abstention
|
|
|
|
await this.modPage.waitAndClick(e.nextSlide);
|
|
|
|
await this.modPage.waitAndClick(e.yesNoOption);
|
|
|
|
await this.modPage.waitAndClick(e.yesNoAbstentionOption)
|
2023-05-06 02:12:32 +08:00
|
|
|
await this.userPage.waitAndClick(e.pollAnswerOptionBtn);
|
2022-10-26 04:12:59 +08:00
|
|
|
await this.modPage.hasText(e.answer1, '1');
|
2022-11-26 03:54:32 +08:00
|
|
|
|
2022-10-26 04:12:59 +08:00
|
|
|
await this.modPage.waitAndClick(e.publishPollingLabel);
|
2023-05-25 23:58:44 +08:00
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2022-10-26 04:12:59 +08:00
|
|
|
|
2023-05-25 23:58:44 +08:00
|
|
|
// True/False
|
2022-10-26 04:12:59 +08:00
|
|
|
await this.modPage.waitAndClick(e.nextSlide);
|
|
|
|
await this.modPage.waitAndClick(e.quickPoll);
|
2023-05-06 02:12:32 +08:00
|
|
|
await this.userPage.waitAndClick(e.pollAnswerOptionBtn);
|
2022-10-27 04:25:48 +08:00
|
|
|
await this.modPage.hasText(e.answer1, '1');
|
2023-05-25 23:58:44 +08:00
|
|
|
await this.modPage.waitAndClick(e.publishPollingLabel);
|
2022-10-26 04:12:59 +08:00
|
|
|
|
|
|
|
await this.modPage.hasElementDisabled(e.nextSlide);
|
2023-05-08 21:14:26 +08:00
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
2023-05-09 20:41:08 +08:00
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2022-10-26 04:12:59 +08:00
|
|
|
}
|
2023-05-06 02:12:32 +08:00
|
|
|
|
|
|
|
async pollResultsOnChat() {
|
|
|
|
const { pollChatMessage } = getSettings();
|
|
|
|
test.fail(!pollChatMessage, 'Poll results on chat is disabled');
|
|
|
|
|
|
|
|
await this.modPage.waitForSelector(e.whiteboard, ELEMENT_WAIT_LONGER_TIME);
|
|
|
|
await util.startPoll(this.modPage, true);
|
|
|
|
await this.modPage.waitAndClick(e.chatButton);
|
|
|
|
|
2023-05-08 21:14:26 +08:00
|
|
|
const lastChatPollMessageTextModerator = await this.modPage.getLocator(e.chatPollMessageText).last();
|
|
|
|
await expect(lastChatPollMessageTextModerator).toBeVisible();
|
|
|
|
const lastChatPollMessageTextUser = await this.userPage.getLocator(e.chatPollMessageText).last();
|
|
|
|
await expect(lastChatPollMessageTextUser).toBeVisible();
|
2023-05-06 02:12:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async pollResultsOnWhiteboard() {
|
|
|
|
await this.modPage.waitForSelector(e.whiteboard, ELEMENT_WAIT_LONGER_TIME);
|
|
|
|
await util.startPoll(this.modPage, true);
|
2023-05-10 00:48:40 +08:00
|
|
|
const wbDrawnRectangleLocator = await this.modPage.getLocator(e.wbDrawnRectangle).last();
|
|
|
|
await expect(wbDrawnRectangleLocator).toBeVisible({ timeout: ELEMENT_WAIT_TIME});
|
2023-05-08 21:14:26 +08:00
|
|
|
|
2023-07-28 20:16:07 +08:00
|
|
|
const modWbLocator = this.modPage.getLocator(e.whiteboard);
|
|
|
|
const wbBox = await modWbLocator.boundingBox();
|
|
|
|
|
|
|
|
await wbDrawnRectangleLocator.click();
|
|
|
|
await this.modPage.page.mouse.down();
|
|
|
|
await this.modPage.page.mouse.move(wbBox.x + 0.7 * wbBox.width, wbBox.y + 0.7 * wbBox.height);
|
|
|
|
await this.modPage.page.mouse.up();
|
|
|
|
await wbDrawnRectangleLocator.dblclick();
|
|
|
|
await this.modPage.page.keyboard.type('test');
|
|
|
|
await expect(wbDrawnRectangleLocator).toContainText('test');
|
|
|
|
|
|
|
|
// user turns to presenter to edit the poll results
|
|
|
|
await this.modPage.waitAndClick(e.userListItem);
|
|
|
|
await this.modPage.waitAndClick(e.makePresenter);
|
|
|
|
|
|
|
|
const wbDrawnRectangleUserLocator = await this.userPage.getLocator(e.wbDrawnRectangle).last();
|
|
|
|
await wbDrawnRectangleUserLocator.dblclick();
|
|
|
|
await this.userPage.page.keyboard.type('testUser');
|
|
|
|
await expect(wbDrawnRectangleUserLocator).toContainText('testUser');
|
|
|
|
|
|
|
|
await this.modPage.waitAndClick(e.currentUser);
|
|
|
|
await this.modPage.waitAndClick(e.takePresenter);
|
|
|
|
await this.userPage.waitAndClick(e.hidePublicChat);
|
2023-05-06 02:12:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
async pollResultsInDifferentPresentation() {
|
|
|
|
await waitAndClearDefaultPresentationNotification(this.modPage);
|
2023-05-08 21:14:26 +08:00
|
|
|
|
2023-05-06 02:12:32 +08:00
|
|
|
|
|
|
|
await utilPresentation.uploadSinglePresentation(this.modPage, e.questionSlideFileName);
|
2023-05-08 21:14:26 +08:00
|
|
|
await util.startPoll(this.modPage);
|
2023-05-06 02:12:32 +08:00
|
|
|
await this.modPage.waitAndClick(e.publishPollingLabel);
|
|
|
|
|
|
|
|
// Check poll results
|
|
|
|
await this.modPage.hasElement(e.wbDrawnRectangle);
|
|
|
|
|
2023-05-08 21:14:26 +08:00
|
|
|
await this.modPage.waitAndClick(e.closePollingBtn);
|
2023-05-09 20:41:08 +08:00
|
|
|
await this.modPage.wasRemoved(e.closePollingBtn);
|
2023-05-08 21:14:26 +08:00
|
|
|
}
|
2023-05-06 02:12:32 +08:00
|
|
|
|
|
|
|
async startNewPoll() {
|
|
|
|
const hasPollStarted = await this.modPage.checkElement(e.pollMenuButton);
|
|
|
|
if (hasPollStarted) {
|
|
|
|
await this.modPage.waitAndClick(e.cancelPollBtn);
|
|
|
|
await this.userPage.wasRemoved(e.pollingContainer);
|
|
|
|
}
|
|
|
|
await util.openPoll(this.modPage);
|
|
|
|
}
|
|
|
|
|
|
|
|
async getAnswerOptionCount() {
|
|
|
|
await this.userPage.waitForSelector(e.pollingContainer);
|
|
|
|
return this.userPage.getSelectorCount(e.pollAnswerOptionBtn);
|
|
|
|
}
|
|
|
|
|
|
|
|
async typeOnLastChoiceInput() {
|
|
|
|
const lastInput = this.modPage.getLocatorByIndex(e.pollOptionItem, -1);
|
|
|
|
await lastInput.fill(this.newInputText);
|
|
|
|
}
|
|
|
|
|
|
|
|
async checkLastOptionText() {
|
|
|
|
await this.userPage.waitForSelector(e.pollingContainer);
|
|
|
|
const lastOptionText = this.userPage.getLocatorByIndex(e.pollAnswerOptionBtn, -1);
|
|
|
|
await expect(lastOptionText).toHaveText(this.newInputText);
|
|
|
|
}
|
2021-11-26 02:23:58 +08:00
|
|
|
}
|
|
|
|
|
2021-12-04 01:01:36 +08:00
|
|
|
exports.Polling = Polling;
|