From 56a15348dacfc63671d59d35761f436ad04927d3 Mon Sep 17 00:00:00 2001 From: dougfabris Date: Mon, 15 Sep 2025 20:05:28 -0300 Subject: [PATCH 1/4] chore: add waitForLogout in logout action --- apps/meteor/tests/e2e/e2e-encryption.spec.ts | 14 ++++++++------ .../tests/e2e/page-objects/fragments/e2ee.ts | 5 +++++ .../e2e/page-objects/fragments/home-sidenav.ts | 10 +++++++++- apps/meteor/tests/e2e/page-objects/login.ts | 4 ++++ 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/apps/meteor/tests/e2e/e2e-encryption.spec.ts b/apps/meteor/tests/e2e/e2e-encryption.spec.ts index b0d76a12cb53..f4191f39b797 100644 --- a/apps/meteor/tests/e2e/e2e-encryption.spec.ts +++ b/apps/meteor/tests/e2e/e2e-encryption.spec.ts @@ -69,8 +69,6 @@ test.describe('initial setup', () => { // Log out await sidenav.logout(); - await expect(loginPage.loginButton).toBeVisible(); - // Login again await loginPage.loginByUserState(Users.admin); @@ -100,12 +98,18 @@ test.describe('initial setup', () => { const enterE2EEPasswordModal = new EnterE2EEPasswordModal(page); const resetE2EEPasswordModal = new ResetE2EEPasswordModal(page); + // Logout await sidenav.logout(); + + // Login again await loginPage.loginByUserState(Users.admin); + + // Reset E2EE password await enterE2EEPasswordBanner.click(); await enterE2EEPasswordModal.forgotPassword(); await resetE2EEPasswordModal.confirmReset(); + // restore login await loginPage.loginByUserState(Users.admin); }); @@ -135,8 +139,6 @@ test.describe('initial setup', () => { await sidenav.logout(); // Login again - await expect(loginPage.loginButton).toBeVisible(); - await loginPage.loginByUserState(Users.admin); // Enter the saved password @@ -197,8 +199,10 @@ test.describe('basic features', () => { await expect(encryptedRoomPage.lastMessage.encryptedIcon).toBeVisible(); await expect(encryptedRoomPage.lastMessage.body).toHaveText(messageText); + // Log out await sidenav.logout(); + // Login again await loginPage.loginByUserState(Users.admin); // Navigate to the encrypted channel WITHOUT entering the password @@ -1005,8 +1009,6 @@ test.describe.serial('e2ee room setup', () => { // Logout to remove e2ee keys await poHomeChannel.sidenav.logout(); - await page.locator('role=button[name="Login"]').waitFor(); - await injectInitialData(); await restoreState(page, Users.admin, { except: ['private_key', 'public_key'] }); diff --git a/apps/meteor/tests/e2e/page-objects/fragments/e2ee.ts b/apps/meteor/tests/e2e/page-objects/fragments/e2ee.ts index 49386308a662..b3f3ae98305f 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/e2ee.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/e2ee.ts @@ -3,6 +3,7 @@ import type { Locator, Page } from '@playwright/test'; import { Modal } from './modal'; import { ToastMessages } from './toast-messages'; import { expect } from '../../utils/test'; +import { LoginPage } from '../login'; abstract class E2EEBanner { constructor(protected root: Locator) {} @@ -96,8 +97,11 @@ export class EnterE2EEPasswordModal extends Modal { } export class ResetE2EEPasswordModal extends Modal { + private readonly login: LoginPage; + constructor(page: Page) { super(page.getByRole('dialog', { name: 'Reset E2EE password' })); + this.login = new LoginPage(page); } private get resetE2EEPasswordButton() { @@ -107,6 +111,7 @@ export class ResetE2EEPasswordModal extends Modal { async confirmReset() { await this.resetE2EEPasswordButton.click(); await this.waitForDismissal(); + await this.login.waitForLogout(); } } diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts index 2bd4cbac0ef5..1ac8cc353733 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts @@ -1,11 +1,14 @@ import type { Locator, Page } from '@playwright/test'; +import type { LoginPage } from '../login'; import { ToastMessages } from './toast-messages'; import { expect } from '../../utils/test'; export class HomeSidenav { private readonly page: Page; + private readonly login: LoginPage; + constructor(page: Page) { this.page = page; } @@ -101,6 +104,10 @@ export class HomeSidenav { return this.page.locator('role=menuitemcheckbox[name="Preferences"]'); } + get accountLogoutOption(): Locator { + return this.userProfileMenu.getByRole('menuitemcheckbox', { name: 'Logout' }); + } + get searchList(): Locator { return this.page.getByRole('search').getByRole('listbox'); } @@ -165,7 +172,8 @@ export class HomeSidenav { async logout(): Promise { await this.btnUserProfileMenu.click(); - await this.page.locator('//*[contains(@class, "rcx-option__content") and contains(text(), "Logout")]').click(); + await this.accountLogoutOption.click(); + await this.login.waitForLogout(); } async switchStatus(status: 'offline' | 'online'): Promise { diff --git a/apps/meteor/tests/e2e/page-objects/login.ts b/apps/meteor/tests/e2e/page-objects/login.ts index e440934e25fa..9fccd12d38ad 100644 --- a/apps/meteor/tests/e2e/page-objects/login.ts +++ b/apps/meteor/tests/e2e/page-objects/login.ts @@ -23,6 +23,10 @@ export class LoginPage { await expect(this.page.getByRole('main')).toBeVisible(); } + async waitForLogout() { + await expect(this.loginButton).toBeVisible(); + } + async loginByUserState(userState: IUserState) { // Creates a login token for the user const connection = await MongoClient.connect(constants.URL_MONGODB); From 4414d2670606b31e622a429ff24ffc9c5845e5d2 Mon Sep 17 00:00:00 2001 From: dougfabris Date: Mon, 15 Sep 2025 20:16:37 -0300 Subject: [PATCH 2/4] fix: login page not being initialized (rabbit review) --- apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts index 1ac8cc353733..0c53b6c16006 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts @@ -1,6 +1,6 @@ import type { Locator, Page } from '@playwright/test'; -import type { LoginPage } from '../login'; +import { LoginPage } from '../login'; import { ToastMessages } from './toast-messages'; import { expect } from '../../utils/test'; @@ -11,6 +11,7 @@ export class HomeSidenav { constructor(page: Page) { this.page = page; + this.login = new LoginPage(page); } get advancedSettingsAccordion(): Locator { From 745babdad660b556a2425632e51bd21d07d79336 Mon Sep 17 00:00:00 2001 From: dougfabris Date: Tue, 16 Sep 2025 10:03:49 -0300 Subject: [PATCH 3/4] chore: replace `waitForLogout` --- apps/meteor/tests/e2e/page-objects/fragments/e2ee.ts | 2 +- apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts | 2 +- apps/meteor/tests/e2e/page-objects/login.ts | 4 ---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/meteor/tests/e2e/page-objects/fragments/e2ee.ts b/apps/meteor/tests/e2e/page-objects/fragments/e2ee.ts index b3f3ae98305f..151915016bbc 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/e2ee.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/e2ee.ts @@ -111,7 +111,7 @@ export class ResetE2EEPasswordModal extends Modal { async confirmReset() { await this.resetE2EEPasswordButton.click(); await this.waitForDismissal(); - await this.login.waitForLogout(); + await this.login.waitForIt(); } } diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts index 0c53b6c16006..86153c41ebb4 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts @@ -174,7 +174,7 @@ export class HomeSidenav { async logout(): Promise { await this.btnUserProfileMenu.click(); await this.accountLogoutOption.click(); - await this.login.waitForLogout(); + await this.login.waitForIt(); } async switchStatus(status: 'offline' | 'online'): Promise { diff --git a/apps/meteor/tests/e2e/page-objects/login.ts b/apps/meteor/tests/e2e/page-objects/login.ts index 9fccd12d38ad..e440934e25fa 100644 --- a/apps/meteor/tests/e2e/page-objects/login.ts +++ b/apps/meteor/tests/e2e/page-objects/login.ts @@ -23,10 +23,6 @@ export class LoginPage { await expect(this.page.getByRole('main')).toBeVisible(); } - async waitForLogout() { - await expect(this.loginButton).toBeVisible(); - } - async loginByUserState(userState: IUserState) { // Creates a login token for the user const connection = await MongoClient.connect(constants.URL_MONGODB); From fa57e89d3154885848195420de82b1db15199e1e Mon Sep 17 00:00:00 2001 From: dougfabris Date: Tue, 16 Sep 2025 10:14:43 -0300 Subject: [PATCH 4/4] chore: remove deprecate tag --- apps/meteor/tests/e2e/page-objects/login.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/meteor/tests/e2e/page-objects/login.ts b/apps/meteor/tests/e2e/page-objects/login.ts index e440934e25fa..2b6449fd1f4e 100644 --- a/apps/meteor/tests/e2e/page-objects/login.ts +++ b/apps/meteor/tests/e2e/page-objects/login.ts @@ -13,7 +13,9 @@ export class LoginPage { return this.page.getByRole('button', { name: 'Login', exact: true }); } - /** @deprecated ideally the previous action should ensure the user is logged out and we should just assume to be at the login page */ + /** + * Ideally the previous action should ensure the user is logged out and we should just assume to be at the login page + * */ async waitForIt() { await this.loginButton.waitFor(); }