[IMP] mail: sharing both screen and camera tests

This commit contains the tests related to the screen sharing at the same time with camera sharing on call

closes odoo/odoo#141275

Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
This commit is contained in:
Maryam Kia
2023-11-07 21:02:21 +00:00
parent 9e8259b0e1
commit 546f77d1ca
4 changed files with 55 additions and 22 deletions
@@ -19,7 +19,7 @@
t-ref="root"
>
<!-- card -->
<CallParticipantVideo t-if="hasVideo" session="rtcSession" videoStream="props.cardData.videoStream"/>
<CallParticipantVideo t-if="hasVideo" session="rtcSession" type="props.cardData.type" inset="props.inset"/>
<div t-else="" class="o-discuss-CallParticipantCard-avatar d-flex align-items-center justify-content-center h-100 w-100 rounded-1" t-att-class="{ 'o-minimized': props.minimized }" draggable="false">
<img alt="Avatar"
t-att-class="{
@@ -6,11 +6,10 @@ import { useService } from "@web/core/utils/hooks";
/**
* @typedef {Object} Props
* @property {import("models").RtcSession} session
* @property {MediaStream} [videoStream]
* @extends {Component<Props, Env>}
*/
export class CallParticipantVideo extends Component {
static props = ["session", "videoStream?"];
static props = ["session", "type", "inset?"];
static template = "discuss.CallParticipantVideo";
setup() {
@@ -27,10 +26,10 @@ export class CallParticipantVideo extends Component {
if (!this.root.el) {
return;
}
if (!this.props.session || !this.props.videoStream) {
if (!this.props.session || !this.props.session.getStream(this.props.type)) {
this.root.el.srcObject = undefined;
} else {
this.root.el.srcObject = this.props.videoStream;
this.root.el.srcObject = this.props.session.getStream(this.props.type);
}
this.root.el.load();
}
@@ -2,7 +2,8 @@
<templates xml:space="preserve">
<t t-name="discuss.CallParticipantVideo">
<video class="w-100 h-100 rounded-1 cursor-pointer"
t-attf-class="{{ className }}"
t-att-class="{ 'o-inset': props.inset }"
t-att-type="props.type"
playsinline="true"
autoplay="true"
muted="true"
@@ -19,7 +19,7 @@ QUnit.test("basic rendering", async () => {
});
const { openDiscuss } = await start();
openDiscuss(channelId);
await click(".o-mail-Discuss-header button[title='Start a Call']");
await click("[title='Start a Call']");
await contains(".o-discuss-Call");
await contains(".o-discuss-CallParticipantCard[aria-label='Mitchell Admin']");
await contains(".o-discuss-CallActionList");
@@ -28,9 +28,9 @@ QUnit.test("basic rendering", async () => {
await contains("button[aria-label='Unmute'], button[aria-label='Mute']"); // FIXME depends on current browser permission
await contains(".o-discuss-CallActionList button[aria-label='Deafen']");
await contains(".o-discuss-CallActionList button[aria-label='Turn camera on']");
await contains("button[title='More']");
await contains("[title='More']");
await contains(".o-discuss-CallActionList button[aria-label='Disconnect']");
await click("button[title='More']");
await click("[title='More']");
await contains("[title='Raise Hand']");
await contains("[title='Share Screen']");
await contains("[title='Enter Full Screen']");
@@ -48,7 +48,7 @@ QUnit.test("no call with odoobot", async () => {
const { openDiscuss } = await start();
openDiscuss(channelId);
await contains(".o-mail-Discuss-header");
await contains(".o-mail-Discuss-header button[title='Start a Call']", { count: 0 });
await contains("[title='Start a Call']", { count: 0 });
});
QUnit.test("should not display call UI when no more members (self disconnect)", async () => {
@@ -57,7 +57,7 @@ QUnit.test("should not display call UI when no more members (self disconnect)",
const channelId = pyEnv["discuss.channel"].create({ name: "General" });
const { openDiscuss } = await start();
openDiscuss(channelId);
await click(".o-mail-Discuss-header button[title='Start a Call']");
await click("[title='Start a Call']");
await contains(".o-discuss-Call");
await click(".o-discuss-CallActionList button[aria-label='Disconnect']");
await contains(".o-discuss-Call", { count: 0 });
@@ -97,7 +97,7 @@ QUnit.test("should disconnect when closing page while in call", async (assert) =
},
});
await click(".o-mail-Discuss-header button[title='Start a Call']");
await click("[title='Start a Call']");
await contains(".o-discuss-Call");
// simulate page close
window.dispatchEvent(new Event("pagehide"), { bubble: true });
@@ -156,14 +156,14 @@ QUnit.test("can share screen", async () => {
});
const { openDiscuss } = await start();
openDiscuss(channelId);
await click(".o-mail-Discuss-header button[title='Start a Call']");
await click(".o-discuss-CallActionList [title='More']");
await click("[title='Start a Call']");
await click("[title='More']");
await click("[title='Share Screen']");
await contains(".o-discuss-CallParticipantCard video");
await contains("video");
await triggerEvents(".o-discuss-Call-mainCards", ["mousemove"]); // show overlay
await click(".o-discuss-CallActionList [title='More']");
await click("[title='More']");
await click("[title='Stop Sharing Screen']");
await contains(".o-discuss-CallParticipantCard video", { count: 0 });
await contains("video", { count: 0 });
});
QUnit.test("can share user camera", async () => {
@@ -174,11 +174,11 @@ QUnit.test("can share user camera", async () => {
});
const { openDiscuss } = await start();
openDiscuss(channelId);
await click(".o-mail-Discuss-header button[title='Start a Call']");
await click(".o-discuss-CallActionList button[title='Turn camera on']");
await contains(".o-discuss-CallParticipantCard video");
await click(".o-discuss-CallActionList button[title='Stop camera']");
await contains(".o-discuss-CallParticipantCard video", { count: 0 });
await click("[title='Start a Call']");
await click("[title='Turn camera on']");
await contains("video");
await click("[title='Stop camera']");
await contains("video", { count: 0 });
});
QUnit.test("Create a direct message channel when clicking on start a meeting", async () => {
@@ -190,3 +190,36 @@ QUnit.test("Create a direct message channel when clicking on start a meeting", a
await contains(".o-discuss-Call");
await contains(".o-discuss-ChannelInvitation");
});
QUnit.test("Can share user camera and screen together", async () => {
mockGetMedia();
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({
name: "General",
});
const { openDiscuss } = await start();
openDiscuss(channelId);
await click("[title='Start a Call']");
await click("[title='More']");
await click("[title='Share Screen']");
await click("[title='Turn camera on']");
await contains("video", { count: 2 });
});
QUnit.test("Click on inset card should replace the inset and active stream together", async () => {
mockGetMedia();
const pyEnv = await startServer();
const channelId = pyEnv["discuss.channel"].create({
name: "General",
});
const { openDiscuss } = await start();
openDiscuss(channelId);
await click("[title='Start a Call']");
await click("[title='More']");
await click("[title='Share Screen']");
await click("[title='Turn camera on']");
await contains("video[type='screen']:not(.o-inset)");
await click("video[type='camera'].o-inset");
await contains("video[type='screen'].o-inset");
await contains("video[type='camera']:not(.o-inset)");
});