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