diff --git a/apps/meteor/tests/e2e/admin-users-role-management.spec.ts b/apps/meteor/tests/e2e/admin-users-role-management.spec.ts index 10757f3b2a60f..35d4395e6f7bc 100644 --- a/apps/meteor/tests/e2e/admin-users-role-management.spec.ts +++ b/apps/meteor/tests/e2e/admin-users-role-management.spec.ts @@ -36,11 +36,11 @@ test.describe('Admin > Users Role Management', () => { await test.step('should be visible in the All tab', async () => { await admin.getTabByName().click(); await expect(admin.getUserRowByUsername(userWithoutAdminAccess.data.username)).toBeVisible(); + await expect(admin.getUserRowByUsername(userWithoutAdminAccess.data.username)).toHaveCount(1); }); await test.step('make a user admin', async () => { - await admin.openUserActionMenu(userWithoutAdminAccess.data.username); - await admin.menuItemMakeAdmin.click(); + await admin.dispatchUserAction(userWithoutAdminAccess.data.username, 'Make Admin'); await expect(poToastBar.alert).toBeVisible(); await expect(poToastBar.alert).toHaveText('User is now an admin'); }); @@ -60,8 +60,7 @@ test.describe('Admin > Users Role Management', () => { }); await test.step('remove admin role', async () => { - await admin.openUserActionMenu(userWithAdminAccess.data.username); - await admin.menuItemRemoveAdmin.click(); + await admin.dispatchUserAction(userWithAdminAccess.data.username, 'Remove Admin'); await expect(poToastBar.alert).toBeVisible(); await expect(poToastBar.alert).toHaveText('User is no longer an admin'); }); diff --git a/apps/meteor/tests/e2e/admin-users-status-management.spec.ts b/apps/meteor/tests/e2e/admin-users-status-management.spec.ts index f920bf9da29b9..5e98b8bce5be1 100644 --- a/apps/meteor/tests/e2e/admin-users-status-management.spec.ts +++ b/apps/meteor/tests/e2e/admin-users-status-management.spec.ts @@ -2,7 +2,7 @@ import type { BrowserContext, Page } from '@playwright/test'; import { DEFAULT_USER_CREDENTIALS } from './config/constants'; import { Users } from './fixtures/userStates'; -import { AdminUsers, Registration, Utils } from './page-objects'; +import { AdminUsers, Registration, Authenticated } from './page-objects'; import { test, expect } from './utils/test'; import type { ITestUser } from './utils/user-helpers'; import { createTestUser } from './utils/user-helpers'; @@ -22,13 +22,13 @@ test.describe.serial('Admin > Users', () => { let context: BrowserContext; let page: Page; let poRegistration: Registration; - let poUtils: Utils; + let poAuth: Authenticated; test.beforeAll(async ({ browser }) => { context = await browser.newContext(); page = await context.newPage(); poRegistration = new Registration(page); - poUtils = new Utils(page); + poAuth = new Authenticated(page); }); test.afterAll(async () => { @@ -44,7 +44,7 @@ test.describe.serial('Admin > Users', () => { }); await test.step('Assert user is logged in', async () => { - await expect(poUtils.mainContent).toBeVisible(); + await poAuth.waitForDisplay(); }); }); }); diff --git a/apps/meteor/tests/e2e/admin-users.spec.ts b/apps/meteor/tests/e2e/admin-users.spec.ts index 95e7eb5ca05ee..c7f6be2a598a3 100644 --- a/apps/meteor/tests/e2e/admin-users.spec.ts +++ b/apps/meteor/tests/e2e/admin-users.spec.ts @@ -22,6 +22,7 @@ test.describe('Admin > Users', () => { admin = new AdminUsers(page); await page.goto('/admin/users'); }); + test('New user shows in correct tabs when deactivated', async () => { await admin.inputSearchUsers.fill(user.data.username); @@ -47,8 +48,7 @@ test.describe('Admin > Users', () => { await test.step('should move from Pending to Deactivated tab', async () => { await admin.getTabByName('Pending').click(); - await admin.btnMoreActionsMenu.click(); - await admin.menuItemDeactivated.click(); + await admin.dispatchUserAction(user.data.username, 'Deactivate'); await expect(admin.getUserRowByUsername(user.data.username)).not.toBeVisible(); await admin.getTabByName('Deactivated').click(); await expect(admin.getUserRowByUsername(user.data.username)).toBeVisible(); @@ -56,8 +56,7 @@ test.describe('Admin > Users', () => { await test.step('should move from Deactivated to Pending tab', async () => { await admin.getTabByName('Deactivated').click(); - await admin.btnMoreActionsMenu.click(); - await admin.menuItemActivate.click(); + await admin.dispatchUserAction(user.data.username, 'Activate'); await expect(admin.getUserRowByUsername(user.data.username)).not.toBeVisible(); await admin.getTabByName('Pending').click(); await expect(admin.getUserRowByUsername(user.data.username)).toBeVisible(); diff --git a/apps/meteor/tests/e2e/administration.spec.ts b/apps/meteor/tests/e2e/administration.spec.ts index cc81a32d09736..85d54681cc38c 100644 --- a/apps/meteor/tests/e2e/administration.spec.ts +++ b/apps/meteor/tests/e2e/administration.spec.ts @@ -3,20 +3,16 @@ import type { IUser } from '@rocket.chat/apps-engine/definition/users'; import { IS_EE } from './config/constants'; import { Users } from './fixtures/userStates'; -import { Utils, AdminUsers, AdminRoles, AdminRooms, AdminThirdPartyLogin, AdminIntegrations } from './page-objects'; +import { AdminUsers, AdminRoles, AdminRooms, AdminThirdPartyLogin, AdminIntegrations } from './page-objects'; +import { ToastMessages } from './page-objects/fragments'; import { createTargetChannel, setSettingValueById } from './utils'; import { test, expect } from './utils/test'; test.use({ storageState: Users.admin.state }); test.describe.parallel('administration', () => { - let poUtils: Utils; let targetChannel: string; - test.beforeEach(async ({ page }) => { - poUtils = new Utils(page); - }); - test.describe('Workspace', () => { test.beforeEach(async ({ page }) => { await page.goto('/admin/info'); @@ -119,6 +115,11 @@ test.describe.parallel('administration', () => { const emptyChannelName = faker.string.uuid(); let ownerUser: IUser; let user: IUser; + let poToastMessage: ToastMessages; + + test.beforeEach(({ page }) => { + poToastMessage = new ToastMessages(page); + }); test.beforeAll(async ({ api }) => { const createUserResponse = await api.post('/users.create', { @@ -168,7 +169,7 @@ test.describe.parallel('administration', () => { await expect(page.getByRole('dialog').getByRole('button', { name: 'Delete' })).toBeVisible(); await page.getByRole('dialog').getByRole('button', { name: 'Delete' }).click(); - await expect(poUtils.toastBarSuccess).toBeVisible(); + await poToastMessage.waitForDisplay(); await expect(page.getByRole('heading', { name: 'No users' })).toBeVisible(); }); @@ -177,7 +178,8 @@ test.describe.parallel('administration', () => { await expect(page.getByRole('dialog', { name: 'Are you sure?' })).toBeVisible(); await page.getByRole('dialog').getByRole('button', { name: 'Delete' }).click(); - await expect(poUtils.toastBarSuccess).toBeVisible(); + + await poToastMessage.waitForDisplay(); await expect(page.getByRole('heading', { name: 'No users' })).toBeVisible(); }); }); diff --git a/apps/meteor/tests/e2e/delete-account.spec.ts b/apps/meteor/tests/e2e/delete-account.spec.ts index 7c80e6a2b6255..320937bfbe59f 100644 --- a/apps/meteor/tests/e2e/delete-account.spec.ts +++ b/apps/meteor/tests/e2e/delete-account.spec.ts @@ -1,5 +1,5 @@ import { DEFAULT_USER_CREDENTIALS } from './config/constants'; -import { AccountProfile, Registration, Utils } from './page-objects'; +import { AccountProfile, Registration, Authenticated } from './page-objects'; import { ToastBar } from './page-objects/toastBar'; import { test, expect } from './utils/test'; import { createTestUser, type ITestUser } from './utils/user-helpers'; @@ -8,7 +8,7 @@ test.describe('Delete Own Account', () => { let poAccountProfile: AccountProfile; let poRegistration: Registration; let poToastBar: ToastBar; - let poUtils: Utils; + let poAuth: Authenticated; let userToDelete: ITestUser; let userWithInvalidPassword: ITestUser; let userWithoutPermissions: ITestUser; @@ -25,7 +25,7 @@ test.describe('Delete Own Account', () => { poAccountProfile = new AccountProfile(page); poRegistration = new Registration(page); poToastBar = new ToastBar(page); - poUtils = new Utils(page); + poAuth = new Authenticated(page); await page.goto('/home'); }); @@ -43,7 +43,7 @@ test.describe('Delete Own Account', () => { await poRegistration.username.fill(userWithInvalidPassword.data.username); await poRegistration.inputPassword.fill(DEFAULT_USER_CREDENTIALS.password); await poRegistration.btnLogin.click(); - await expect(poUtils.mainContent).toBeVisible(); + await poAuth.waitForDisplay(); }); await test.step('navigate to profile and locate Delete My Account button', async () => { @@ -81,7 +81,7 @@ test.describe('Delete Own Account', () => { await poRegistration.username.fill(userToDelete.data.username); await poRegistration.inputPassword.fill(DEFAULT_USER_CREDENTIALS.password); await poRegistration.btnLogin.click(); - await expect(poUtils.mainContent).toBeVisible(); + await poAuth.waitForDisplay(); }); await test.step('navigate to profile and locate Delete My Account button', async () => { @@ -105,6 +105,7 @@ test.describe('Delete Own Account', () => { }); await test.step('verify user is redirected to login page', async () => { + await poRegistration.waitForDisplay(); await expect(poRegistration.btnLogin).toBeVisible(); userToDelete.markAsDeleted(); }); @@ -121,7 +122,7 @@ test.describe('Delete Own Account', () => { await poRegistration.username.fill(userWithoutPermissions.data.username); await poRegistration.inputPassword.fill(DEFAULT_USER_CREDENTIALS.password); await poRegistration.btnLogin.click(); - await expect(poUtils.mainContent).toBeVisible(); + await poAuth.waitForDisplay(); }); await test.step('navigate to profile and locate Delete My Account button', async () => { diff --git a/apps/meteor/tests/e2e/export-messages.spec.ts b/apps/meteor/tests/e2e/export-messages.spec.ts index c05f06b70ddbf..c118b6e8d4b13 100644 --- a/apps/meteor/tests/e2e/export-messages.spec.ts +++ b/apps/meteor/tests/e2e/export-messages.spec.ts @@ -1,8 +1,8 @@ import { faker } from '@faker-js/faker'; import { Users } from './fixtures/userStates'; -import { HomeChannel, Utils } from './page-objects'; -import { ExportMessagesTab } from './page-objects/fragments/export-messages-tab'; +import { HomeChannel } from './page-objects'; +import { ExportMessagesTab } from './page-objects/fragments'; import { createTargetChannel, deleteChannel } from './utils'; import { test, expect } from './utils/test'; @@ -12,7 +12,6 @@ const uniqueMessage = (): string => `msg-${faker.string.uuid()}`; test.describe('export-messages', () => { let poHomeChannel: HomeChannel; - let poUtils: Utils; let targetChannel: string; test.beforeAll(async ({ api }) => { @@ -21,7 +20,6 @@ test.describe('export-messages', () => { test.beforeEach(async ({ page }) => { poHomeChannel = new HomeChannel(page); - poUtils = new Utils(page); await page.goto('/home'); }); @@ -90,7 +88,9 @@ test.describe('export-messages', () => { await exportMessagesTab.send(); await expect( - poUtils.getAlertByText('You must select one or more users or provide one or more email addresses, separated by commas'), + page.locator('[role="alert"]', { + hasText: 'You must select one or more users or provide one or more email addresses, separated by commas', + }), ).toBeVisible(); }); @@ -104,7 +104,11 @@ test.describe('export-messages', () => { await exportMessagesTab.setAdditionalEmail('mail@mail.com'); await exportMessagesTab.send(); - await expect(poUtils.getAlertByText(`You haven't selected any messages`)).toBeVisible(); + await expect( + page.locator('[role="alert"]', { + hasText: `You haven't selected any messages`, + }), + ).toBeVisible(); }); test('should be able to send messages after closing export messages', async () => { @@ -134,7 +138,7 @@ test.describe('export-messages', () => { await poHomeChannel.tabs.kebab.click({ force: true }); await poHomeChannel.tabs.btnExportMessages.click(); - await expect(exportMessagesTab.dialog).toBeVisible(); + await exportMessagesTab.waitForDisplay(); await poHomeChannel.content.getMessageByText(message1).click(); @@ -162,7 +166,7 @@ test.describe('export-messages', () => { await poHomeChannel.tabs.kebab.click({ force: true }); await poHomeChannel.tabs.btnExportMessages.click(); - await expect(exportMessagesTab.dialog).toBeVisible(); + await exportMessagesTab.waitForDisplay(); await poHomeChannel.content.getMessageByText(message1).click(); await expect(exportMessagesTab.getMessageCheckbox(message1)).toBeChecked(); diff --git a/apps/meteor/tests/e2e/iframe-authentication.spec.ts b/apps/meteor/tests/e2e/iframe-authentication.spec.ts index 0b5e1cb388707..47f23f0971498 100644 --- a/apps/meteor/tests/e2e/iframe-authentication.spec.ts +++ b/apps/meteor/tests/e2e/iframe-authentication.spec.ts @@ -2,7 +2,7 @@ import fs from 'fs'; import path from 'path'; import { Users } from './fixtures/userStates'; -import { Utils, Registration } from './page-objects'; +import { Registration, Authenticated } from './page-objects'; import { test, expect } from './utils/test'; const IFRAME_URL = 'http://iframe.rocket.chat'; @@ -10,7 +10,7 @@ const API_URL = 'http://auth.rocket.chat/api/login'; test.describe('iframe-authentication', () => { let poRegistration: Registration; - let poUtils: Utils; + let poAuth: Authenticated; test.beforeAll(async ({ api }) => { await api.post('/settings/Accounts_iframe_enabled', { value: true }); @@ -28,7 +28,7 @@ test.describe('iframe-authentication', () => { test.beforeEach(async ({ page }) => { poRegistration = new Registration(page); - poUtils = new Utils(page); + poAuth = new Authenticated(page); await page.route(API_URL, async (route) => { await route.fulfill({ @@ -77,7 +77,7 @@ test.describe('iframe-authentication', () => { }); await page.goto('/home'); - await expect(poUtils.mainContent).toBeVisible(); + await poAuth.waitForDisplay(); }); test('should show login page when API returns invalid token', async ({ page }) => { @@ -100,7 +100,7 @@ test.describe('iframe-authentication', () => { await poRegistration.loginIframeSubmitButton.click(); - await expect(poUtils.mainContent).toBeVisible(); + await poAuth.waitForDisplay(); }); test('should return error to iframe when login fails', async ({ page }) => { diff --git a/apps/meteor/tests/e2e/login.spec.ts b/apps/meteor/tests/e2e/login.spec.ts index c96871112b04f..7cb2b5fe506f2 100644 --- a/apps/meteor/tests/e2e/login.spec.ts +++ b/apps/meteor/tests/e2e/login.spec.ts @@ -1,17 +1,17 @@ import { faker } from '@faker-js/faker'; import { DEFAULT_USER_CREDENTIALS } from './config/constants'; -import { Utils, Registration } from './page-objects'; +import { Registration, Authenticated } from './page-objects'; import { setSettingValueById } from './utils/setSettingValueById'; import { test, expect } from './utils/test'; test.describe.parallel('Login', () => { let poRegistration: Registration; - let poUtils: Utils; + let poAuth: Authenticated; test.beforeEach(async ({ page }) => { poRegistration = new Registration(page); - poUtils = new Utils(page); + poAuth = new Authenticated(page); await page.goto('/home'); }); @@ -42,7 +42,7 @@ test.describe.parallel('Login', () => { await poRegistration.inputPassword.type(DEFAULT_USER_CREDENTIALS.password); await poRegistration.btnLogin.click(); - await expect(poUtils.mainContent).toBeVisible(); + await poAuth.waitForDisplay(); }); }); @@ -52,7 +52,7 @@ test.describe.parallel('Login', () => { await poRegistration.inputPassword.type(DEFAULT_USER_CREDENTIALS.password); await poRegistration.btnLogin.click(); - await expect(poUtils.mainContent).toBeVisible(); + await poAuth.waitForDisplay(); }); }); diff --git a/apps/meteor/tests/e2e/page-objects/admin-users.ts b/apps/meteor/tests/e2e/page-objects/admin-users.ts index 52eda08bc9bf4..f9512c6f0b0ad 100644 --- a/apps/meteor/tests/e2e/page-objects/admin-users.ts +++ b/apps/meteor/tests/e2e/page-objects/admin-users.ts @@ -1,25 +1,30 @@ import type { Locator, Page } from '@playwright/test'; import { Admin } from './admin'; -import { UserInfoFlexTab, EditUserFlexTab } from './fragments'; +import { MenuMoreActions, UserInfoFlexTab, EditUserFlexTab } from './fragments'; + +type UserActions = 'Make Admin' | 'Remove Admin' | 'Activate' | 'Deactivate'; export class AdminUsers extends Admin { readonly editUser: EditUserFlexTab; readonly userInfo: UserInfoFlexTab; + readonly userRowMenu: MenuMoreActions; + constructor(page: Page) { super(page); this.editUser = new EditUserFlexTab(page); this.userInfo = new UserInfoFlexTab(page); + this.userRowMenu = new MenuMoreActions(page); } get btnNewUser(): Locator { - return this.page.locator('role=button[name="New user"]'); + return this.page.getByRole('button', { name: 'New user', exact: true }); } get btnInvite(): Locator { - return this.page.locator('role=button[name="Invite"]'); + return this.page.getByRole('button', { name: 'Invite', exact: true }); } get inputSearchUsers(): Locator { @@ -30,22 +35,6 @@ export class AdminUsers extends Admin { return this.page.getByRole('button', { name: 'More actions' }); } - get menuItemDeactivated(): Locator { - return this.page.getByRole('menuitem', { name: 'Deactivate' }); - } - - get menuItemActivate(): Locator { - return this.page.getByRole('menuitem', { name: 'Activate' }); - } - - get menuItemMakeAdmin(): Locator { - return this.page.getByRole('menuitem', { name: 'Make Admin' }); - } - - get menuItemRemoveAdmin(): Locator { - return this.page.getByRole('menuitem', { name: 'Remove Admin' }); - } - getUserRowByUsername(username: string): Locator { return this.page.locator('tr', { hasText: username }); } @@ -54,10 +43,15 @@ export class AdminUsers extends Admin { return this.page.getByRole('tab', { name }); } - async openUserActionMenu(username: string): Promise { + private async openUserActionMenu(username: string): Promise { await this.getUserRowByUsername(username).getByRole('button', { name: 'More actions' }).click(); } + async dispatchUserAction(username: string, action: UserActions) { + await this.openUserActionMenu(username); + await this.userRowMenu.root.getByRole('menuitem', { name: action }).click(); + } + async deleteUser(username: string): Promise { await this.inputSearchUsers.fill(username); await this.getUserRowByUsername(username).click(); diff --git a/apps/meteor/tests/e2e/page-objects/auth.ts b/apps/meteor/tests/e2e/page-objects/auth.ts index 4d63e8b698229..fb237127735bf 100644 --- a/apps/meteor/tests/e2e/page-objects/auth.ts +++ b/apps/meteor/tests/e2e/page-objects/auth.ts @@ -1,10 +1,28 @@ import type { FrameLocator, Locator, Page } from '@playwright/test'; -export class Registration { - private readonly page: Page; +import { expect } from '../utils/test'; - constructor(page: Page) { - this.page = page; +abstract class Main { + constructor(protected root: Locator) {} + + waitForDisplay() { + return expect(this.root).toBeVisible(); + } + + waitForDismissal() { + return expect(this.root).not.toBeVisible(); + } +} + +export class Authenticated extends Main { + constructor(protected page: Page) { + super(page.locator('#main-content')); + } +} + +export class Registration extends Main { + constructor(protected page: Page) { + super(page.getByRole('main')); } get btnSendInstructions(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/fragments/export-messages-tab.ts b/apps/meteor/tests/e2e/page-objects/fragments/export-messages-tab.ts index fdb6822f1362f..fc47a7ade63b6 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/export-messages-tab.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/export-messages-tab.ts @@ -1,14 +1,10 @@ import type { Locator, Page } from '@playwright/test'; -export class ExportMessagesTab { - private readonly root: Locator; +import { FlexTab } from './flextab'; +export class ExportMessagesTab extends FlexTab { constructor(page: Page) { - this.root = page.getByRole('dialog', { name: 'Export Messages' }); - } - - get dialog() { - return this.root; + super(page.getByRole('dialog', { name: 'Export Messages' })); } async exposeMethods() { diff --git a/apps/meteor/tests/e2e/page-objects/fragments/index.ts b/apps/meteor/tests/e2e/page-objects/fragments/index.ts index 62943469c40b9..66e32ce94687e 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/index.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/index.ts @@ -10,3 +10,6 @@ export * from './navbar'; export * from './sidebar'; export * from './sidepanel'; export * from './report-message-modal'; +export * from './toast-messages'; +export * from './export-messages-tab'; +export * from './menu'; diff --git a/apps/meteor/tests/e2e/page-objects/fragments/menu.ts b/apps/meteor/tests/e2e/page-objects/fragments/menu.ts index 814b476ad4be0..1bafdbcaa0cd4 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/menu.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/menu.ts @@ -19,3 +19,9 @@ export class MenuMore extends Menu { super(page.getByRole('menu', { name: 'More' })); } } + +export class MenuMoreActions extends Menu { + constructor(page: Page) { + super(page.getByRole('menu', { name: 'More actions' })); + } +} diff --git a/apps/meteor/tests/e2e/page-objects/fragments/toast-messages.ts b/apps/meteor/tests/e2e/page-objects/fragments/toast-messages.ts index 00fd5616bf3ed..5623adbe08225 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/toast-messages.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/toast-messages.ts @@ -1,14 +1,31 @@ import type { Page } from '@playwright/test'; +import { expect } from '../../utils/test'; + export class ToastMessages { constructor(private readonly page: Page) {} private readonly toastByType = { - success: this.page.locator('.rcx-toastbar.rcx-toastbar--success'), + success: this.page.locator('.rcx-toastbar--success'), + error: this.page.locator('.rcx-toastbar--error'), }; async dismissToast(type: 'success') { await this.toastByType[type].locator('button >> i.rcx-icon--name-cross.rcx-icon').click(); await this.page.mouse.move(0, 0); } + + private getAlertByText(text: string) { + return this.page.locator('[role="alert"]', { + hasText: text, + }); + } + + waitForDisplay({ type, message }: { type: 'success' | 'error'; message?: string } = { type: 'success' }) { + if (message) { + return expect(this.toastByType[type].and(this.getAlertByText(message))).toBeVisible(); + } + + return expect(this.toastByType[type]).toBeVisible(); + } } diff --git a/apps/meteor/tests/e2e/page-objects/index.ts b/apps/meteor/tests/e2e/page-objects/index.ts index 2b888b6f61b88..2c1472d182968 100644 --- a/apps/meteor/tests/e2e/page-objects/index.ts +++ b/apps/meteor/tests/e2e/page-objects/index.ts @@ -27,6 +27,5 @@ export * from './omnichannel-monitors'; export * from './omnichannel-settings'; export * from './omnichannel-business-hours'; export * from './omnichannel-tags'; -export * from './utils'; export * from './marketplace'; export * from './toastBar'; diff --git a/apps/meteor/tests/e2e/page-objects/utils.ts b/apps/meteor/tests/e2e/page-objects/utils.ts deleted file mode 100644 index b969a673e57df..0000000000000 --- a/apps/meteor/tests/e2e/page-objects/utils.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { Locator, Page } from '@playwright/test'; - -export class Utils { - private readonly page: Page; - - constructor(page: Page) { - this.page = page; - } - - get mainContent(): Locator { - return this.page.locator('#main-content'); - } - - get toastBarSuccess(): Locator { - return this.page.locator('.rcx-toastbar.rcx-toastbar--success'); - } - - getAlertByText(text: string): Locator { - return this.page.locator('[role="alert"]', { - hasText: text, - }); - } -} diff --git a/apps/meteor/tests/e2e/preview-public-channel.spec.ts b/apps/meteor/tests/e2e/preview-public-channel.spec.ts index 774ab2d2ab782..b6b2bb648a26c 100644 --- a/apps/meteor/tests/e2e/preview-public-channel.spec.ts +++ b/apps/meteor/tests/e2e/preview-public-channel.spec.ts @@ -1,6 +1,6 @@ import { IS_EE } from './config/constants'; import { Users } from './fixtures/userStates'; -import { HomeChannel, Utils } from './page-objects'; +import { HomeChannel } from './page-objects'; import { Directory } from './page-objects/directory'; import { createDirectMessage, createTargetChannel, sendTargetChannelMessage } from './utils'; import { test, expect } from './utils/test'; @@ -10,14 +10,12 @@ test.use({ storageState: Users.admin.state }); test.describe('Preview public channel', () => { let poHomeChannel: HomeChannel; let poDirectory: Directory; - let poUtils: Utils; let targetChannel: string; let targetChannelMessage: string; test.beforeEach(async ({ page }) => { poHomeChannel = new HomeChannel(page); poDirectory = new Directory(page); - poUtils = new Utils(page); await page.goto('/home'); }); @@ -69,7 +67,7 @@ test.describe('Preview public channel', () => { test.skip(!IS_EE, 'Premium Only'); test.use({ storageState: Users.userNotAllowedByApp.state }); - test('should prevent user from join the room', async ({ api }) => { + test('should prevent user from join the room', async ({ api, page }) => { await api.post('/permissions.update', { permissions: [{ _id: 'preview-c-room', roles: ['admin', 'user', 'anonymous'] }] }); await poHomeChannel.sidenav.openDirectory(); await poDirectory.openChannel(targetChannel); @@ -78,10 +76,14 @@ test.describe('Preview public channel', () => { await poHomeChannel.btnJoinRoom.click(); - await expect(poUtils.getAlertByText('TEST OF NOT ALLOWED USER')).toBeVisible(); + await expect( + page.locator('[role="alert"]', { + hasText: 'TEST OF NOT ALLOWED USER', + }), + ).toBeVisible(); }); - test('should prevent user from join the room without preview permission', async ({ api }) => { + test('should prevent user from join the room without preview permission', async ({ api, page }) => { await api.post('/permissions.update', { permissions: [{ _id: 'preview-c-room', roles: ['admin'] }] }); await poHomeChannel.sidenav.openDirectory(); @@ -90,7 +92,11 @@ test.describe('Preview public channel', () => { await poHomeChannel.content.btnJoinChannel.click(); - await expect(poUtils.getAlertByText('TEST OF NOT ALLOWED USER')).toBeVisible(); + await expect( + page.locator('[role="alert"]', { + hasText: 'TEST OF NOT ALLOWED USER', + }), + ).toBeVisible(); }); }); }); diff --git a/apps/meteor/tests/e2e/register.spec.ts b/apps/meteor/tests/e2e/register.spec.ts index bf0e8029654c5..35c402281d87f 100644 --- a/apps/meteor/tests/e2e/register.spec.ts +++ b/apps/meteor/tests/e2e/register.spec.ts @@ -1,19 +1,19 @@ import { faker } from '@faker-js/faker'; -import { Utils, Registration } from './page-objects'; +import { Authenticated, Registration } from './page-objects'; import { request } from '../data/api-data'; import { test, expect } from './utils/test'; test.describe.parallel('register', () => { let poRegistration: Registration; - let poUtils: Utils; + let poAuth: Authenticated; - test.describe('Registration default flow', async () => { - test.beforeEach(async ({ page }) => { - poRegistration = new Registration(page); - poUtils = new Utils(page); - }); + test.beforeEach(({ page }) => { + poRegistration = new Registration(page); + poAuth = new Authenticated(page); + }); + test.describe('Registration default flow', async () => { test('should complete the registration flow', async ({ page }) => { await test.step('expect trigger a validation error if no data is provided on register', async () => { await page.goto('/home'); @@ -41,7 +41,7 @@ test.describe.parallel('register', () => { await test.step('expect successfully register a new user', async () => { await poRegistration.inputPasswordConfirm.fill('any_password'); await poRegistration.btnRegister.click(); - await expect(poUtils.mainContent).toBeVisible(); + await poAuth.waitForDisplay(); }); }); @@ -77,7 +77,7 @@ test.describe.parallel('register', () => { await poRegistration.inputPassword.fill('any_password'); await poRegistration.btnRegister.click(); - await expect(poUtils.mainContent).toBeVisible(); + await poAuth.waitForDisplay(); }); }); }); @@ -143,11 +143,6 @@ test.describe.parallel('register', () => { }); test.describe('Registration form validation', async () => { - test.beforeEach(async ({ page }) => { - poRegistration = new Registration(page); - poUtils = new Utils(page); - }); - test('should not allow registration with an already registered email', async ({ page }) => { const email = faker.internet.email(); await request.post('/api/v1/users.register').set('Content-Type', 'application/json').send({ @@ -173,9 +168,7 @@ test.describe.parallel('register', () => { }); test.describe('Registration for secret password', async () => { - test.beforeEach(async ({ api, page }) => { - poRegistration = new Registration(page); - poUtils = new Utils(page); + test.beforeEach(async ({ api }) => { const result = await api.post('/settings/Accounts_RegistrationForm', { value: 'Secret URL' }); await api.post('/settings/Accounts_RegistrationForm_SecretURL', { value: 'secret' }); await expect(result.ok()).toBeTruthy(); @@ -213,7 +206,7 @@ test.describe.parallel('register', () => { await poRegistration.inputPassword.fill('any_password'); await poRegistration.inputPasswordConfirm.fill('any_password'); await poRegistration.btnRegister.click(); - await expect(poUtils.mainContent).toBeVisible(); + await poAuth.waitForDisplay(); }); });