Merge pull request #15441 from antonbsa/audio-tests
test: Add new audio tests
This commit is contained in:
commit
ca0195585f
@ -245,9 +245,10 @@ class InputStreamLiveSelector extends Component {
|
|||||||
];
|
];
|
||||||
|
|
||||||
const deviceList = (listLength > 0)
|
const deviceList = (listLength > 0)
|
||||||
? list.map((device) => (
|
? list.map((device, index) => (
|
||||||
{
|
{
|
||||||
key: `${device.deviceId}-${deviceKind}`,
|
key: `${device.deviceId}-${deviceKind}`,
|
||||||
|
dataTest: `${deviceKind}-${index + 1}`,
|
||||||
label: InputStreamLiveSelector.truncateDeviceName(device.label),
|
label: InputStreamLiveSelector.truncateDeviceName(device.label),
|
||||||
customStyles: (device.deviceId === currentDeviceId) && Styled.SelectedLabel,
|
customStyles: (device.deviceId === currentDeviceId) && Styled.SelectedLabel,
|
||||||
iconRight: (device.deviceId === currentDeviceId) ? 'check' : null,
|
iconRight: (device.deviceId === currentDeviceId) ? 'check' : null,
|
||||||
@ -316,7 +317,7 @@ class InputStreamLiveSelector extends Component {
|
|||||||
aria-label={intl.formatMessage(intlMessages.leaveAudio)}
|
aria-label={intl.formatMessage(intlMessages.leaveAudio)}
|
||||||
label={intl.formatMessage(intlMessages.leaveAudio)}
|
label={intl.formatMessage(intlMessages.leaveAudio)}
|
||||||
accessKey={shortcuts.leaveaudio}
|
accessKey={shortcuts.leaveaudio}
|
||||||
data-test='leaveListenOnly'
|
data-test="leaveListenOnly"
|
||||||
hideLabel
|
hideLabel
|
||||||
color="primary"
|
color="primary"
|
||||||
icon={isListenOnly ? 'listen' : 'volume_level_2'}
|
icon={isListenOnly ? 'listen' : 'volume_level_2'}
|
||||||
@ -397,7 +398,7 @@ class InputStreamLiveSelector extends Component {
|
|||||||
? this.renderListenOnlyButton()
|
? this.renderListenOnlyButton()
|
||||||
: this.renderMuteToggleButton()}
|
: this.renderMuteToggleButton()}
|
||||||
<Styled.AudioDropdown
|
<Styled.AudioDropdown
|
||||||
data-test='audioDropdownMenu'
|
data-test="audioDropdownMenu"
|
||||||
emoji="device_list_selector"
|
emoji="device_list_selector"
|
||||||
label={intl.formatMessage(intlMessages.changeAudioDevice)}
|
label={intl.formatMessage(intlMessages.changeAudioDevice)}
|
||||||
hideLabel
|
hideLabel
|
||||||
|
@ -74,6 +74,7 @@ const AudioStreamVolume = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Styled.VolumeMeter
|
<Styled.VolumeMeter
|
||||||
|
data-test={volume > 0 ? 'hasVolume' : 'hasNoVolume'}
|
||||||
min={volumeFloor}
|
min={volumeFloor}
|
||||||
low={low}
|
low={low}
|
||||||
max={high * 1.25}
|
max={high * 1.25}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
const Page = require('../core/page');
|
const Page = require('../core/page');
|
||||||
const e = require('../core/elements');
|
const e = require('../core/elements');
|
||||||
const { ELEMENT_WAIT_LONGER_TIME, ELEMENT_WAIT_TIME } = require('../core/constants');
|
const { ELEMENT_WAIT_LONGER_TIME } = require('../core/constants');
|
||||||
|
const { connectMicrophone, isAudioItemSelected } = require('./util');
|
||||||
|
|
||||||
class Audio extends Page {
|
class Audio extends Page {
|
||||||
constructor(browser, page) {
|
constructor(browser, page) {
|
||||||
@ -18,26 +19,58 @@ class Audio extends Page {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async joinMicrophone() {
|
async joinMicrophone() {
|
||||||
const {
|
await connectMicrophone(this);
|
||||||
autoJoinAudioModal,
|
|
||||||
skipEchoTest,
|
|
||||||
skipEchoTestOnJoin,
|
|
||||||
} = this.settings;
|
|
||||||
|
|
||||||
if (!autoJoinAudioModal) await this.waitAndClick(e.joinAudio);
|
|
||||||
await this.waitAndClick(e.microphoneButton);
|
|
||||||
const shouldSkipEchoTest = skipEchoTest || skipEchoTestOnJoin;
|
|
||||||
if (!shouldSkipEchoTest) {
|
|
||||||
await this.waitForSelector(e.stopHearingButton);
|
|
||||||
await this.waitAndClick(e.joinEchoTestButton);
|
|
||||||
await this.waitForSelector(e.establishingAudioLabel);
|
|
||||||
await this.wasRemoved(e.establishingAudioLabel, ELEMENT_WAIT_LONGER_TIME);
|
|
||||||
}
|
|
||||||
await this.hasElement(e.isTalking);
|
|
||||||
await this.hasElement(e.muteMicButton);
|
await this.hasElement(e.muteMicButton);
|
||||||
await this.waitAndClick(e.audioDropdownMenu);
|
await this.waitAndClick(e.audioDropdownMenu);
|
||||||
await this.hasElement(e.leaveAudio);
|
await this.hasElement(e.leaveAudio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async muteYourselfByButton() {
|
||||||
|
await connectMicrophone(this);
|
||||||
|
await this.waitAndClick(e.muteMicButton);
|
||||||
|
await this.wasRemoved(e.isTalking);
|
||||||
|
await this.hasElement(e.wasTalking);
|
||||||
|
await this.wasRemoved(e.muteMicButton);
|
||||||
|
await this.hasElement(e.unmuteMicButton);
|
||||||
|
await this.wasRemoved(e.talkingIndicator, ELEMENT_WAIT_LONGER_TIME);
|
||||||
|
}
|
||||||
|
|
||||||
|
async changeAudioInput() {
|
||||||
|
await connectMicrophone(this);
|
||||||
|
await this.waitAndClick(e.audioDropdownMenu);
|
||||||
|
await isAudioItemSelected(this, e.defaultInputAudioDevice);
|
||||||
|
await this.waitAndClick(e.secondInputAudioDevice);
|
||||||
|
await this.hasElement(e.isTalking);
|
||||||
|
await this.hasElement(e.muteMicButton);
|
||||||
|
await this.waitAndClick(e.audioDropdownMenu);
|
||||||
|
await isAudioItemSelected(this, e.secondInputAudioDevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
async keepMuteStateOnRejoin() {
|
||||||
|
await connectMicrophone(this);
|
||||||
|
await this.waitAndClick(e.muteMicButton);
|
||||||
|
await this.hasElement(e.wasTalking);
|
||||||
|
await this.wasRemoved(e.muteMicButton);
|
||||||
|
await this.hasElement(e.unmuteMicButton);
|
||||||
|
await this.waitAndClick(e.audioDropdownMenu);
|
||||||
|
await this.waitAndClick(e.leaveAudio);
|
||||||
|
await this.waitAndClick(e.joinAudio);
|
||||||
|
await this.waitAndClick(e.microphoneButton);
|
||||||
|
await this.waitAndClick(e.joinEchoTestButton);
|
||||||
|
await this.waitForSelector(e.establishingAudioLabel);
|
||||||
|
await this.wasRemoved(e.establishingAudioLabel, ELEMENT_WAIT_LONGER_TIME);
|
||||||
|
await this.hasElement(e.unmuteMicButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
async muteYourselfBytalkingIndicator() {
|
||||||
|
await connectMicrophone(this);
|
||||||
|
await this.waitAndClick(e.talkingIndicator);
|
||||||
|
await this.hasElement(e.wasTalking);
|
||||||
|
await this.wasRemoved(e.muteMicButton);
|
||||||
|
await this.hasElement(e.unmuteMicButton);
|
||||||
|
await this.wasRemoved(e.isTalking);
|
||||||
|
await this.wasRemoved(e.talkingIndicator, ELEMENT_WAIT_LONGER_TIME);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.Audio = Audio;
|
exports.Audio = Audio;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
const { test } = require('@playwright/test');
|
const { test } = require('@playwright/test');
|
||||||
|
const { MultiUsers } = require('../user/multiusers');
|
||||||
const { Audio } = require('./audio');
|
const { Audio } = require('./audio');
|
||||||
|
|
||||||
test.describe.parallel('Audio', () => {
|
test.describe.parallel('Audio', () => {
|
||||||
@ -15,4 +16,41 @@ test.describe.parallel('Audio', () => {
|
|||||||
await audio.init(true, false);
|
await audio.init(true, false);
|
||||||
await audio.joinMicrophone();
|
await audio.joinMicrophone();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// https://docs.bigbluebutton.org/2.6/release-tests.html#muteunmute
|
||||||
|
test('Mute yourself by clicking the mute button @ci', async ({ browser, page }) => {
|
||||||
|
const audio = new Audio(browser, page);
|
||||||
|
await audio.init(true, false);
|
||||||
|
await audio.muteYourselfByButton();
|
||||||
|
});
|
||||||
|
|
||||||
|
// https://docs.bigbluebutton.org/2.6/release-tests.html#choosing-different-sources
|
||||||
|
test('Change audio input and keep it connected', async ({ browser, page }) => {
|
||||||
|
const audio = new Audio(browser, page);
|
||||||
|
await audio.init(true, false);
|
||||||
|
await audio.changeAudioInput();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Keep the last mute state after rejoining audio @ci', async ({ browser, page }) => {
|
||||||
|
const audio = new Audio(browser, page);
|
||||||
|
await audio.init(true, false);
|
||||||
|
await audio.keepMuteStateOnRejoin();
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe.parallel('Talking indicator @ci', () => {
|
||||||
|
// https://docs.bigbluebutton.org/2.6/release-tests.html#talking-indicator
|
||||||
|
test('Mute yourself by clicking the talking indicator', async ({ browser, page }) => {
|
||||||
|
const audio = new Audio(browser, page);
|
||||||
|
await audio.init(true, false);
|
||||||
|
await audio.muteYourselfBytalkingIndicator();
|
||||||
|
});
|
||||||
|
|
||||||
|
// https://docs.bigbluebutton.org/2.6/release-tests.html#talking-indicator
|
||||||
|
test('Mute another user by clicking the talking indicator', async ({ browser, context, page }) => {
|
||||||
|
const audio = new MultiUsers(browser, context);
|
||||||
|
await audio.initModPage(page);
|
||||||
|
await audio.initUserPage(false);
|
||||||
|
await audio.muteAnotherUser();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
33
bigbluebutton-tests/playwright/audio/util.js
Normal file
33
bigbluebutton-tests/playwright/audio/util.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
const { expect } = require('@playwright/test');
|
||||||
|
const e = require('../core/elements');
|
||||||
|
const { ELEMENT_WAIT_LONGER_TIME } = require('../core/constants');
|
||||||
|
|
||||||
|
async function connectMicrophone(testPage) {
|
||||||
|
const {
|
||||||
|
autoJoinAudioModal,
|
||||||
|
skipEchoTest,
|
||||||
|
skipEchoTestOnJoin,
|
||||||
|
} = testPage.settings;
|
||||||
|
|
||||||
|
if (!autoJoinAudioModal) await testPage.waitAndClick(e.joinAudio);
|
||||||
|
await testPage.waitAndClick(e.microphoneButton);
|
||||||
|
const shouldSkipEchoTest = skipEchoTest || skipEchoTestOnJoin;
|
||||||
|
if (!shouldSkipEchoTest) {
|
||||||
|
await testPage.waitForSelector(e.stopHearingButton);
|
||||||
|
await testPage.waitAndClick(e.joinEchoTestButton);
|
||||||
|
await testPage.waitForSelector(e.establishingAudioLabel);
|
||||||
|
await testPage.wasRemoved(e.establishingAudioLabel, ELEMENT_WAIT_LONGER_TIME);
|
||||||
|
}
|
||||||
|
await testPage.hasElement(e.isTalking);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function isAudioItemSelected(testPage, audioSelector) {
|
||||||
|
await testPage.waitForSelector(audioSelector);
|
||||||
|
const isSelected = await testPage.page.evaluate(([selector, icon]) => {
|
||||||
|
return !!document.querySelector(selector).firstChild.querySelector(icon);
|
||||||
|
}, [audioSelector, e.checkedIcon]);
|
||||||
|
await expect(isSelected).toBeTruthy();
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.connectMicrophone = connectMicrophone;
|
||||||
|
exports.isAudioItemSelected = isAudioItemSelected;
|
@ -33,10 +33,15 @@ exports.establishingAudioLabel = 'span[data-test="establishingAudioLabel"]';
|
|||||||
exports.leaveListenOnly = 'button[data-test="leaveListenOnly"]';
|
exports.leaveListenOnly = 'button[data-test="leaveListenOnly"]';
|
||||||
exports.leaveAudio = 'li[data-test="leaveAudio"]';
|
exports.leaveAudio = 'li[data-test="leaveAudio"]';
|
||||||
exports.audioDropdownMenu = 'button[data-test="audioDropdownMenu"]';
|
exports.audioDropdownMenu = 'button[data-test="audioDropdownMenu"]';
|
||||||
|
exports.defaultInputAudioDevice = 'li[data-test="audioinput-1"]';
|
||||||
|
exports.secondInputAudioDevice = 'li[data-test="audioinput-2"]';
|
||||||
exports.microphoneButton = 'button[data-test="microphoneBtn"]';
|
exports.microphoneButton = 'button[data-test="microphoneBtn"]';
|
||||||
exports.echoYesButton = 'button[data-test="echoYesBtn"]';
|
exports.echoYesButton = 'button[data-test="echoYesBtn"]';
|
||||||
exports.connectingToEchoTest = 'span[data-test="connectingToEchoTest"]';
|
exports.connectingToEchoTest = 'span[data-test="connectingToEchoTest"]';
|
||||||
|
exports.hasVolumeEchoTest = 'span[data-test="hasVolume"]';
|
||||||
|
exports.hasNoVolumeEchoTest = 'span[data-test="hasNoVolume"]';
|
||||||
exports.isTalking = 'button[data-test="isTalking"]';
|
exports.isTalking = 'button[data-test="isTalking"]';
|
||||||
|
exports.wasTalking = 'button[data-test="wasTalking"]';
|
||||||
exports.talkingIndicator = 'div[data-test="talkingIndicator"]';
|
exports.talkingIndicator = 'div[data-test="talkingIndicator"]';
|
||||||
exports.unmuteMicButton = 'button[data-test="unmuteMicButton"]';
|
exports.unmuteMicButton = 'button[data-test="unmuteMicButton"]';
|
||||||
exports.muteMicButton = 'button[data-test="muteMicButton"]';
|
exports.muteMicButton = 'button[data-test="muteMicButton"]';
|
||||||
@ -125,6 +130,7 @@ exports.loweringHandToast = 'Your hand has been lowered';
|
|||||||
const baseBbbIcon = 'i.icon-bbb-';
|
const baseBbbIcon = 'i.icon-bbb-';
|
||||||
exports.unmuteIcon = `${baseBbbIcon}unmute`;
|
exports.unmuteIcon = `${baseBbbIcon}unmute`;
|
||||||
exports.listenOnlyIcon = `${baseBbbIcon}listen`;
|
exports.listenOnlyIcon = `${baseBbbIcon}listen`;
|
||||||
|
exports.checkedIcon = `${baseBbbIcon}check`;
|
||||||
|
|
||||||
// Polling
|
// Polling
|
||||||
exports.pollQuestion = 'Are we good ?';
|
exports.pollQuestion = 'Are we good ?';
|
||||||
|
@ -6,6 +6,7 @@ const { sleep } = require('../core/helpers');
|
|||||||
const { checkAvatarIcon, checkIsPresenter } = require('./util');
|
const { checkAvatarIcon, checkIsPresenter } = require('./util');
|
||||||
const { checkTextContent } = require('../core/util');
|
const { checkTextContent } = require('../core/util');
|
||||||
const { getSettings } = require('../core/settings');
|
const { getSettings } = require('../core/settings');
|
||||||
|
const { ELEMENT_WAIT_LONGER_TIME } = require('../core/constants');
|
||||||
|
|
||||||
class MultiUsers {
|
class MultiUsers {
|
||||||
constructor(browser, context) {
|
constructor(browser, context) {
|
||||||
@ -67,6 +68,17 @@ class MultiUsers {
|
|||||||
await this.userPage2.init(false, shouldCloseAudioModal, options);
|
await this.userPage2.init(false, shouldCloseAudioModal, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async muteAnotherUser() {
|
||||||
|
await this.userPage.joinMicrophone();
|
||||||
|
await this.modPage.hasElement(e.joinAudio);
|
||||||
|
await this.modPage.waitAndClick(e.isTalking);
|
||||||
|
await this.userPage.hasElement(e.unmuteMicButton);
|
||||||
|
await this.modPage.hasElement(e.wasTalking);
|
||||||
|
await this.userPage.hasElement(e.wasTalking);
|
||||||
|
await this.userPage.wasRemoved(e.talkingIndicator, ELEMENT_WAIT_LONGER_TIME);
|
||||||
|
await this.modPage.wasRemoved(e.talkingIndicator);
|
||||||
|
}
|
||||||
|
|
||||||
async userPresence() {
|
async userPresence() {
|
||||||
const firstUserOnModPage = this.modPage.getLocator(e.currentUser);
|
const firstUserOnModPage = this.modPage.getLocator(e.currentUser);
|
||||||
const secondUserOnModPage = this.modPage.getLocator(e.userListItem);
|
const secondUserOnModPage = this.modPage.getLocator(e.userListItem);
|
||||||
|
Loading…
Reference in New Issue
Block a user