diff --git a/apps/meteor/tests/e2e/account-profile.spec.ts b/apps/meteor/tests/e2e/account-profile.spec.ts index 19e7366398251..a17de8468a1ed 100644 --- a/apps/meteor/tests/e2e/account-profile.spec.ts +++ b/apps/meteor/tests/e2e/account-profile.spec.ts @@ -85,11 +85,11 @@ test.describe.serial('settings-account-profile', () => { await poAccountProfile.security2FASection.click(); await expect(poAccountProfile.email2FASwitch).toBeVisible(); await poAccountProfile.email2FASwitch.click(); - await expect(poHomeChannel.toastSuccess).toBeVisible(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.waitForDisplay(); + await poHomeChannel.toastMessage.dismissToast(); await poAccountProfile.email2FASwitch.click(); - await expect(poHomeChannel.toastSuccess).toBeVisible(); + await poHomeChannel.toastMessage.waitForDisplay(); }); }); diff --git a/apps/meteor/tests/e2e/admin-users-custom-fields.spec.ts b/apps/meteor/tests/e2e/admin-users-custom-fields.spec.ts index b9cec4d555215..3094abfcd40b3 100644 --- a/apps/meteor/tests/e2e/admin-users-custom-fields.spec.ts +++ b/apps/meteor/tests/e2e/admin-users-custom-fields.spec.ts @@ -78,7 +78,7 @@ test.describe('Admin users custom fields', () => { await test.step('should save user custom fields', async () => { await poAdmin.editUser.btnSaveUser.click(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await poAdmin.editUser.close(); }); @@ -115,7 +115,7 @@ test.describe('Admin users custom fields', () => { await test.step('should save and verify partial update', async () => { await poAdmin.editUser.btnSaveUser.click(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await poAdmin.editUser.close(); await poAdmin.getUserRowByUsername(updateTestUser.data.username).click(); 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 35d4395e6f7bc..7703a03cde62a 100644 --- a/apps/meteor/tests/e2e/admin-users-role-management.spec.ts +++ b/apps/meteor/tests/e2e/admin-users-role-management.spec.ts @@ -1,6 +1,5 @@ import { Users } from './fixtures/userStates'; import { AdminUsers } from './page-objects'; -import { ToastBar } from './page-objects/toastBar'; import { test, expect } from './utils/test'; import type { ITestUser } from './utils/user-helpers'; import { createTestUser } from './utils/user-helpers'; @@ -8,7 +7,6 @@ import { createTestUser } from './utils/user-helpers'; let userWithoutAdminAccess: ITestUser; let userWithAdminAccess: ITestUser; let admin: AdminUsers; -let poToastBar: ToastBar; test.describe('Admin > Users Role Management', () => { test.beforeAll('Create test users', async ({ api }) => { @@ -26,7 +24,6 @@ test.describe('Admin > Users Role Management', () => { test.beforeEach('Go to /admin/users', async ({ page }) => { admin = new AdminUsers(page); - poToastBar = new ToastBar(page); await page.goto('/admin/users'); }); @@ -41,8 +38,7 @@ test.describe('Admin > Users Role Management', () => { await test.step('make a user admin', async () => { await admin.dispatchUserAction(userWithoutAdminAccess.data.username, 'Make Admin'); - await expect(poToastBar.alert).toBeVisible(); - await expect(poToastBar.alert).toHaveText('User is now an admin'); + await admin.toastMessage.waitForDisplay({ type: 'success', message: 'User is now an admin' }); }); await test.step('verify user is admin', async () => { @@ -61,8 +57,7 @@ test.describe('Admin > Users Role Management', () => { await test.step('remove admin role', async () => { await admin.dispatchUserAction(userWithAdminAccess.data.username, 'Remove Admin'); - await expect(poToastBar.alert).toBeVisible(); - await expect(poToastBar.alert).toHaveText('User is no longer an admin'); + await admin.toastMessage.waitForDisplay({ type: 'success', message: 'User is no longer an admin' }); }); await test.step('verify user role as admin is removed', async () => { diff --git a/apps/meteor/tests/e2e/channel-management.spec.ts b/apps/meteor/tests/e2e/channel-management.spec.ts index 31bc2ac21c231..696b6fa294c7e 100644 --- a/apps/meteor/tests/e2e/channel-management.spec.ts +++ b/apps/meteor/tests/e2e/channel-management.spec.ts @@ -62,7 +62,7 @@ test.describe.serial('channel-management', () => { await poHomeChannel.tabs.room.inputTopic.fill('hello-topic-edited'); await poHomeChannel.tabs.room.btnSave.click(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await poHomeChannel.roomToolbar.openRoomInfo(); await expect(page.getByRole('heading', { name: 'hello-topic-edited' })).toBeVisible(); await expect(page.getByRole('dialog', { name: 'Channel info' })).toContainText('hello-topic-edited'); @@ -76,7 +76,7 @@ test.describe.serial('channel-management', () => { await poHomeChannel.tabs.room.inputAnnouncement.fill('hello-announcement-edited'); await poHomeChannel.tabs.room.btnSave.click(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await poHomeChannel.roomToolbar.openRoomInfo(); await expect(page.getByRole('dialog', { name: 'Channel info' })).toContainText('hello-announcement-edited'); await expect(poHomeChannel.content.getSystemMessageByText('changed room announcement to: hello-announcement-edited')).toBeVisible(); @@ -89,7 +89,7 @@ test.describe.serial('channel-management', () => { await poHomeChannel.tabs.room.inputDescription.fill('hello-description-edited'); await poHomeChannel.tabs.room.btnSave.click(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await poHomeChannel.roomToolbar.openRoomInfo(); await expect(page.getByRole('dialog', { name: 'Channel info' })).toContainText('hello-description-edited'); await expect(poHomeChannel.content.getSystemMessageByText('changed room description to: hello-description-edited')).toBeVisible(); diff --git a/apps/meteor/tests/e2e/delete-account.spec.ts b/apps/meteor/tests/e2e/delete-account.spec.ts index 320937bfbe59f..a1ff584fa0d63 100644 --- a/apps/meteor/tests/e2e/delete-account.spec.ts +++ b/apps/meteor/tests/e2e/delete-account.spec.ts @@ -1,13 +1,11 @@ import { DEFAULT_USER_CREDENTIALS } from './config/constants'; 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'; test.describe('Delete Own Account', () => { let poAccountProfile: AccountProfile; let poRegistration: Registration; - let poToastBar: ToastBar; let poAuth: Authenticated; let userToDelete: ITestUser; let userWithInvalidPassword: ITestUser; @@ -24,7 +22,6 @@ test.describe('Delete Own Account', () => { test.beforeEach(async ({ page }) => { poAccountProfile = new AccountProfile(page); poRegistration = new Registration(page); - poToastBar = new ToastBar(page); poAuth = new Authenticated(page); await page.goto('/home'); }); @@ -67,8 +64,7 @@ test.describe('Delete Own Account', () => { }); await test.step('verify error message appears', async () => { - await expect(poToastBar.alert).toBeVisible(); - await expect(poToastBar.alert).toHaveText('Invalid password [error-invalid-password]'); + await poAccountProfile.toastMessage.waitForDisplay({ type: 'error', message: 'Invalid password [error-invalid-password]' }); }); await test.step('verify user is still on the profile page', async () => { diff --git a/apps/meteor/tests/e2e/e2e-encryption/e2ee-encrypted-channels.spec.ts b/apps/meteor/tests/e2e/e2e-encryption/e2ee-encrypted-channels.spec.ts index 7720ed0cab9f0..9d7b7ad819540 100644 --- a/apps/meteor/tests/e2e/e2e-encryption/e2ee-encrypted-channels.spec.ts +++ b/apps/meteor/tests/e2e/e2e-encryption/e2ee-encrypted-channels.spec.ts @@ -52,7 +52,7 @@ test.describe('E2EE Encrypted Channels', () => { await poHomeChannel.tabs.btnDisableE2E.click({ force: true }); await expect(page.getByRole('dialog', { name: 'Disable encryption' })).toBeVisible(); await page.getByRole('button', { name: 'Disable encryption' }).click(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await page.waitForTimeout(1000); await poHomeChannel.content.sendMessage('hello world not encrypted'); @@ -65,7 +65,7 @@ test.describe('E2EE Encrypted Channels', () => { await poHomeChannel.tabs.btnEnableE2E.click({ force: true }); await expect(page.getByRole('dialog', { name: 'Enable encryption' })).toBeVisible(); await page.getByRole('button', { name: 'Enable encryption' }).click(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await page.waitForTimeout(1000); await poHomeChannel.content.sendMessage('hello world encrypted again'); @@ -138,9 +138,8 @@ test.describe('E2EE Encrypted Channels', () => { await expect(page).toHaveURL(`/group/${channelName}`); - await expect(poHomeChannel.toastSuccess).toBeVisible(); - - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.waitForDisplay(); + await poHomeChannel.toastMessage.dismissToast(); await poHomeChannel.tabs.kebab.click(); // TODO(@jessicaschelly/@dougfabris): fix this flaky behavior @@ -236,8 +235,8 @@ test.describe('E2EE Encrypted Channels', () => { await poHomeChannel.sidenav.inputChannelName.fill(channelName); await poHomeChannel.sidenav.btnCreate.click(); await expect(page).toHaveURL(`/group/${channelName}`); - await expect(poHomeChannel.toastSuccess).toBeVisible(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.waitForDisplay(); + await poHomeChannel.toastMessage.dismissToast(); // Send Unencrypted Messages await poHomeChannel.content.sendMessage('first unencrypted message'); @@ -291,15 +290,15 @@ test.describe('E2EE Encrypted Channels', () => { await poHomeChannel.content.openLastMessageMenu(); await page.locator('role=menuitem[name="Star"]').click(); - await expect(poHomeChannel.toastSuccess).toBeVisible(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.waitForDisplay(); + await poHomeChannel.toastMessage.dismissToast(); await poHomeChannel.content.openLastMessageMenu(); await page.locator('role=menuitem[name="Pin"]').click(); await page.locator('#modal-root >> button:has-text("Yes, pin message")').click(); - await expect(poHomeChannel.toastSuccess).toBeVisible(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.waitForDisplay(); + await poHomeChannel.toastMessage.dismissToast(); await poHomeChannel.tabs.kebab.click(); await poHomeChannel.tabs.btnPinnedMessagesList.click(); diff --git a/apps/meteor/tests/e2e/e2e-encryption/e2ee-otr.spec.ts b/apps/meteor/tests/e2e/e2e-encryption/e2ee-otr.spec.ts index b2c1e427dc974..0101f190ca27c 100644 --- a/apps/meteor/tests/e2e/e2e-encryption/e2ee-otr.spec.ts +++ b/apps/meteor/tests/e2e/e2e-encryption/e2ee-otr.spec.ts @@ -45,7 +45,7 @@ test.describe('E2EE OTR (Off-The-Record)', () => { await poHomeChannel.tabs.btnDisableE2E.click({ force: true }); await expect(page.getByRole('dialog', { name: 'Disable encryption' })).toBeVisible(); await page.getByRole('button', { name: 'Disable encryption' }).click(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await poHomeChannel.tabs.kebab.click({ force: true }); } await expect(poHomeChannel.tabs.btnEnableE2E).toBeVisible(); @@ -56,7 +56,7 @@ test.describe('E2EE OTR (Off-The-Record)', () => { await expect(poHomeChannel.content.encryptedRoomHeaderIcon).toBeVisible(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await poHomeChannel.tabs.kebab.click({ force: true }); await expect(poHomeChannel.tabs.btnEnableOTR).toBeVisible(); diff --git a/apps/meteor/tests/e2e/enforce-2FA.spec.ts b/apps/meteor/tests/e2e/enforce-2FA.spec.ts index ce2c74c65d54c..41a4f77eac4f9 100644 --- a/apps/meteor/tests/e2e/enforce-2FA.spec.ts +++ b/apps/meteor/tests/e2e/enforce-2FA.spec.ts @@ -59,7 +59,7 @@ test.describe('enforce two factor authentication', () => { await expect(poAccountProfile.email2FASwitch).toBeVisible(); await poAccountProfile.email2FASwitch.click(); - await expect(poHomeChannel.toastSuccess).toBeVisible(); + await poHomeChannel.toastMessage.waitForDisplay(); await expect(poHomeChannel.sidenav.sidebarHomeAction).toBeVisible(); await expect(poAccountProfile.securityHeader).not.toBeVisible(); }); diff --git a/apps/meteor/tests/e2e/federation/page-objects/channel.ts b/apps/meteor/tests/e2e/federation/page-objects/channel.ts index 8d9e7c8f33940..ada910ae1faa8 100644 --- a/apps/meteor/tests/e2e/federation/page-objects/channel.ts +++ b/apps/meteor/tests/e2e/federation/page-objects/channel.ts @@ -3,7 +3,7 @@ import type { Locator, Page } from '@playwright/test'; import { FederationHomeContent } from './fragments/home-content'; import { FederationHomeFlextab } from './fragments/home-flextab'; import { FederationSidenav } from './fragments/home-sidenav'; -import { RoomToolbar } from '../../page-objects/fragments/toolbar'; +import { RoomToolbar, ToastMessages } from '../../page-objects/fragments'; export class FederationChannel { private readonly page: Page; @@ -16,20 +16,15 @@ export class FederationChannel { readonly roomToolbar: RoomToolbar; + readonly toastMessage: ToastMessages; + constructor(page: Page) { this.page = page; this.content = new FederationHomeContent(page); this.sidenav = new FederationSidenav(page); this.tabs = new FederationHomeFlextab(page); this.roomToolbar = new RoomToolbar(page); - } - - get toastSuccess(): Locator { - return this.page.locator('.rcx-toastbar.rcx-toastbar--success'); - } - - get toastError(): Locator { - return this.page.locator('.rcx-toastbar.rcx-toastbar--error'); + this.toastMessage = new ToastMessages(page); } get btnContextualbarClose(): Locator { diff --git a/apps/meteor/tests/e2e/federation/tests/ce-version/ce.spec.ts b/apps/meteor/tests/e2e/federation/tests/ce-version/ce.spec.ts index 636ef8ab9c4a0..d5d88262cac13 100644 --- a/apps/meteor/tests/e2e/federation/tests/ce-version/ce.spec.ts +++ b/apps/meteor/tests/e2e/federation/tests/ce-version/ce.spec.ts @@ -51,7 +51,7 @@ test.describe.parallel('Federation - CE version', () => { test('expect to not be able to create DMs from UI inviting external users (an user who does not exists on the server yet)', async () => { await poFederationChannelServer2.createDirectMessagesUsingModal([fullUsernameFromServer1]); - await expect(poFederationChannelServer2.toastError).toBeVisible(); + await poFederationChannelServer2.toastMessage.waitForDisplay({ type: 'error' }); }); test('expect to not be able to create DMs from UI inviting external users (an user who already exists in the server)', async ({ @@ -66,7 +66,7 @@ test.describe.parallel('Federation - CE version', () => { server: constants.RC_SERVER_1, }); await poFederationChannelServer2.createDirectMessagesUsingModal([fullUsernameFromServer1]); - await expect(poFederationChannelServer2.toastError).toBeVisible(); + await poFederationChannelServer2.toastMessage.waitForDisplay({ type: 'error' }); }); test('expect to not be able to invite federated users to non-federated rooms (using modal)', async () => { diff --git a/apps/meteor/tests/e2e/federation/tests/channel/private.spec.ts b/apps/meteor/tests/e2e/federation/tests/channel/private.spec.ts index f7a4045391c8c..881eb4fe7e409 100644 --- a/apps/meteor/tests/e2e/federation/tests/channel/private.spec.ts +++ b/apps/meteor/tests/e2e/federation/tests/channel/private.spec.ts @@ -435,7 +435,7 @@ test.describe.parallel('Federation - Group Creation', () => { await poFederationChannelServer1.roomToolbar.openMembersTab(); await poFederationChannelServer1.tabs.members.showAllUsers(); await poFederationChannelServer1.tabs.members.addMultipleUsers([fullUsernameFromServer2]); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await poFederationChannelServer2.sidenav.openChat(groupName); await poFederationChannelServer2.roomToolbar.openMembersTab(); @@ -487,7 +487,7 @@ test.describe.parallel('Federation - Group Creation', () => { await poFederationChannelServer1.roomToolbar.openMembersTab(); await poFederationChannelServer1.tabs.members.showAllUsers(); await poFederationChannelServer1.tabs.members.addMultipleUsers([userFromServer2UsernameOnly]); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await poFederationChannelServer2.sidenav.openChat(groupName); await poFederationChannelServer2.roomToolbar.openMembersTab(); @@ -549,7 +549,7 @@ test.describe.parallel('Federation - Group Creation', () => { await poFederationChannelServer1.roomToolbar.openMembersTab(); await poFederationChannelServer1.tabs.members.showAllUsers(); await poFederationChannelServer1.tabs.members.addMultipleUsers([fullUsernameFromServer2, userFromServer1UsernameOnly]); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await poFederationChannelServer2.sidenav.openChat(createdGroup); await poFederationChannelServer2.roomToolbar.openMembersTab(); @@ -641,7 +641,7 @@ test.describe.parallel('Federation - Group Creation', () => { await poFederationChannelServer1.roomToolbar.openMembersTab(); await poFederationChannelServer1.tabs.members.showAllUsers(); await poFederationChannelServer1.tabs.members.addMultipleUsers([userFromServer1UsernameOnly, userFromServer2UsernameOnly]); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await poFederationChannelServer2.sidenav.openChat(createdGroup); await poFederationChannelServer2.roomToolbar.openMembersTab(); @@ -704,7 +704,7 @@ test.describe.parallel('Federation - Group Creation', () => { await poFederationChannelServer1.tabs.members.showAllUsers(); await poFederationChannelServer1.tabs.members.addMultipleUsers([userFromServer1UsernameOnly]); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await expect(poFederationChannelServer1.tabs.members.getUserInList(userFromServer1UsernameOnly)).toBeVisible(); await expect(poFederationChannelServer1.tabs.members.getUserInList(constants.RC_SERVER_1.username)).toBeVisible(); diff --git a/apps/meteor/tests/e2e/federation/tests/channel/public.spec.ts b/apps/meteor/tests/e2e/federation/tests/channel/public.spec.ts index 3ac64e22209b5..22178ad2a26f3 100644 --- a/apps/meteor/tests/e2e/federation/tests/channel/public.spec.ts +++ b/apps/meteor/tests/e2e/federation/tests/channel/public.spec.ts @@ -438,7 +438,7 @@ test.describe.parallel('Federation - Channel Creation', () => { await poFederationChannelServer1.roomToolbar.openMembersTab(); await poFederationChannelServer1.tabs.members.showAllUsers(); await poFederationChannelServer1.tabs.members.addMultipleUsers([fullUsernameFromServer2]); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await poFederationChannelServer2.sidenav.openChat(channelName); await poFederationChannelServer2.roomToolbar.openMembersTab(); @@ -490,7 +490,7 @@ test.describe.parallel('Federation - Channel Creation', () => { await poFederationChannelServer1.roomToolbar.openMembersTab(); await poFederationChannelServer1.tabs.members.showAllUsers(); await poFederationChannelServer1.tabs.members.addMultipleUsers([userFromServer2UsernameOnly]); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await poFederationChannelServer2.sidenav.openChat(channelName); await poFederationChannelServer2.roomToolbar.openMembersTab(); @@ -552,7 +552,7 @@ test.describe.parallel('Federation - Channel Creation', () => { await poFederationChannelServer1.roomToolbar.openMembersTab(); await poFederationChannelServer1.tabs.members.showAllUsers(); await poFederationChannelServer1.tabs.members.addMultipleUsers([fullUsernameFromServer2, userFromServer1UsernameOnly]); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await poFederationChannelServer2.sidenav.openChat(createdChannel); await poFederationChannelServer2.roomToolbar.openMembersTab(); @@ -644,7 +644,7 @@ test.describe.parallel('Federation - Channel Creation', () => { await poFederationChannelServer1.roomToolbar.openMembersTab(); await poFederationChannelServer1.tabs.members.showAllUsers(); await poFederationChannelServer1.tabs.members.addMultipleUsers([userFromServer1UsernameOnly, userFromServer2UsernameOnly]); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await poFederationChannelServer2.sidenav.openChat(createdChannel); await poFederationChannelServer2.roomToolbar.openMembersTab(); @@ -707,7 +707,7 @@ test.describe.parallel('Federation - Channel Creation', () => { await poFederationChannelServer1.tabs.members.showAllUsers(); await poFederationChannelServer1.tabs.members.addMultipleUsers([userFromServer1UsernameOnly]); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await expect(poFederationChannelServer1.tabs.members.getUserInList(userFromServer1UsernameOnly)).toBeVisible(); await expect(poFederationChannelServer1.tabs.members.getUserInList(constants.RC_SERVER_1.username)).toBeVisible(); diff --git a/apps/meteor/tests/e2e/federation/tests/messaging/dm.spec.ts b/apps/meteor/tests/e2e/federation/tests/messaging/dm.spec.ts index e59550537013c..34fc799b353b3 100644 --- a/apps/meteor/tests/e2e/federation/tests/messaging/dm.spec.ts +++ b/apps/meteor/tests/e2e/federation/tests/messaging/dm.spec.ts @@ -1006,7 +1006,7 @@ test.describe.parallel('Federation - DM Messaging', () => { await expect(poFederationChannelServerUser2.content.lastUserMessageBody).toHaveText('message from Server A'); await poFederationChannelServer1.content.deleteLastMessage(); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await expect(poFederationChannelServer1.content.lastUserMessage).not.toBeVisible(); await expect(poFederationChannelServerUser2.content.lastUserMessage).not.toBeVisible(); @@ -1048,7 +1048,7 @@ test.describe.parallel('Federation - DM Messaging', () => { await page.waitForTimeout(2000); await poFederationChannelServerUser2.content.sendMessageUsingEnter('message from Server B'); await poFederationChannelServerUser2.content.deleteLastMessage(); - await expect(poFederationChannelServerUser2.toastSuccess).toBeVisible(); + await poFederationChannelServerUser2.toastMessage.waitForDisplay(); await expect(poFederationChannelServer1.content.lastUserMessage).not.toBeVisible(); await expect(poFederationChannelServerUser2.content.lastUserMessage).not.toBeVisible(); @@ -1089,9 +1089,7 @@ test.describe.parallel('Federation - DM Messaging', () => { await expect(poFederationChannelServerUser2.content.lastUserMessageBody).toHaveText('message from Server A'); await poFederationChannelServer1.content.starLastMessage(); - await expect( - poFederationChannelServer1.toastSuccess.locator('div.rcx-toastbar-content', { hasText: 'Message has been starred' }), - ).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay({ type: 'success', message: 'Message has been starred' }); await expect(poFederationChannelServer1.content.lastUserMessage.locator('.rcx-icon--name-star-filled')).toBeVisible(); await page2.close(); @@ -1131,9 +1129,7 @@ test.describe.parallel('Federation - DM Messaging', () => { await expect(poFederationChannelServerUser2.content.lastUserMessageBody).toHaveText('message from Server A'); await poFederationChannelServerUser2.content.starLastMessage(); - await expect( - poFederationChannelServerUser2.toastSuccess.locator('div.rcx-toastbar-content', { hasText: 'Message has been starred' }), - ).toBeVisible(); + await poFederationChannelServerUser2.toastMessage.waitForDisplay({ type: 'success', message: 'Message has been starred' }); await expect(poFederationChannelServerUser2.content.lastUserMessage.locator('.rcx-icon--name-star-filled')).toBeVisible(); await page2.close(); diff --git a/apps/meteor/tests/e2e/federation/tests/messaging/private.spec.ts b/apps/meteor/tests/e2e/federation/tests/messaging/private.spec.ts index ea83730e8d98d..d0624b3978baa 100644 --- a/apps/meteor/tests/e2e/federation/tests/messaging/private.spec.ts +++ b/apps/meteor/tests/e2e/federation/tests/messaging/private.spec.ts @@ -813,7 +813,7 @@ test.describe.parallel('Federation - Group Messaging', () => { await expect(poFederationChannelServer2.content.lastUserMessageBody).toHaveText('message from Server A'); await poFederationChannelServer1.content.deleteLastMessage(); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await expect(poFederationChannelServer1.content.lastUserMessage).not.toBeVisible(); await expect(poFederationChannelServer2.content.lastUserMessage).not.toBeVisible(); @@ -835,7 +835,7 @@ test.describe.parallel('Federation - Group Messaging', () => { await expect(poFederationChannelServer2.content.lastUserMessageBody).toHaveText('message from Server A'); await poFederationChannelServer2.content.deleteLastMessage(); - await expect(poFederationChannelServer2.toastSuccess).toBeVisible(); + await poFederationChannelServer2.toastMessage.waitForDisplay(); await expect(poFederationChannelServer1.content.lastUserMessage).not.toBeVisible(); await expect(poFederationChannelServer2.content.lastUserMessage).not.toBeVisible(); @@ -905,9 +905,7 @@ test.describe.parallel('Federation - Group Messaging', () => { await expect(poFederationChannelServer2.content.lastUserMessageBody).toHaveText('message from Server A'); await poFederationChannelServer1.content.starLastMessage(); - await expect( - poFederationChannelServer1.toastSuccess.locator('div.rcx-toastbar-content', { hasText: 'Message has been starred' }), - ).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay({ type: 'success', message: 'Message has been starred' }); await expect(poFederationChannelServer1.content.lastUserMessage.locator('.rcx-icon--name-star-filled')).toBeVisible(); }); @@ -928,9 +926,7 @@ test.describe.parallel('Federation - Group Messaging', () => { await expect(poFederationChannelServer2.content.lastUserMessageBody).toHaveText('message from Server A'); await poFederationChannelServer2.content.starLastMessage(); - await expect( - poFederationChannelServer2.toastSuccess.locator('div.rcx-toastbar-content', { hasText: 'Message has been starred' }), - ).toBeVisible(); + await poFederationChannelServer2.toastMessage.waitForDisplay({ type: 'success', message: 'Message has been starred' }); await expect(poFederationChannelServer2.content.lastUserMessage.locator('.rcx-icon--name-star-filled')).toBeVisible(); }); diff --git a/apps/meteor/tests/e2e/federation/tests/messaging/public.spec.ts b/apps/meteor/tests/e2e/federation/tests/messaging/public.spec.ts index 838d7248b3130..fedde0e55b8c8 100644 --- a/apps/meteor/tests/e2e/federation/tests/messaging/public.spec.ts +++ b/apps/meteor/tests/e2e/federation/tests/messaging/public.spec.ts @@ -807,7 +807,7 @@ test.describe.parallel('Federation - Channel Messaging', () => { await expect(poFederationChannelServer2.content.lastUserMessageBody).toHaveText('message from Server A'); await poFederationChannelServer1.content.deleteLastMessage(); - await expect(poFederationChannelServer1.toastSuccess).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay(); await expect(poFederationChannelServer1.content.lastUserMessage).not.toBeVisible(); await expect(poFederationChannelServer2.content.lastUserMessage).not.toBeVisible(); @@ -829,7 +829,7 @@ test.describe.parallel('Federation - Channel Messaging', () => { await expect(poFederationChannelServer2.content.lastUserMessageBody).toHaveText('message from Server A'); await poFederationChannelServer2.content.deleteLastMessage(); - await expect(poFederationChannelServer2.toastSuccess).toBeVisible(); + await poFederationChannelServer2.toastMessage.waitForDisplay(); await expect(poFederationChannelServer1.content.lastUserMessage).not.toBeVisible(); await expect(poFederationChannelServer2.content.lastUserMessage).not.toBeVisible(); @@ -899,9 +899,7 @@ test.describe.parallel('Federation - Channel Messaging', () => { await expect(poFederationChannelServer2.content.lastUserMessageBody).toHaveText('message from Server A'); await poFederationChannelServer1.content.starLastMessage(); - await expect( - poFederationChannelServer1.toastSuccess.locator('div.rcx-toastbar-content', { hasText: 'Message has been starred' }), - ).toBeVisible(); + await poFederationChannelServer1.toastMessage.waitForDisplay({ type: 'success', message: 'Message has been starred' }); await expect(poFederationChannelServer1.content.lastUserMessage.locator('.rcx-icon--name-star-filled')).toBeVisible(); }); @@ -922,9 +920,7 @@ test.describe.parallel('Federation - Channel Messaging', () => { await expect(poFederationChannelServer2.content.lastUserMessageBody).toHaveText('message from Server A'); await poFederationChannelServer2.content.starLastMessage(); - await expect( - poFederationChannelServer2.toastSuccess.locator('div.rcx-toastbar-content', { hasText: 'Message has been starred' }), - ).toBeVisible(); + await poFederationChannelServer2.toastMessage.waitForDisplay({ type: 'success', message: 'Message has been starred' }); await expect(poFederationChannelServer2.content.lastUserMessage.locator('.rcx-icon--name-star-filled')).toBeVisible(); }); diff --git a/apps/meteor/tests/e2e/message-actions.spec.ts b/apps/meteor/tests/e2e/message-actions.spec.ts index ae29a96d23dd3..6ae22b52dedb8 100644 --- a/apps/meteor/tests/e2e/message-actions.spec.ts +++ b/apps/meteor/tests/e2e/message-actions.spec.ts @@ -160,7 +160,7 @@ test.describe.serial('message-actions', () => { await poHomeChannel.content.sendMessage('Message to star'); await poHomeChannel.content.openLastMessageMenu(); await page.locator('role=menuitem[name="Star"]').click(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await flextab.kebab.click(); await page.locator('[data-key="starred-messages"]').click(); await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('Message to star'); diff --git a/apps/meteor/tests/e2e/messaging.spec.ts b/apps/meteor/tests/e2e/messaging.spec.ts index 3910d48c86f37..03044a519f549 100644 --- a/apps/meteor/tests/e2e/messaging.spec.ts +++ b/apps/meteor/tests/e2e/messaging.spec.ts @@ -3,7 +3,7 @@ import type { Page } from '@playwright/test'; import { createAuxContext } from './fixtures/createAuxContext'; import { Users } from './fixtures/userStates'; -import { HomeChannel, ToastBar } from './page-objects'; +import { HomeChannel } from './page-objects'; import { createTargetChannel, deleteChannel } from './utils'; import { expect, test } from './utils/test'; @@ -11,7 +11,6 @@ test.use({ storageState: Users.user1.state }); test.describe('Messaging', () => { let poHomeChannel: HomeChannel; - let poToastBar: ToastBar; let targetChannel: string; test.beforeAll(async ({ api }) => { @@ -20,8 +19,6 @@ test.describe('Messaging', () => { test.beforeEach(async ({ page }) => { poHomeChannel = new HomeChannel(page); - poToastBar = new ToastBar(page); - await page.goto('/home'); }); @@ -195,9 +192,7 @@ test.describe('Messaging', () => { } await editPromise; - const toastError = await poToastBar.waitForError(); - - expect(toastError).toBe(true); + await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('edited msg2 e'); }); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments-ce.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments-ce.spec.ts index 5f5db5c691665..aab1b27ff1d0d 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments-ce.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments-ce.spec.ts @@ -32,7 +32,7 @@ test.describe.serial('OC - Manage Departments (CE)', () => { await poOmnichannelDepartments.inputName.fill(departmentName); await poOmnichannelDepartments.inputEmail.fill(faker.internet.email()); await poOmnichannelDepartments.btnSave.click(); - await poOmnichannelDepartments.btnCloseToastSuccess.click(); + await poOmnichannelDepartments.toastMessage.dismissToast(); await poOmnichannelDepartments.inputSearch.fill(departmentName); await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts index f6c156847c2f5..280a436b1a43d 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts @@ -183,7 +183,7 @@ test.describe('OC - Manage Departments', () => { await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); await poOmnichannelDepartments.firstRowInTableMenu.click(); await poOmnichannelDepartments.menuArchiveOption.click(); - await expect(poOmnichannelDepartments.toastSuccess).toBeVisible(); + await poOmnichannelDepartments.toastMessage.waitForDisplay(); await poOmnichannelDepartments.archivedDepartmentsTab.click(); await poOmnichannelDepartments.search(department.name); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities.spec.ts index bd3ccfff84464..5aa5a76596d3a 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities.spec.ts @@ -77,7 +77,7 @@ test.describe.serial('Omnichannel Priorities', () => { await poOmnichannelPriorities.managePriority.btnSave.click(); await Promise.all([ - poOmnichannelPriorities.btnCloseToastSuccess.click(), + poOmnichannelPriorities.toastMessage.dismissToast(), expect(poOmnichannelPriorities.managePriority.inputName).not.toBeVisible(), expect(poOmnichannelPriorities.findPriority(PRIORITY_NAME)).toBeVisible(), expect(poOmnichannelPriorities.findPriority('Highest')).not.toBeVisible(), @@ -97,7 +97,7 @@ test.describe.serial('Omnichannel Priorities', () => { await expect(poOmnichannelPriorities.managePriority.btnSave).toBeEnabled(); await poOmnichannelPriorities.managePriority.btnSave.click(); - await poOmnichannelPriorities.btnCloseToastSuccess.click(); + await poOmnichannelPriorities.toastMessage.dismissToast(); await expect(poOmnichannelPriorities.findPriority('Highest')).toBeVisible(); await expect(poOmnichannelPriorities.btnReset).not.toBeEnabled(); }); @@ -111,7 +111,7 @@ test.describe.serial('Omnichannel Priorities', () => { expect(poOmnichannelPriorities.managePriority.btnSave).toBeEnabled(), ]); await poOmnichannelPriorities.managePriority.btnSave.click(); - await poOmnichannelPriorities.btnCloseToastSuccess.click(); + await poOmnichannelPriorities.toastMessage.dismissToast(); await Promise.all([ expect(poOmnichannelPriorities.managePriority.inputName).not.toBeVisible(), expect(poOmnichannelPriorities.findPriority(PRIORITY_NAME)).toBeVisible(), @@ -123,7 +123,7 @@ test.describe.serial('Omnichannel Priorities', () => { await poOmnichannelPriorities.btnResetConfirm.click(); await Promise.all([ - expect(poOmnichannelPriorities.toastSuccess).toBeVisible(), + await poOmnichannelPriorities.toastMessage.waitForDisplay(), expect(poOmnichannelPriorities.btnReset).not.toBeEnabled(), expect(poOmnichannelPriorities.findPriority(PRIORITY_NAME)).not.toBeVisible(), expect(poOmnichannelPriorities.findPriority('Highest')).toBeVisible(), diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-send-pdf-transcript.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-send-pdf-transcript.spec.ts index afe38b4b5b78c..b20aaf09de520 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-send-pdf-transcript.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-send-pdf-transcript.spec.ts @@ -76,7 +76,7 @@ test.describe('omnichannel- export chat transcript as PDF', () => { await agent.poHomeChannel.content.btnSendTranscript.click(); await expect(agent.poHomeChannel.content.btnSendTranscriptAsPDF).toHaveAttribute('aria-disabled', 'false'); await agent.poHomeChannel.content.btnSendTranscriptAsPDF.click(); - await expect(agent.poHomeChannel.toastSuccess).toBeVisible(); + await agent.poHomeChannel.toastMessage.waitForDisplay(); }); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-send-transcript.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-send-transcript.spec.ts index bc19259bfe1f3..4556ac71dc056 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-send-transcript.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-send-transcript.spec.ts @@ -49,7 +49,7 @@ test.describe('omnichannel-transcript', () => { await agent.poHomeChannel.content.btnSendTranscript.click(); await agent.poHomeChannel.content.btnSendTranscriptToEmail.click(); await agent.poHomeChannel.content.btnModalConfirm.click(); - await expect(agent.poHomeChannel.toastSuccess).toBeVisible(); + await agent.poHomeChannel.toastMessage.waitForDisplay(); }); await test.step('Expect to be not able send transcript as PDF', async () => { diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts index b67c979134925..0371abd70d64e 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts @@ -88,7 +88,7 @@ test.describe('OC - Chat transfers [Agent role]', () => { await agentA.poHomeOmnichannel.content.forwardChatModal.selectUser('user2'); await agentA.poHomeOmnichannel.content.forwardChatModal.inputComment.type('any_comment'); await agentA.poHomeOmnichannel.content.forwardChatModal.btnForward.click(); - await expect(agentA.poHomeOmnichannel.toastSuccess).toBeVisible(); + await agentA.poHomeOmnichannel.toastMessage.waitForDisplay(); }); await test.step('expect to have 1 omnichannel assigned to agent 2', async () => { diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts index 8add05c7c1e68..67266c142a16c 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts @@ -74,14 +74,14 @@ test.describe.serial('OC - Livechat Triggers', () => { triggerMessage = 'This is a trigger message time on site'; await test.step('expect create new trigger', async () => { await agent.poHomeOmnichannel.triggers.createTrigger(triggersName, triggerMessage, 'time-on-site', 5); - await agent.poHomeOmnichannel.triggers.btnCloseToastMessage.click(); + await agent.poHomeOmnichannel.triggers.toastMessage.dismissToast(); }); triggerMessage = 'This is a trigger message chat opened by visitor'; await test.step('expect update trigger', async () => { await agent.poHomeOmnichannel.triggers.firstRowInTriggerTable(triggersName).click(); await agent.poHomeOmnichannel.triggers.updateTrigger(triggersName, triggerMessage); - await agent.poHomeOmnichannel.triggers.btnCloseToastMessage.click(); + await agent.poHomeOmnichannel.triggers.toastMessage.dismissToast(); }); }); @@ -122,7 +122,7 @@ test.describe.serial('OC - Livechat Triggers', () => { await agent.poHomeOmnichannel.triggers.firstRowInTriggerTable(`edited-${triggersName}`).click(); await agent.poHomeOmnichannel.triggers.fillTriggerForm({ condition: 'after-guest-registration', triggerMessage }); await agent.poHomeOmnichannel.triggers.btnSave.click(); - await agent.poHomeOmnichannel.triggers.btnCloseToastMessage.click(); + await agent.poHomeOmnichannel.triggers.toastMessage.dismissToast(); await agent.page.waitForTimeout(500); }); diff --git a/apps/meteor/tests/e2e/page-objects/account-profile.ts b/apps/meteor/tests/e2e/page-objects/account-profile.ts index 2c64961943f7d..e9e63fd0af2f2 100644 --- a/apps/meteor/tests/e2e/page-objects/account-profile.ts +++ b/apps/meteor/tests/e2e/page-objects/account-profile.ts @@ -1,14 +1,13 @@ import type { Locator, Page } from '@playwright/test'; +import { Account } from './account'; import { AccountSidenav } from './fragments/account-sidenav'; -export class AccountProfile { - private readonly page: Page; - +export class AccountProfile extends Account { readonly sidenav: AccountSidenav; constructor(page: Page) { - this.page = page; + super(page); this.sidenav = new AccountSidenav(page); } diff --git a/apps/meteor/tests/e2e/page-objects/account.ts b/apps/meteor/tests/e2e/page-objects/account.ts new file mode 100644 index 0000000000000..2b562538a1399 --- /dev/null +++ b/apps/meteor/tests/e2e/page-objects/account.ts @@ -0,0 +1,11 @@ +import type { Page } from '@playwright/test'; + +import { ToastMessages } from './fragments'; + +export abstract class Account { + readonly toastMessage: ToastMessages; + + constructor(protected page: Page) { + this.toastMessage = new ToastMessages(page); + } +} diff --git a/apps/meteor/tests/e2e/page-objects/admin.ts b/apps/meteor/tests/e2e/page-objects/admin.ts index b1457d60b9e70..f96ff8f4d8fe7 100644 --- a/apps/meteor/tests/e2e/page-objects/admin.ts +++ b/apps/meteor/tests/e2e/page-objects/admin.ts @@ -1,6 +1,6 @@ import type { Locator, Page } from '@playwright/test'; -import { AdminSidebar } from './fragments'; +import { AdminSidebar, ToastMessages } from './fragments'; import { ConfirmDeleteModal } from './fragments/modal'; export enum AdminSectionsHref { @@ -29,9 +29,12 @@ export abstract class Admin { readonly deleteModal: ConfirmDeleteModal; + readonly toastMessage: ToastMessages; + constructor(protected page: Page) { this.sidebar = new AdminSidebar(page); this.deleteModal = new ConfirmDeleteModal(page.getByRole('dialog')); + this.toastMessage = new ToastMessages(page); } get btnAdd(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/fragments/index.ts b/apps/meteor/tests/e2e/page-objects/fragments/index.ts index 66e32ce94687e..a46cbe188f3bb 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/index.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/index.ts @@ -13,3 +13,4 @@ export * from './report-message-modal'; export * from './toast-messages'; export * from './export-messages-tab'; export * from './menu'; +export * from './toolbar'; 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 5623adbe08225..3577333016c42 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/toast-messages.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/toast-messages.ts @@ -10,20 +10,18 @@ export class ToastMessages { error: this.page.locator('.rcx-toastbar--error'), }; - async dismissToast(type: 'success') { + async dismissToast(type: 'success' | 'error' = '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].locator('[role="alert"]', { + hasText: message, + }), + ).toBeVisible(); } return expect(this.toastByType[type]).toBeVisible(); diff --git a/apps/meteor/tests/e2e/page-objects/home-channel.ts b/apps/meteor/tests/e2e/page-objects/home-channel.ts index 010c6752a9567..405990120eaaf 100644 --- a/apps/meteor/tests/e2e/page-objects/home-channel.ts +++ b/apps/meteor/tests/e2e/page-objects/home-channel.ts @@ -1,6 +1,6 @@ import type { Locator, Page } from '@playwright/test'; -import { HomeContent, HomeSidenav, HomeFlextab, Navbar, Sidepanel, RoomSidebar } from './fragments'; +import { HomeContent, HomeSidenav, HomeFlextab, Navbar, Sidepanel, RoomSidebar, ToastMessages } from './fragments'; import { RoomToolbar } from './fragments/toolbar'; export class HomeChannel { @@ -20,6 +20,8 @@ export class HomeChannel { readonly roomToolbar: RoomToolbar; + readonly toastMessage: ToastMessages; + constructor(page: Page) { this.page = page; this.content = new HomeContent(page); @@ -29,26 +31,17 @@ export class HomeChannel { this.navbar = new Navbar(page); this.tabs = new HomeFlextab(page); this.roomToolbar = new RoomToolbar(page); + this.toastMessage = new ToastMessages(page); } goto() { return this.page.goto('/home'); } - get toastSuccess(): Locator { - return this.page.locator('.rcx-toastbar.rcx-toastbar--success'); - } - get btnContextualbarClose(): Locator { return this.page.locator('[data-qa="ContextualbarActionClose"]'); } - async dismissToast() { - // this is a workaround for when the toast is blocking the click of the button - await this.toastSuccess.locator('button >> i.rcx-icon--name-cross.rcx-icon').click(); - await this.page.mouse.move(0, 0); - } - get composer(): Locator { return this.page.locator('textarea[name="msg"]'); } diff --git a/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts b/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts index 2d642cf3bc927..3b2f261c13ced 100644 --- a/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts +++ b/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts @@ -1,6 +1,6 @@ import type { Locator, Page } from '@playwright/test'; -import { HomeOmnichannelContent, HomeSidenav, HomeFlextab, OmnichannelSidenav } from './fragments'; +import { HomeOmnichannelContent, HomeSidenav, HomeFlextab, OmnichannelSidenav, ToastMessages } from './fragments'; import { OmnichannelRoomToolbar, OmnichannelQuickActionsRoomToolbar } from './fragments/toolbar'; import { OmnichannelAgents } from './omnichannel-agents'; import { OmnichannelCannedResponses } from './omnichannel-canned-responses'; @@ -45,6 +45,8 @@ export class HomeOmnichannel { readonly quickActionsRoomToolbar: OmnichannelQuickActionsRoomToolbar; + readonly toastMessage: ToastMessages; + constructor(page: Page) { this.page = page; this.content = new HomeOmnichannelContent(page); @@ -62,10 +64,7 @@ export class HomeOmnichannel { this.roomInfo = new OmnichannelRoomInfo(page); this.roomToolbar = new OmnichannelRoomToolbar(page); this.quickActionsRoomToolbar = new OmnichannelQuickActionsRoomToolbar(page); - } - - get toastSuccess(): Locator { - return this.page.locator('.rcx-toastbar.rcx-toastbar--success'); + this.toastMessage = new ToastMessages(page); } get btnContactInfo(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/index.ts b/apps/meteor/tests/e2e/page-objects/index.ts index 2c1472d182968..273c37130b2d8 100644 --- a/apps/meteor/tests/e2e/page-objects/index.ts +++ b/apps/meteor/tests/e2e/page-objects/index.ts @@ -28,4 +28,3 @@ export * from './omnichannel-settings'; export * from './omnichannel-business-hours'; export * from './omnichannel-tags'; export * from './marketplace'; -export * from './toastBar'; diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts index 980a3ec93c357..0cf92012387eb 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts @@ -1,15 +1,19 @@ import type { Page, Locator } from '@playwright/test'; -import { OmnichannelSidenav } from './fragments'; +import { OmnichannelSidenav, ToastMessages } from './fragments'; export class OmnichannelDepartments { private readonly page: Page; readonly sidenav: OmnichannelSidenav; + // TODO: This will be inherited from a BasePage Object + readonly toastMessage: ToastMessages; + constructor(page: Page) { this.page = page; this.sidenav = new OmnichannelSidenav(page); + this.toastMessage = new ToastMessages(page); } get inputSearch() { @@ -125,14 +129,6 @@ export class OmnichannelDepartments { return this.page.locator('[data-qa="modal-close"]'); } - get toastSuccess(): Locator { - return this.page.locator('.rcx-toastbar.rcx-toastbar--success'); - } - - get btnCloseToastSuccess(): Locator { - return this.toastSuccess.locator('button'); - } - get inputUnit(): Locator { // TODO: Improve PaginatedSelectFiltered to allow for more accessible locators return this.page.locator('[data-qa="autocomplete-unit"] input'); diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-priorities.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-priorities.ts index 8aa53abde77ad..ec75c336adff7 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-priorities.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-priorities.ts @@ -1,6 +1,6 @@ import type { Locator, Page } from '@playwright/test'; -import { OmnichannelSidenav } from './fragments'; +import { OmnichannelSidenav, ToastMessages } from './fragments'; class OmnichannelManagePriority { private readonly page: Page; @@ -33,14 +33,14 @@ export class OmnichannelPriorities { readonly sidenav: OmnichannelSidenav; + // TODO: This will be inherited from a BasePage Object + readonly toastMessage: ToastMessages; + constructor(page: Page) { this.page = page; this.managePriority = new OmnichannelManagePriority(page); this.sidenav = new OmnichannelSidenav(page); - } - - get toastSuccess(): Locator { - return this.page.locator('.rcx-toastbar.rcx-toastbar--success'); + this.toastMessage = new ToastMessages(page); } get btnReset() { @@ -51,10 +51,6 @@ export class OmnichannelPriorities { return this.page.locator('.rcx-modal').locator('role=button[name="Reset"]'); } - get btnCloseToastSuccess(): Locator { - return this.toastSuccess.locator('button'); - } - findPriority(name: string) { return this.page.locator('tr', { has: this.page.locator(`td >> text="${name}"`) }); } diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts index 870b458e1fc51..273343f731d3b 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts @@ -1,15 +1,19 @@ import type { Locator, Page } from '@playwright/test'; -import { OmnichannelSidenav } from './fragments'; +import { OmnichannelSidenav, ToastMessages } from './fragments'; export class OmnichannelTriggers { private readonly page: Page; readonly sidenav: OmnichannelSidenav; + // TODO: This will be inherited from a BasePage Object + readonly toastMessage: ToastMessages; + constructor(page: Page) { this.page = page; this.sidenav = new OmnichannelSidenav(page); + this.toastMessage = new ToastMessages(page); } headingButtonNew(name: string) { @@ -32,14 +36,6 @@ export class OmnichannelTriggers { return this.page.locator(`text="${triggersName1}"`); } - get toastMessage(): Locator { - return this.page.locator('.rcx-toastbar.rcx-toastbar--success >> nth=0'); - } - - get btnCloseToastMessage(): Locator { - return this.toastMessage.locator('role=button'); - } - get btnDeletefirstRowInTable() { return this.page.locator('table tr:first-child td:last-child button'); } diff --git a/apps/meteor/tests/e2e/page-objects/toastBar.ts b/apps/meteor/tests/e2e/page-objects/toastBar.ts deleted file mode 100644 index 44d96f777c8e5..0000000000000 --- a/apps/meteor/tests/e2e/page-objects/toastBar.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { Locator, Page } from '@playwright/test'; - -export class ToastBar { - private readonly page: Page; - - constructor(page: Page) { - this.page = page; - } - - get content(): Locator { - return this.page.locator('.rcx-toastbar'); - } - - get alert(): Locator { - return this.content.getByRole('alert'); - } - - get error(): Locator { - return this.page.locator('.rcx-toastbar.rcx-toastbar--error'); - } - - get dismiss(): Locator { - return this.content.getByRole('button', { name: 'Dismiss alert', exact: true }); - } - - async waitForError(): Promise { - try { - await this.error.waitFor({ timeout: 1000 }); - - return false; - } catch (error) { - return true; - } - } -} diff --git a/apps/meteor/tests/e2e/prune-messages.spec.ts b/apps/meteor/tests/e2e/prune-messages.spec.ts index 509b0ef34177f..d56856bfff51c 100644 --- a/apps/meteor/tests/e2e/prune-messages.spec.ts +++ b/apps/meteor/tests/e2e/prune-messages.spec.ts @@ -3,7 +3,6 @@ import { Random } from '@rocket.chat/random'; import { Users } from './fixtures/userStates'; import { HomeChannel } from './page-objects/home-channel'; -import { ToastBar } from './page-objects/toastBar'; import { sendTargetChannelMessage } from './utils'; import { test, expect } from './utils/test'; @@ -11,7 +10,6 @@ test.use({ storageState: Users.admin.state }); test.describe('prune-messages', () => { let poHomeChannel: HomeChannel; - let poToastBar: ToastBar; let targetChannel: IRoom; test.beforeAll('create target channel', async ({ api }) => { @@ -23,9 +21,7 @@ test.describe('prune-messages', () => { }); test.beforeEach(async ({ page }) => { - poToastBar = new ToastBar(page); poHomeChannel = new HomeChannel(page); - await page.goto(`/channel/${targetChannel.fname}/clean-history`); }); @@ -42,8 +38,8 @@ test.describe('prune-messages', () => { const { content, tabs: { pruneMessages }, + toastMessage, } = poHomeChannel; - const { alert, dismiss } = poToastBar; await content.sendFileMessage('any_file.txt'); await content.descriptionInput.fill('a message with a file'); @@ -63,8 +59,8 @@ test.describe('prune-messages', () => { await pruneMessages.doNotPrunePinned.check({ force: true }); await pruneMessages.filesOnly.check({ force: true }); await pruneMessages.prune(); - await expect(alert).toHaveText('1 file pruned'); - await dismiss.click(); + await toastMessage.waitForDisplay({ type: 'success', message: '1 file pruned' }); + await toastMessage.dismissToast(); await expect(pruneMessages.filesOnly, 'Checkbox is reset after success').not.toBeChecked(); await expect(pruneMessages.doNotPrunePinned, 'Checkbox is reset after success').not.toBeChecked(); }); @@ -73,8 +69,8 @@ test.describe('prune-messages', () => { await pruneMessages.doNotPrunePinned.check({ force: true }); await pruneMessages.filesOnly.check({ force: true }); await pruneMessages.prune(); - await expect(alert).toHaveText('No files found to prune'); - await dismiss.click(); + await toastMessage.waitForDisplay({ type: 'error', message: 'No files found to prune' }); + await toastMessage.dismissToast('error'); await expect(pruneMessages.filesOnly, 'Checkbox retains value after error').toBeChecked(); await expect(pruneMessages.doNotPrunePinned, 'Checkbox retains value after error').toBeChecked(); }); @@ -82,16 +78,16 @@ test.describe('prune-messages', () => { await test.step('uncheck files only', async () => { await pruneMessages.filesOnly.uncheck({ force: true }); await pruneMessages.prune(); - await expect(alert).toHaveText('2 messages pruned'); - await dismiss.click(); + await toastMessage.waitForDisplay({ type: 'success', message: '2 messages pruned' }); + await toastMessage.dismissToast(); await expect(pruneMessages.filesOnly, 'Checkbox is reset after success').not.toBeChecked(); }); await test.step('uncheck do not prune pinned', async () => { await pruneMessages.doNotPrunePinned.uncheck({ force: true }); await pruneMessages.prune(); - await expect(alert).toHaveText('1 message pruned'); - await dismiss.click(); + await toastMessage.waitForDisplay({ type: 'success', message: '1 message pruned' }); + await toastMessage.dismissToast(); await expect(content.lastUserMessage).not.toBeVisible(); }); }, @@ -110,8 +106,8 @@ test.describe('prune-messages', () => { const { content, tabs: { pruneMessages }, + toastMessage, } = poHomeChannel; - const { alert, dismiss } = poToastBar; await content.sendFileMessage('any_file.txt'); await content.descriptionInput.fill('a message with a file'); @@ -121,8 +117,8 @@ test.describe('prune-messages', () => { await test.step('prune files only', async () => { await pruneMessages.filesOnly.check({ force: true }); await pruneMessages.prune(); - await expect(alert).toHaveText('1 file pruned'); - await dismiss.click(); + await toastMessage.waitForDisplay({ type: 'success', message: '1 file pruned' }); + await toastMessage.dismissToast(); await expect(pruneMessages.filesOnly, 'Checkbox is reset after success').not.toBeChecked(); await expect(pruneMessages.doNotPrunePinned, 'Checkbox is reset after success').not.toBeChecked(); }); diff --git a/apps/meteor/tests/e2e/retention-policy.spec.ts b/apps/meteor/tests/e2e/retention-policy.spec.ts index 9dc17cd2b3625..fb736e055c954 100644 --- a/apps/meteor/tests/e2e/retention-policy.spec.ts +++ b/apps/meteor/tests/e2e/retention-policy.spec.ts @@ -184,7 +184,7 @@ test.describe.serial('retention-policy', () => { await poHomeChannel.tabs.room.checkboxOverrideGlobalRetention.click(); await poHomeChannel.tabs.room.inputRetentionMaxAge.fill('365'); await poHomeChannel.tabs.room.btnSave.click(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await poHomeChannel.roomToolbar.openRoomInfo(); await poHomeChannel.tabs.room.btnEdit.click(); @@ -201,7 +201,7 @@ test.describe.serial('retention-policy', () => { test('should override ignore threads default value', async () => { await poHomeChannel.tabs.room.checkboxIgnoreThreads.click(); await poHomeChannel.tabs.room.btnSave.click(); - await poHomeChannel.dismissToast(); + await poHomeChannel.toastMessage.dismissToast(); await poHomeChannel.roomToolbar.openRoomInfo(); await poHomeChannel.tabs.room.btnEdit.click(); diff --git a/apps/meteor/tests/e2e/settings-int.spec.ts b/apps/meteor/tests/e2e/settings-int.spec.ts index 5fdd0edae7db0..797e55c82a4aa 100644 --- a/apps/meteor/tests/e2e/settings-int.spec.ts +++ b/apps/meteor/tests/e2e/settings-int.spec.ts @@ -21,7 +21,6 @@ test.describe.serial('settings-int', () => { await page.locator('#Message_AllowEditing_BlockEditInMinutes').blur(); await poAdminSettings.btnSaveChanges.click(); - - await expect(page.locator('.rcx-toastbar.rcx-toastbar--error')).toBeVisible(); + await poAdminSettings.toastMessage.waitForDisplay({ type: 'error' }); }); });