From c1e3da23b76cccd3dfafad6d393520460ba23879 Mon Sep 17 00:00:00 2001
From: Weslley Campos <30299972+weslley543@users.noreply.github.com>
Date: Fri, 13 Jan 2023 11:09:00 -0300
Subject: [PATCH] Chore: add e2e test coverage for Video Conference (#27075)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Cauê Felchar <11652381+cauefcr@users.noreply.github.com>
Co-authored-by: Gabriel Engel <1000217+engelgabriel@users.noreply.github.com>
Co-authored-by: lingohub[bot] <69908207+lingohub[bot]@users.noreply.github.com>
Co-authored-by: Yash Rajpal <58601732+yash-rajpal@users.noreply.github.com>
Co-authored-by: gabriellsh <40830821+gabriellsh@users.noreply.github.com>
Co-authored-by: Kevin Aleman <11577696+KevLehman@users.noreply.github.com>
Co-authored-by: Henrique Guimarães Ribeiro <43561537+rique223@users.noreply.github.com>
Co-authored-by: Aleksander Nicacio da Silva <6494543+aleksandernsilva@users.noreply.github.com>
Co-authored-by: Douglas Fabris <27704687+dougfabris@users.noreply.github.com>
---
 apps/meteor/tests/e2e/apps.spec.ts            | 19 ----
 apps/meteor/tests/e2e/config/global-setup.ts  |  3 +
 apps/meteor/tests/e2e/fixtures/insert-apps.ts | 26 ++++++
 .../page-objects/fragments/home-content.ts    | 20 +++++
 .../tests/e2e/utils/create-target-channel.ts  | 14 +++
 .../tests/e2e/video-conference-ring.spec.ts   | 41 +++++++++
 .../meteor/tests/e2e/video-conference.spec.ts | 87 +++++++++++++++++++
 .../src/VideoConfMessage/VideoConfMessage.tsx |  1 +
 8 files changed, 192 insertions(+), 19 deletions(-)
 create mode 100644 apps/meteor/tests/e2e/fixtures/insert-apps.ts
 create mode 100644 apps/meteor/tests/e2e/video-conference-ring.spec.ts
 create mode 100644 apps/meteor/tests/e2e/video-conference.spec.ts

diff --git a/apps/meteor/tests/e2e/apps.spec.ts b/apps/meteor/tests/e2e/apps.spec.ts
index 63c2775d08b..a24ece8811c 100644
--- a/apps/meteor/tests/e2e/apps.spec.ts
+++ b/apps/meteor/tests/e2e/apps.spec.ts
@@ -1,24 +1,11 @@
 import { expect, test } from './utils/test';
 import { HomeChannel } from './page-objects';
 
-const APP_TESTER = {
-	id: '',
-	url: 'https://github.com/RocketChat/Apps.RocketChat.Tester/blob/master/dist/appsrocketchattester_0.0.5.zip?raw=true',
-};
-
 test.use({ storageState: 'user1-session.json' });
 
 test.describe.serial('Apps', () => {
 	let poHomeChannel: HomeChannel;
 
-	test.beforeAll(async ({ api }) => {
-		await api.post('/settings/Apps_Framework_enabled', { value: true });
-		await api.post('/settings/Apps_Framework_Development_Mode', { value: true });
-
-		const { app } = await (await api.post('/api/apps', { url: APP_TESTER.url }, '')).json();
-		APP_TESTER.id = app.id;
-	});
-
 	test.beforeEach(async ({ page }) => {
 		poHomeChannel = new HomeChannel(page);
 
@@ -36,10 +23,4 @@ test.describe.serial('Apps', () => {
 		await poHomeChannel.btnVerticalBarClose.click();
 		await expect(poHomeChannel.btnVerticalBarClose).toBeHidden();
 	});
-
-	test.afterAll(async ({ api }) => {
-		await api.delete(`/api/apps/${APP_TESTER.id}`);
-		await api.post('/settings/Apps_Framework_enabled', { value: false });
-		await api.post('/settings/Apps_Framework_Development_Mode', { value: false });
-	});
 });
diff --git a/apps/meteor/tests/e2e/config/global-setup.ts b/apps/meteor/tests/e2e/config/global-setup.ts
index 148be6168cb..ac24b4e953a 100644
--- a/apps/meteor/tests/e2e/config/global-setup.ts
+++ b/apps/meteor/tests/e2e/config/global-setup.ts
@@ -4,6 +4,7 @@ import { chromium } from '@playwright/test';
 
 import * as constants from './constants';
 import injectInitialData from '../fixtures/inject-initial-data';
+import insertApp from '../fixtures/insert-apps';
 
 const loginProcedure = async (credentials: { username: string; password: string }) => {
 	const browser = await chromium.launch();
@@ -60,4 +61,6 @@ export default async function (): Promise<void> {
 			password: 'any_password',
 		});
 	}
+
+	await insertApp();
 }
diff --git a/apps/meteor/tests/e2e/fixtures/insert-apps.ts b/apps/meteor/tests/e2e/fixtures/insert-apps.ts
new file mode 100644
index 00000000000..6f43d3d721e
--- /dev/null
+++ b/apps/meteor/tests/e2e/fixtures/insert-apps.ts
@@ -0,0 +1,26 @@
+import { request } from '@playwright/test';
+
+import { BASE_API_URL, ADMIN_CREDENTIALS, BASE_URL } from '../config/constants';
+
+const APP_URL = 'https://github.com/RocketChat/Apps.RocketChat.Tester/blob/master/dist/appsrocketchattester_0.0.5.zip?raw=true';
+
+export default async function insertApp(): Promise<void> {
+	const api = await request.newContext();
+
+	const response = await api.post(`${BASE_API_URL}/login`, { data: ADMIN_CREDENTIALS });
+	const jsonToken = await response.json();
+
+	const headers = {
+		'X-Auth-Token': jsonToken.data.authToken,
+		'X-User-Id': jsonToken.data.userId,
+	};
+
+	const { value } = await (await api.get(`${BASE_API_URL}/settings/Apps_Framework_Development_Mode`, { headers })).json();
+
+	if (!value) {
+		await api.post(`${BASE_API_URL}/settings/Apps_Framework_enabled`, { data: { value: true }, headers });
+		await api.post(`${BASE_API_URL}/settings/Apps_Framework_Development_Mode`, { data: { value: true }, headers });
+		await api.post(`${BASE_URL}/api/apps`, { data: { url: APP_URL }, headers });
+		await api.post(`${BASE_API_URL}/settings/VideoConf_Default_Provider`, { data: { value: 'test' }, headers });
+	}
+}
diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts
index dd20f70456a..bac51d5c5a6 100644
--- a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts
+++ b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts
@@ -205,6 +205,26 @@ export class HomeContent {
 		return this.page.locator('[data-qa-id="ToolBoxAction-pause-unfilled"]');
 	}
 
+	get btnCall(): Locator {
+		return this.page.locator('[data-qa-id="ToolBoxAction-phone"]');
+	}
+
+	get btnStartCall(): Locator {
+		return this.page.locator('#video-conf-root .rcx-button--primary.rcx-button >> text="Start call"');
+	}
+
+	get btnDeclineCall(): Locator {
+		return this.page.locator('.rcx-button--secondary-danger.rcx-button >> text="Decline"');
+	}
+
+	ringCallText(text: string): Locator {
+		return this.page.locator(`#video-conf-root .rcx-box.rcx-box--full >> text="${text}"`);
+	}
+
+	get videoConfMessageBlock(): Locator {
+		return this.page.locator('.rcx-videoconf-message-block');
+	}
+
 	get btnAnonymousSignIn(): Locator {
 		return this.page.locator('footer >> role=button[name="Sign in to start talking"]');
 	}
diff --git a/apps/meteor/tests/e2e/utils/create-target-channel.ts b/apps/meteor/tests/e2e/utils/create-target-channel.ts
index bc0a784365f..3e281541b38 100644
--- a/apps/meteor/tests/e2e/utils/create-target-channel.ts
+++ b/apps/meteor/tests/e2e/utils/create-target-channel.ts
@@ -13,3 +13,17 @@ export async function createTargetChannel(api: BaseTest['api']): Promise<string>
 
 	return name;
 }
