Files
upstream-jitsi-meet/tests/specs/misc/recordingButtonVisibility.spec.ts
upstream-mirror 1d2bfcac0c
Some checks failed
Prosody Plugin Tests / test (push) Failing after 10m11s
Close stale issues and PRs / stale (push) Failing after 1s
snapshot of https://github.com/jitsi/jitsi-meet.git @ fd1749dd28f4138aa80234fc7f311b19aaffa0e7 (2026-09-15)
2026-09-15 15:56:32 +05:00

95 lines
3.5 KiB
TypeScript

import { Participant } from '../../helpers/Participant';
import { setTestProperties } from '../../helpers/TestProperties';
import { expectations } from '../../helpers/expectations';
import { ensureOneParticipant, ensureTwoParticipants } from '../../helpers/participants';
setTestProperties(__filename, {
description: 'Recording button is shown to moderators and hidden from non-moderators',
usesBrowsers: [ 'p1', 'p2' ],
useJaas: true
});
describe('Recording button visibility', () => {
let p1: Participant, p2: Participant;
let localRecordingAvailable: boolean;
it('setup', async () => {
if (!expectations.jaas.recordingEnabled) {
ctx.skipSuiteTests = 'Recording is not enabled in this environment';
return;
}
if (expectations.moderation.allModerators) {
ctx.skipSuiteTests = 'Cannot test non-moderator visibility when all participants are moderators';
return;
}
await ensureOneParticipant();
p1 = ctx.p1;
expect(await p1.isModerator()).toBe(true);
await ensureTwoParticipants();
p2 = ctx.p2;
expect(await p2.isModerator()).toBe(false);
// Mirror the app's supportsLocalRecording() exactly — LocalRecordingManager.isSupported()
// plus the (!isEmbedded() || isEmbeddedFromSameDomain()) guard — so the test's expectation
// matches what the app actually renders. These browser/capability gates are frequently unmet
// in the automated test browser even though local recording works in a normal browser, in
// which case the app correctly hides the button from non-moderators.
localRecordingAvailable = await p2.execute(() => {
const state = APP.store.getState();
const { localRecording } = state['features/base/config'];
const browser = JitsiMeetJS.util.browser;
const PREFERRED_MEDIA_TYPE = 'video/webm;codecs=vp8,opus';
// LocalRecordingManager.isSupported()
const isSupported = browser.isChromiumBased()
&& !browser.isElectron()
&& !browser.isReactNative()
&& !browser.isMobileDevice()
// @ts-ignore
&& Boolean(navigator.mediaDevices.setCaptureHandleConfig)
// @ts-ignore
&& typeof window.showSaveFilePicker !== 'undefined'
&& MediaRecorder.isTypeSupported(PREFERRED_MEDIA_TYPE);
// (!isEmbedded() || isEmbeddedFromSameDomain())
let embeddedOk = true;
try {
if (window.self !== window.top) {
embeddedOk = window.self.location.host === window.parent.location.host;
}
} catch (e) {
embeddedOk = false;
}
return localRecording?.disable !== true && isSupported && embeddedOk;
});
});
it('moderator sees the recording button', async () => {
expect(await p1.getToolbar().hasRecordingButton()).toBe(true);
});
it('non-moderator does not see the recording button when local recording is disabled', async () => {
if (localRecordingAvailable) {
return;
}
expect(await p2.getToolbar().hasRecordingButton()).toBe(false);
});
it('non-moderator sees the recording button when local recording is enabled', async () => {
if (!localRecordingAvailable) {
return;
}
expect(await p2.getToolbar().hasRecordingButton()).toBe(true);
});
});