+
+export async function createTargetTeam(api: BaseTest['api']): Promise<string> {
+	const name = faker.datatype.uuid();
+
+	await api.post('/teams.create', { name, type: 1, members: ['user2', 'user1'] });
+
+	return name;
+}
+
+export async function createDirectMessage(api: BaseTest['api']): Promise<void> {
+	await api.post('/dm.create', {
+		usernames: 'user1,user2',
+	});
+}
diff --git a/apps/meteor/tests/e2e/video-conference-ring.spec.ts b/apps/meteor/tests/e2e/video-conference-ring.spec.ts
new file mode 100644
index 00000000000..ef8b89e69dc
--- /dev/null
+++ b/apps/meteor/tests/e2e/video-conference-ring.spec.ts
@@ -0,0 +1,41 @@
+import type { Browser, Page } from '@playwright/test';
+
+import { expect, test } from './utils/test';
+import { HomeChannel } from './page-objects';
+import { IS_EE } from './config/constants';
+
+const createAuxContext = async (browser: Browser, storageState: string): Promise<{ page: Page; poHomeChannel: HomeChannel }> => {
+	const page = await browser.newPage({ storageState });
+	const poHomeChannel = new HomeChannel(page);
+	await page.goto('/');
+	return { page, poHomeChannel };
+};
+
+test.use({ storageState: 'user1-session.json' });
+
+test.describe('video conference ringing', () => {
+	let poHomeChannel: HomeChannel;
+
+	test.skip(!IS_EE, 'Enterprise Only');
+
+	test.beforeEach(async ({ page }) => {
+		poHomeChannel = new HomeChannel(page);
+
+		await page.goto('/home');
+	});
+
+	test('expect is ringing in direct', async ({ browser }) => {
+		await poHomeChannel.sidenav.openChat('user2');
+		const auxContext = await createAuxContext(browser, 'user2-session.json');
+		await auxContext.poHomeChannel.sidenav.openChat('user1');
+		await poHomeChannel.content.btnCall.click();
+		await poHomeChannel.content.btnStartCall.click();
+
+		await expect(poHomeChannel.content.ringCallText('Calling')).toBeVisible();
+		await expect(auxContext.poHomeChannel.content.ringCallText('Incoming call from')).toBeVisible();
+
+		await auxContext.poHomeChannel.content.btnDeclineCall.click();
+
+		await auxContext.page.close();
+	});
+});
diff --git a/apps/meteor/tests/e2e/video-conference.spec.ts b/apps/meteor/tests/e2e/video-conference.spec.ts
new file mode 100644
index 00000000000..d811a88b92d
--- /dev/null
+++ b/apps/meteor/tests/e2e/video-conference.spec.ts
@@ -0,0 +1,87 @@
+import { expect, test } from './utils/test';
+import { HomeChannel } from './page-objects';
+import { createTargetChannel, createTargetTeam, createDirectMessage } from './utils';
+
+test.use({ storageState: 'user1-session.json' });
+
+test.describe('video conference', () => {
+	let poHomeChannel: HomeChannel;
+	let targetChannel: string;
+	let targetTeam: string;
+
+	test.beforeAll(async ({ api }) => {
+		targetChannel = await createTargetChannel(api);
+		targetTeam = await createTargetTeam(api);
+		await createDirectMessage(api);
+	});
+
+	test.beforeEach(async ({ page }) => {
+		poHomeChannel = new HomeChannel(page);
+
+		await page.goto('/home');
+	});
+
+	test('expect create video conference in a "targetChannel"', async () => {
+		await poHomeChannel.sidenav.openChat(targetChannel);
+
+		await poHomeChannel.content.btnCall.click();
+		await poHomeChannel.content.btnStartCall.click();
+		await expect(poHomeChannel.content.videoConfMessageBlock.last()).toBeVisible();
+	});
+
+	test.describe('test received in a "target channel"', async () => {
+		test.use({ storageState: 'user2-session.json' });
+		test('verify if user received a invite call from "targetChannel"', async () => {
+			await poHomeChannel.sidenav.openChat(targetChannel);
+			await expect(poHomeChannel.content.videoConfMessageBlock.last()).toBeVisible();
+		});
+	});
+
+	test('expect create video conference in a direct', async () => {
+		await poHomeChannel.sidenav.openChat('user2');
+
+		await poHomeChannel.content.btnCall.click();
+		await poHomeChannel.content.btnStartCall.click();
+		await expect(poHomeChannel.content.videoConfMessageBlock.last()).toBeVisible();
+	});
+
+	test.describe('verify if user received from a direct', async () => {
+		test.use({ storageState: 'user2-session.json' });
+		test('verify if user received a call invite in direct', async () => {
+			await poHomeChannel.sidenav.openChat('user1');
+			await expect(poHomeChannel.content.videoConfMessageBlock.last()).toBeVisible();
+		});
+	});
+
+	test('expect create video conference in a "targetTeam"', async () => {
+		await poHomeChannel.sidenav.openChat(targetTeam);
+
+		await poHomeChannel.content.btnCall.click();
+		await poHomeChannel.content.btnStartCall.click();
+		await expect(poHomeChannel.content.videoConfMessageBlock.last()).toBeVisible();
+	});
+
+	test.describe('verify if received from a "targetTeam"', async () => {
+		test.use({ storageState: 'user2-session.json' });
+		test('verify if user received from a "targetTeam"', async () => {
+			await poHomeChannel.sidenav.openChat(targetTeam);
+			await expect(poHomeChannel.content.videoConfMessageBlock.last()).toBeVisible();
+		});
+	});
+
+	test('expect create video conference in a direct multiple', async () => {
+		await poHomeChannel.sidenav.openChat('rocketchat.internal.admin.test, user2');
+
+		await poHomeChannel.content.btnCall.click();
+		await poHomeChannel.content.btnStartCall.click();
+		await expect(poHomeChannel.content.videoConfMessageBlock.last()).toBeVisible();
+	});
+
+	test.describe('received in a direct multiple', async () => {
+		test.use({ storageState: 'user2-session.json' });
+		test('verify if user received from a multiple', async () => {
+			await poHomeChannel.sidenav.openChat('rocketchat.internal.admin.test, user1');
+			await expect(poHomeChannel.content.videoConfMessageBlock.last()).toBeVisible();
+		});
+	});
+});
diff --git a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.tsx b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.tsx
index 1c166413689..6bf528a8e49 100644
--- a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.tsx
+++ b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.tsx
@@ -10,6 +10,7 @@ const VideoConfMessage = ({ ...props }): ReactElement => (
 		borderWidth={1}
 		borderColor='extra-light'
 		borderRadius='x4'
+		className='rcx-videoconf-message-block'
 		{...props}
 	/>
 );
-- 
GitLab