From a6222793124734cc36bf365999e7b1ac1005c4cc Mon Sep 17 00:00:00 2001 From: Klaus Boldt Date: Tue, 30 Sep 2025 14:46:46 +0200 Subject: [PATCH 1/7] wip at applock --- test/e2e_tests/backend/brigRepository.e2e.ts | 30 +++++ .../2FA-for-TeamsSpecs/2fa-for-teams.spec.ts | 2 +- test/e2e_tests/specs/AppLock/AppLock.spec.ts | 109 ++++++++++++++++++ test/e2e_tests/utils/setup.utli.ts | 39 ------- 4 files changed, 140 insertions(+), 40 deletions(-) create mode 100644 test/e2e_tests/specs/AppLock/AppLock.spec.ts delete mode 100644 test/e2e_tests/utils/setup.utli.ts diff --git a/test/e2e_tests/backend/brigRepository.e2e.ts b/test/e2e_tests/backend/brigRepository.e2e.ts index e64a162030f..c93c2aadad1 100644 --- a/test/e2e_tests/backend/brigRepository.e2e.ts +++ b/test/e2e_tests/backend/brigRepository.e2e.ts @@ -109,6 +109,18 @@ export class BrigRepositoryE2E { ); } + public async unlockAppLock(teamId: string) { + await this.axiosInstance.put( + `i/teams/${teamId}/features/appLock/unlocked`, + {}, + { + headers: { + Authorization: `Basic ${BASIC_AUTH}`, + }, + }, + ); + } + public async enableChannelsFeature(teamId: string) { await this.axiosInstance.patch( `i/teams/${teamId}/features/channels`, @@ -122,6 +134,7 @@ export class BrigRepositoryE2E { }, ); } + public async enableMLSFeature(teamId: string) { await this.axiosInstance.patch( `i/teams/${teamId}/features/mls`, @@ -143,6 +156,23 @@ export class BrigRepositoryE2E { ); } + public async enableAppLock(teamId: string) { + await this.axiosInstance.patch( + `i/teams/${teamId}/features/appLock`, + { + status: 'enabled', + config: { + enforceAppLock: true, + }, + }, + { + headers: { + Authorization: `Basic ${BASIC_AUTH}`, + }, + }, + ); + } + public async unlockCellsFeature(teamId: string) { await this.axiosInstance.put( `i/teams/${teamId}/features/cells/unlocked`, diff --git a/test/e2e_tests/specs/2FA-for-TeamsSpecs/2fa-for-teams.spec.ts b/test/e2e_tests/specs/2FA-for-TeamsSpecs/2fa-for-teams.spec.ts index 6a9f776624d..44d4f335083 100644 --- a/test/e2e_tests/specs/2FA-for-TeamsSpecs/2fa-for-teams.spec.ts +++ b/test/e2e_tests/specs/2FA-for-TeamsSpecs/2fa-for-teams.spec.ts @@ -18,7 +18,7 @@ */ import {getUser, User} from 'test/e2e_tests/data/user'; -import {setupBasicTestScenario} from 'test/e2e_tests/utils/setup.utli'; +import {setupBasicTestScenario} from 'test/e2e_tests/utils/setup.util'; import {tearDownAll} from 'test/e2e_tests/utils/tearDown.util'; import {loginUser} from 'test/e2e_tests/utils/userActions'; diff --git a/test/e2e_tests/specs/AppLock/AppLock.spec.ts b/test/e2e_tests/specs/AppLock/AppLock.spec.ts new file mode 100644 index 00000000000..4a56423fc48 --- /dev/null +++ b/test/e2e_tests/specs/AppLock/AppLock.spec.ts @@ -0,0 +1,109 @@ +/* + * Wire + * Copyright (C) 2025 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + * + */ + +import {getUser} from 'test/e2e_tests/data/user'; +import {setupBasicTestScenario} from 'test/e2e_tests/utils/setup.util'; +import {tearDownAll} from 'test/e2e_tests/utils/tearDown.util'; +import {loginUser} from 'test/e2e_tests/utils/userActions'; + +import {test} from '../../test.fixtures'; + +test.describe('Accessibility', () => { + test.slow(); + + let owner = getUser(); + const members = Array.from({length: 2}, () => getUser()); + const [memberA] = members; + const teamName = 'Accessibility'; + + test.beforeAll(async ({api}) => { + const user = await setupBasicTestScenario(api, members, owner, teamName); + owner = {...owner, ...user}; + await api.brig.unlockAppLock(owner.teamId); + }); + + test( + 'Web: I should not be able to close app lock setup modal if app lock is enforced', + {tag: ['@TC-2740', '@regression']}, + async ({pageManager, api}) => { + await pageManager.openMainPage(); + await api.brig.enableAppLock(owner.teamId); + // set app log state + await loginUser(memberA, pageManager); + // wait for modal + await pageManager.waitForTimeout(50_000); + }, + ); + + // test( + // 'I want to see app lock setup modal on login after app lock has been enforced for the team', + // {tag: ['@TC-2744', '@regression']}, + // async ({pageManager}) => { + // await pageManager.openMainPage(); + // const {components, pages} = pageManager.webapp; + + // await loginUser(memberA, pageManager); + + // await expect(components.conversationSidebar().sidebar).toHaveAttribute('data-is-collapsed', 'true'); + // }, + // ); + + // test( + // 'Web: I want the app to lock when I switch back to webapp tab after inactivity timeout expired', + // {tag: ['@TC-2752', '@regression']}, + // async ({pageManager}) => { + // await pageManager.openMainPage(); + // const {components, pages} = pageManager.webapp; + + // await loginUser(memberA, pageManager); + + // await expect(components.conversationSidebar().sidebar).toHaveAttribute('data-is-collapsed', 'true'); + // }, + // ); + + // test( + // 'Web: App should not lock if I switch back to webapp tab in time (during inactivity timeout)', + // {tag: ['@TC-2753', '@regression']}, + // async ({pageManager}) => { + // await pageManager.openMainPage(); + // const {components, pages} = pageManager.webapp; + + // await loginUser(memberA, pageManager); + + // await expect(components.conversationSidebar().sidebar).toHaveAttribute('data-is-collapsed', 'true'); + // }, + // ); + + // test( + // 'Web: I want the app to automatically lock after refreshing the page', + // {tag: ['@TC-2754', '@regression']}, + // async ({pageManager}) => { + // await pageManager.openMainPage(); + // const {components, pages} = pageManager.webapp; + + // await loginUser(memberA, pageManager); + + // await expect(components.conversationSidebar().sidebar).toHaveAttribute('data-is-collapsed', 'true'); + // }, + // ); + + test.afterAll(async ({api}) => { + await tearDownAll(api); + }); +}); diff --git a/test/e2e_tests/utils/setup.utli.ts b/test/e2e_tests/utils/setup.utli.ts deleted file mode 100644 index 54fa15031ea..00000000000 --- a/test/e2e_tests/utils/setup.utli.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Wire - * Copyright (C) 2025 Wire Swiss GmbH - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see http://www.gnu.org/licenses/. - * - */ - -import {addCreatedTeam, addCreatedUser} from './tearDown.util'; -import {inviteMembers} from './userActions'; - -import {ApiManagerE2E} from '../backend/apiManager.e2e'; -import {User} from '../data/user'; - -/** - * add an team with one owner and 2 member - */ -export const setupBasicTestScenario = async (api: ApiManagerE2E, member: User[], owner: User, teamName: string) => { - const user = await api.createTeamOwner(owner, teamName); - // register credentials for cleanup later - addCreatedTeam(user, user.teamId); - await inviteMembers(member, user, api); - - for (const [, user] of member.entries()) { - addCreatedUser(user); - } - return user; -}; From 03a442113c6094cd59eb5f2167e3582471d93288 Mon Sep 17 00:00:00 2001 From: Klaus Boldt Date: Thu, 2 Oct 2025 09:42:26 +0200 Subject: [PATCH 2/7] wip --- test/e2e_tests/backend/brigRepository.e2e.ts | 1 + .../webapp/modals/appLock.modal.ts | 2 +- .../webapp/pages/infoHistory.page.ts | 10 +- test/e2e_tests/specs/AppLock/AppLock.spec.ts | 270 +++++++++++++----- test/e2e_tests/utils/setup.util.ts | 18 +- 5 files changed, 234 insertions(+), 67 deletions(-) diff --git a/test/e2e_tests/backend/brigRepository.e2e.ts b/test/e2e_tests/backend/brigRepository.e2e.ts index c93c2aadad1..67d293bec17 100644 --- a/test/e2e_tests/backend/brigRepository.e2e.ts +++ b/test/e2e_tests/backend/brigRepository.e2e.ts @@ -163,6 +163,7 @@ export class BrigRepositoryE2E { status: 'enabled', config: { enforceAppLock: true, + inactivityTimeoutSecs: 30, }, }, { diff --git a/test/e2e_tests/pageManager/webapp/modals/appLock.modal.ts b/test/e2e_tests/pageManager/webapp/modals/appLock.modal.ts index 7a9391c724b..e1203544838 100644 --- a/test/e2e_tests/pageManager/webapp/modals/appLock.modal.ts +++ b/test/e2e_tests/pageManager/webapp/modals/appLock.modal.ts @@ -36,7 +36,7 @@ export class AppLockModal { this.appLockModal = page.locator("[data-uie-name='applock-modal']"); this.lockPasscodeInput = page.locator("[data-uie-name='applock-modal'] [data-uie-name='input-applock-set-a']"); this.unlockPasscodeInput = page.locator("[data-uie-name='applock-modal'] [data-uie-name='input-applock-unlock']"); - this.appLockActionButton = page.locator("[data-uie-name='applock-modal'] [data-uie-name='do-action']"); + this.appLockActionButton = this.appLockModal.locator("[data-uie-name='do-action']"); this.appLockModalHeader = page.locator("[data-uie-name='applock-modal'] [data-uie-name='applock-modal-header']"); this.appLockModalText = page.locator("[data-uie-name='applock-modal'] [data-uie-name='label-applock-unlock-text']"); this.loadingBar = page.locator('.progress-bar'); diff --git a/test/e2e_tests/pageManager/webapp/pages/infoHistory.page.ts b/test/e2e_tests/pageManager/webapp/pages/infoHistory.page.ts index 029fde15555..8a948010038 100644 --- a/test/e2e_tests/pageManager/webapp/pages/infoHistory.page.ts +++ b/test/e2e_tests/pageManager/webapp/pages/infoHistory.page.ts @@ -23,12 +23,20 @@ import {selectByDataAttribute} from 'test/e2e_tests/utils/selector.util'; export class HistoryInfoPage { readonly page: Page; - private readonly continueButton: Locator; + readonly continueButton: Locator; constructor(page: Page) { this.page = page; this.continueButton = this.page.locator(selectByDataAttribute('do-history-confirm')); } + async isButtonVisible() { + try { + await this.continueButton.waitFor({state: 'visible', timeout: 10000}); + return true; + } catch (err) { + return false; + } + } async clickConfirmButton() { await this.continueButton.click(); diff --git a/test/e2e_tests/specs/AppLock/AppLock.spec.ts b/test/e2e_tests/specs/AppLock/AppLock.spec.ts index 4a56423fc48..7955c0aab8f 100644 --- a/test/e2e_tests/specs/AppLock/AppLock.spec.ts +++ b/test/e2e_tests/specs/AppLock/AppLock.spec.ts @@ -18,90 +18,232 @@ */ import {getUser} from 'test/e2e_tests/data/user'; -import {setupBasicTestScenario} from 'test/e2e_tests/utils/setup.util'; +import {PageManager} from 'test/e2e_tests/pageManager'; +import {completeLogin, setupBasicTestScenario} from 'test/e2e_tests/utils/setup.util'; import {tearDownAll} from 'test/e2e_tests/utils/tearDown.util'; import {loginUser} from 'test/e2e_tests/utils/userActions'; -import {test} from '../../test.fixtures'; +import {test, expect} from '../../test.fixtures'; -test.describe('Accessibility', () => { +test.describe('AppLock', () => { test.slow(); let owner = getUser(); const members = Array.from({length: 2}, () => getUser()); const [memberA] = members; - const teamName = 'Accessibility'; - + const teamName = 'AppLock'; + const appLockPassCode = '1a3!567N4'; test.beforeAll(async ({api}) => { const user = await setupBasicTestScenario(api, members, owner, teamName); owner = {...owner, ...user}; - await api.brig.unlockAppLock(owner.teamId); + await api.brig.enableAppLock(owner.teamId); }); + const setupAppLock = async (pageManager: PageManager) => { + // add passe + + const {modals} = pageManager.webapp; + const appLock = await modals.appLock(); + // check if exists modal to set passphrase + if (await appLock.isVisible()) { + // check if is in passcode setup mode + // this is modal titile check? + if (await appLock.lockPasscodeInput.isVisible()) { + // setup code + await appLock.setPasscode(appLockPassCode); + } else { + await appLock.unlockAppWithPasscode(appLockPassCode); + } + } + }; + + test( + 'I want to see app lock setup modal on login after app lock has been enforced for the team', + {tag: ['@TC-2744', '@TC-2740', '@regression']}, + async ({pageManager}) => { + const {modals} = pageManager.webapp; + + await completeLogin(pageManager, memberA); + await expect(modals.appLock().isVisible()).toBeTruthy(); + + await test.step('Web: I should not be able to close app lock setup modal if app lock is enforced', async () => { + // click outside the modal + const page = await pageManager.getPage(); + await page.mouse.click(200, 350); + // check if the modal still there + expect(await modals.appLock().isVisible()).toBeTruthy(); + }); + }, + ); + + test( + 'Web: I want the app to lock when I switch back to webapp tab after inactivity timeout expired', + {tag: ['@TC-2752', '@regression']}, + async ({pageManager}) => { + await pageManager.openMainPage(); + + await loginUser(memberA, pageManager); + + // open new tab and wait + // boost the browser time? + // open back the correct tab + // unlock the app + }, + ); + test( - 'Web: I should not be able to close app lock setup modal if app lock is enforced', - {tag: ['@TC-2740', '@regression']}, - async ({pageManager, api}) => { + 'Web: App should not lock if I switch back to webapp tab in time (during inactivity timeout)', + {tag: ['@TC-2753', '@regression']}, + async ({pageManager}) => { await pageManager.openMainPage(); - await api.brig.enableAppLock(owner.teamId); - // set app log state + await loginUser(memberA, pageManager); - // wait for modal - await pageManager.waitForTimeout(50_000); + // open new tab and wait + // boost the browser time? + // open back the correct tab }, ); - // test( - // 'I want to see app lock setup modal on login after app lock has been enforced for the team', - // {tag: ['@TC-2744', '@regression']}, - // async ({pageManager}) => { - // await pageManager.openMainPage(); - // const {components, pages} = pageManager.webapp; - - // await loginUser(memberA, pageManager); - - // await expect(components.conversationSidebar().sidebar).toHaveAttribute('data-is-collapsed', 'true'); - // }, - // ); - - // test( - // 'Web: I want the app to lock when I switch back to webapp tab after inactivity timeout expired', - // {tag: ['@TC-2752', '@regression']}, - // async ({pageManager}) => { - // await pageManager.openMainPage(); - // const {components, pages} = pageManager.webapp; - - // await loginUser(memberA, pageManager); - - // await expect(components.conversationSidebar().sidebar).toHaveAttribute('data-is-collapsed', 'true'); - // }, - // ); - - // test( - // 'Web: App should not lock if I switch back to webapp tab in time (during inactivity timeout)', - // {tag: ['@TC-2753', '@regression']}, - // async ({pageManager}) => { - // await pageManager.openMainPage(); - // const {components, pages} = pageManager.webapp; - - // await loginUser(memberA, pageManager); - - // await expect(components.conversationSidebar().sidebar).toHaveAttribute('data-is-collapsed', 'true'); - // }, - // ); - - // test( - // 'Web: I want the app to automatically lock after refreshing the page', - // {tag: ['@TC-2754', '@regression']}, - // async ({pageManager}) => { - // await pageManager.openMainPage(); - // const {components, pages} = pageManager.webapp; - - // await loginUser(memberA, pageManager); - - // await expect(components.conversationSidebar().sidebar).toHaveAttribute('data-is-collapsed', 'true'); - // }, - // ); + test( + 'Web: I want the app to automatically lock after refreshing the page', + {tag: ['@TC-2754', '@regression']}, + async ({pageManager}) => { + await pageManager.openMainPage(); + const {modals, pages} = pageManager.webapp; + + await pageManager.openMainPage(); + await loginUser(memberA, pageManager); + + const hasLocalData = await pages.historyInfo().isButtonVisible(); + if (hasLocalData) { + await pages.historyInfo().clickConfirmButton(); + } else { + await modals.appLock().appLockModal.waitFor({state: 'visible', timeout: 60_000}); + + await modals.dataShareConsent().clickDecline(); + } + + // wait for data share consent + await setupAppLock(pageManager); + await pageManager.refreshPage(); + await pageManager.waitForTimeout(5_000); + expect(await modals.appLock().isVisible()).toBeTruthy(); + }, + ); + + test( + 'Web: I want to unlock the app with passphrase after login', + {tag: ['@TC-2755', '@regression']}, + async ({pageManager}) => { + await pageManager.openMainPage(); + + await loginUser(memberA, pageManager); + + // setup + // logout + // login + // input + }, + ); + + test( + 'Web: I should not be able to unlock the app with wrong passphrase', + {tag: ['@TC-2758', '@regression']}, + async ({pageManager}) => { + await pageManager.openMainPage(); + + await loginUser(memberA, pageManager); + + // reload the app + // check lock modal + }, + ); + + test( + 'I want to wipe database when I forgot my app lock passphrase', + {tag: ['@TC-2761', '@regression']}, + async ({pageManager}) => { + await pageManager.openMainPage(); + + await loginUser(memberA, pageManager); + + // reload the app + // check lock modal + // click forget password in the modal? + // check if in browser the db is cleared? + }, + ); + + test( + 'Web: I should not be able to wipe database with wrong account password', + {tag: ['@TC-2763', '@regression']}, + async ({pageManager}) => { + await pageManager.openMainPage(); + + await loginUser(memberA, pageManager); + + // reload the app + // check lock modal + // click forget password in the modal? + // check if in browser the db is cleared? + }, + ); + + test( + 'Web: Verify inactivity timeout set on a team level applies to team member accounts', + {tag: ['@TC-2767', '@regression']}, + async ({pageManager}) => { + await pageManager.openMainPage(); + + await loginUser(memberA, pageManager); + + // reload the app + // check lock modal + // click forget password in the modal? + // check if in browser the db is cleared? + }, + ); + + test( + 'I should not be able to switch off app lock if it is enforced for the team 0', + {tag: ['@TC-2770', '@regression']}, + async ({pageManager}) => { + await pageManager.openMainPage(); + + await loginUser(memberA, pageManager); + + // reload the app + // check lock modal + // click forget password in the modal? + // check if in browser the db is cleared? + }, + ); + + test('I want to switch off app lock 0', {tag: ['@TC-2771', '@regression']}, async ({pageManager}) => { + await pageManager.openMainPage(); + + await loginUser(memberA, pageManager); + + // reload the app + // check lock modal + // click forget password in the modal? + // check if in browser the db is cleared? + }); + + test( + 'Web: Verify inactivity timeout can be set if app lock is not enforced on a team level', + {tag: ['@TC-2772', '@regression']}, + async ({pageManager}) => { + await pageManager.openMainPage(); + + await loginUser(memberA, pageManager); + + // reload the app + // check lock modal + // click forget password in the modal? + // check if in browser the db is cleared? + }, + ); test.afterAll(async ({api}) => { await tearDownAll(api); diff --git a/test/e2e_tests/utils/setup.util.ts b/test/e2e_tests/utils/setup.util.ts index 54fa15031ea..a6c615c71ec 100644 --- a/test/e2e_tests/utils/setup.util.ts +++ b/test/e2e_tests/utils/setup.util.ts @@ -18,10 +18,11 @@ */ import {addCreatedTeam, addCreatedUser} from './tearDown.util'; -import {inviteMembers} from './userActions'; +import {inviteMembers, loginUser} from './userActions'; import {ApiManagerE2E} from '../backend/apiManager.e2e'; import {User} from '../data/user'; +import {PageManager} from '../pageManager'; /** * add an team with one owner and 2 member @@ -37,3 +38,18 @@ export const setupBasicTestScenario = async (api: ApiManagerE2E, member: User[], } return user; }; + +export const completeLogin = async (pageManager: PageManager, user: User) => { + const {components, modals, pages} = pageManager.webapp; + await pageManager.openMainPage(); + await loginUser(user, pageManager); + + const hasLocalData = await pages.historyInfo().isButtonVisible(); + if (hasLocalData) { + await pages.historyInfo().clickConfirmButton(); + } + await components.conversationSidebar().isPageLoaded(); + if (!hasLocalData) { + await modals.dataShareConsent().clickDecline(); + } +}; From 4435b6f772f3e04e265bfbb6a34358ebfc5403c4 Mon Sep 17 00:00:00 2001 From: Klaus Boldt Date: Tue, 7 Oct 2025 09:23:48 +0200 Subject: [PATCH 3/7] move to function --- test/e2e_tests/specs/AppLock/AppLock.spec.ts | 23 ++++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/test/e2e_tests/specs/AppLock/AppLock.spec.ts b/test/e2e_tests/specs/AppLock/AppLock.spec.ts index 7955c0aab8f..a8b3ef22a10 100644 --- a/test/e2e_tests/specs/AppLock/AppLock.spec.ts +++ b/test/e2e_tests/specs/AppLock/AppLock.spec.ts @@ -57,6 +57,17 @@ test.describe('AppLock', () => { } }; + const checkHistoryInfo = async (pageManager: PageManager) => { + const {modals, pages} = pageManager.webapp; + const hasLocalData = await pages.historyInfo().isButtonVisible(); + if (hasLocalData) { + await pages.historyInfo().clickConfirmButton(); + } else { + await modals.appLock().appLockModal.waitFor({state: 'visible', timeout: 60_000}); + } + await modals.dataShareConsent().clickDecline(); + }; + test( 'I want to see app lock setup modal on login after app lock has been enforced for the team', {tag: ['@TC-2744', '@TC-2740', '@regression']}, @@ -109,19 +120,12 @@ test.describe('AppLock', () => { {tag: ['@TC-2754', '@regression']}, async ({pageManager}) => { await pageManager.openMainPage(); - const {modals, pages} = pageManager.webapp; + const {modals} = pageManager.webapp; await pageManager.openMainPage(); await loginUser(memberA, pageManager); - const hasLocalData = await pages.historyInfo().isButtonVisible(); - if (hasLocalData) { - await pages.historyInfo().clickConfirmButton(); - } else { - await modals.appLock().appLockModal.waitFor({state: 'visible', timeout: 60_000}); - - await modals.dataShareConsent().clickDecline(); - } + await checkHistoryInfo(pageManager); // wait for data share consent await setupAppLock(pageManager); @@ -140,6 +144,7 @@ test.describe('AppLock', () => { await loginUser(memberA, pageManager); // setup + await setupAppLock(pageManager); // logout // login // input From 7c5d1ed269961f1290dac036eabf509be6bf9f61 Mon Sep 17 00:00:00 2001 From: Klaus Boldt Date: Wed, 8 Oct 2025 10:10:55 +0200 Subject: [PATCH 4/7] wip --- .../webapp/modals/appLock.modal.ts | 27 ++++- test/e2e_tests/specs/AppLock/AppLock.spec.ts | 112 +++++------------- test/e2e_tests/utils/userActions.ts | 12 ++ 3 files changed, 66 insertions(+), 85 deletions(-) diff --git a/test/e2e_tests/pageManager/webapp/modals/appLock.modal.ts b/test/e2e_tests/pageManager/webapp/modals/appLock.modal.ts index e1203544838..1cb8cfde731 100644 --- a/test/e2e_tests/pageManager/webapp/modals/appLock.modal.ts +++ b/test/e2e_tests/pageManager/webapp/modals/appLock.modal.ts @@ -19,16 +19,22 @@ import {Locator, Page} from '@playwright/test'; +import {selectByDataAttribute} from 'test/e2e_tests/utils/selector.util'; + export class AppLockModal { readonly page: Page; readonly lockPasscodeInput: Locator; readonly unlockPasscodeInput: Locator; + readonly appLockWipeInput: Locator; readonly appLockModal: Locator; readonly appLockActionButton: Locator; readonly appLockModalHeader: Locator; readonly appLockModalText: Locator; readonly loadingBar: Locator; + readonly errorMessage: Locator; + readonly forgotPassphraseButton: Locator; + readonly wipeDatabaseButton: Locator; constructor(page: Page) { this.page = page; @@ -36,10 +42,14 @@ export class AppLockModal { this.appLockModal = page.locator("[data-uie-name='applock-modal']"); this.lockPasscodeInput = page.locator("[data-uie-name='applock-modal'] [data-uie-name='input-applock-set-a']"); this.unlockPasscodeInput = page.locator("[data-uie-name='applock-modal'] [data-uie-name='input-applock-unlock']"); + this.appLockWipeInput = this.appLockModal.locator(selectByDataAttribute('input-applock-wipe')); this.appLockActionButton = this.appLockModal.locator("[data-uie-name='do-action']"); this.appLockModalHeader = page.locator("[data-uie-name='applock-modal'] [data-uie-name='applock-modal-header']"); this.appLockModalText = page.locator("[data-uie-name='applock-modal'] [data-uie-name='label-applock-unlock-text']"); this.loadingBar = page.locator('.progress-bar'); + this.errorMessage = this.appLockModal.locator(selectByDataAttribute('label-applock-unlock-error')); + this.forgotPassphraseButton = this.appLockModal.locator(selectByDataAttribute('go-forgot-passphrase')); + this.wipeDatabaseButton = this.appLockModal.locator(selectByDataAttribute('go-wipe-database')); } async setPasscode(passcode: string) { @@ -52,6 +62,11 @@ export class AppLockModal { await this.appLockActionButton.click(); } + async inputUserPassword(password: string) { + await this.appLockWipeInput.fill(password); + await this.appLockActionButton.click(); + } + async isVisible() { await this.appLockModal.waitFor({state: 'visible'}); return await this.appLockModal.isVisible(); @@ -67,6 +82,16 @@ export class AppLockModal { } async getAppLockModalHeader() { - return (await this.appLockModalHeader.textContent()) ?? ''; + return await this.appLockModalHeader.textContent(); + } + + async clickForgotPassphrase() { + await this.forgotPassphraseButton.click(); + } + async clickReset() { + await this.appLockActionButton.click(); + } + async clickWipeDB() { + await this.wipeDatabaseButton.click(); } } diff --git a/test/e2e_tests/specs/AppLock/AppLock.spec.ts b/test/e2e_tests/specs/AppLock/AppLock.spec.ts index a8b3ef22a10..118ad6efa77 100644 --- a/test/e2e_tests/specs/AppLock/AppLock.spec.ts +++ b/test/e2e_tests/specs/AppLock/AppLock.spec.ts @@ -18,10 +18,9 @@ */ import {getUser} from 'test/e2e_tests/data/user'; -import {PageManager} from 'test/e2e_tests/pageManager'; import {completeLogin, setupBasicTestScenario} from 'test/e2e_tests/utils/setup.util'; import {tearDownAll} from 'test/e2e_tests/utils/tearDown.util'; -import {loginUser} from 'test/e2e_tests/utils/userActions'; +import {loginUser, setupAppLock} from 'test/e2e_tests/utils/userActions'; import {test, expect} from '../../test.fixtures'; @@ -39,35 +38,6 @@ test.describe('AppLock', () => { await api.brig.enableAppLock(owner.teamId); }); - const setupAppLock = async (pageManager: PageManager) => { - // add passe - - const {modals} = pageManager.webapp; - const appLock = await modals.appLock(); - // check if exists modal to set passphrase - if (await appLock.isVisible()) { - // check if is in passcode setup mode - // this is modal titile check? - if (await appLock.lockPasscodeInput.isVisible()) { - // setup code - await appLock.setPasscode(appLockPassCode); - } else { - await appLock.unlockAppWithPasscode(appLockPassCode); - } - } - }; - - const checkHistoryInfo = async (pageManager: PageManager) => { - const {modals, pages} = pageManager.webapp; - const hasLocalData = await pages.historyInfo().isButtonVisible(); - if (hasLocalData) { - await pages.historyInfo().clickConfirmButton(); - } else { - await modals.appLock().appLockModal.waitFor({state: 'visible', timeout: 60_000}); - } - await modals.dataShareConsent().clickDecline(); - }; - test( 'I want to see app lock setup modal on login after app lock has been enforced for the team', {tag: ['@TC-2744', '@TC-2740', '@regression']}, @@ -106,9 +76,7 @@ test.describe('AppLock', () => { 'Web: App should not lock if I switch back to webapp tab in time (during inactivity timeout)', {tag: ['@TC-2753', '@regression']}, async ({pageManager}) => { - await pageManager.openMainPage(); - - await loginUser(memberA, pageManager); + await completeLogin(pageManager, memberA); // open new tab and wait // boost the browser time? // open back the correct tab @@ -116,66 +84,44 @@ test.describe('AppLock', () => { ); test( - 'Web: I want the app to automatically lock after refreshing the page', - {tag: ['@TC-2754', '@regression']}, + 'Web: I want to unlock the app with passphrase after login', + {tag: ['@TC-2754', '@TC-2755', '@TC-2758', '@TC-2763', '@regression']}, async ({pageManager}) => { await pageManager.openMainPage(); const {modals} = pageManager.webapp; await pageManager.openMainPage(); - await loginUser(memberA, pageManager); - - await checkHistoryInfo(pageManager); + await completeLogin(pageManager, memberA); // wait for data share consent - await setupAppLock(pageManager); - await pageManager.refreshPage(); - await pageManager.waitForTimeout(5_000); - expect(await modals.appLock().isVisible()).toBeTruthy(); - }, - ); - test( - 'Web: I want to unlock the app with passphrase after login', - {tag: ['@TC-2755', '@regression']}, - async ({pageManager}) => { - await pageManager.openMainPage(); + await test.step('Web: I want the app to automatically lock after refreshing the page', async () => { + await setupAppLock(pageManager, appLockPassCode); + await pageManager.refreshPage(); - await loginUser(memberA, pageManager); - - // setup - await setupAppLock(pageManager); - // logout - // login - // input - }, - ); - - test( - 'Web: I should not be able to unlock the app with wrong passphrase', - {tag: ['@TC-2758', '@regression']}, - async ({pageManager}) => { - await pageManager.openMainPage(); - - await loginUser(memberA, pageManager); + expect(await modals.appLock().isVisible()).toBeTruthy(); + }); - // reload the app - // check lock modal - }, - ); + await test.step('Web: I should not be able to unlock the app with wrong passphrase', async () => { + await setupAppLock(pageManager, 'wrongCredentials'); + await expect(modals.appLock().errorMessage).toHaveText('Wrong passcode'); + }); - test( - 'I want to wipe database when I forgot my app lock passphrase', - {tag: ['@TC-2761', '@regression']}, - async ({pageManager}) => { - await pageManager.openMainPage(); + await test.step('Web: I should not be able to wipe database with wrong account password', async () => { + await modals.appLock().clickForgotPassphrase(); + await pageManager.waitForTimeout(1000); + await modals.appLock().clickWipeDB(); + await modals.appLock().clickReset(); - await loginUser(memberA, pageManager); + await pageManager.waitForTimeout(20_000); + // task: check if on start page + await expect(modals.appLock().errorMessage).toHaveText('Wrong passcode'); + }); - // reload the app - // check lock modal - // click forget password in the modal? - // check if in browser the db is cleared? + await test.step('I want to wipe database when I forgot my app lock passphrase', async () => { + await modals.appLock().inputUserPassword(memberA.password); + await pageManager.waitForTimeout(50_000); + }); }, ); @@ -218,9 +164,7 @@ test.describe('AppLock', () => { await loginUser(memberA, pageManager); // reload the app - // check lock modal - // click forget password in the modal? - // check if in browser the db is cleared? + // go to settings try to disable the app lock }, ); diff --git a/test/e2e_tests/utils/userActions.ts b/test/e2e_tests/utils/userActions.ts index e0776165f08..8643738005d 100644 --- a/test/e2e_tests/utils/userActions.ts +++ b/test/e2e_tests/utils/userActions.ts @@ -91,3 +91,15 @@ export const createGroup = async (pageManager: PageManager, conversationName: st await pageManager.webapp.pages.startUI().selectUsers(user.flatMap(user => user.username)); await pageManager.webapp.pages.groupCreation().clickCreateGroupButton(); }; + +export const setupAppLock = async (pageManager: PageManager, appLockPassCode: string) => { + const {modals} = pageManager.webapp; + const appLockModal = await modals.appLock(); + if (await appLockModal.isVisible()) { + if (await appLockModal.lockPasscodeInput.isVisible()) { + await appLockModal.setPasscode(appLockPassCode); + } else { + await appLockModal.unlockAppWithPasscode(appLockPassCode); + } + } +}; From 582f1dd6c986a81108a0c30879abaee29acb5fd2 Mon Sep 17 00:00:00 2001 From: Klaus Boldt Date: Thu, 9 Oct 2025 18:44:17 +0200 Subject: [PATCH 5/7] finish tests --- test/e2e_tests/backend/brigRepository.e2e.ts | 6 +- .../webapp/modals/dataShareConsent.modal.ts | 2 +- .../pageManager/webapp/pages/account.page.ts | 6 +- test/e2e_tests/specs/AppLock/AppLock.spec.ts | 144 +++++++----------- test/e2e_tests/utils/indexedDB.util.ts | 48 ++++++ test/e2e_tests/utils/setup.util.ts | 6 +- test/e2e_tests/utils/userActions.ts | 2 +- 7 files changed, 119 insertions(+), 95 deletions(-) create mode 100644 test/e2e_tests/utils/indexedDB.util.ts diff --git a/test/e2e_tests/backend/brigRepository.e2e.ts b/test/e2e_tests/backend/brigRepository.e2e.ts index 67d293bec17..8444f6568e5 100644 --- a/test/e2e_tests/backend/brigRepository.e2e.ts +++ b/test/e2e_tests/backend/brigRepository.e2e.ts @@ -156,13 +156,13 @@ export class BrigRepositoryE2E { ); } - public async enableAppLock(teamId: string) { + public async toggleAppLock(teamId: string, status: 'enabled' | 'disabled', enforceAppLock: boolean = true) { await this.axiosInstance.patch( `i/teams/${teamId}/features/appLock`, { - status: 'enabled', + status: status, config: { - enforceAppLock: true, + enforceAppLock: enforceAppLock, inactivityTimeoutSecs: 30, }, }, diff --git a/test/e2e_tests/pageManager/webapp/modals/dataShareConsent.modal.ts b/test/e2e_tests/pageManager/webapp/modals/dataShareConsent.modal.ts index bf959f47878..d0d137024f3 100644 --- a/test/e2e_tests/pageManager/webapp/modals/dataShareConsent.modal.ts +++ b/test/e2e_tests/pageManager/webapp/modals/dataShareConsent.modal.ts @@ -43,7 +43,7 @@ export class DataShareConsentModal { } async isModalPresent() { - return this.modal.isVisible(); + return this.modalTitle.isVisible(); } async getModalTitle() { diff --git a/test/e2e_tests/pageManager/webapp/pages/account.page.ts b/test/e2e_tests/pageManager/webapp/pages/account.page.ts index 316588a1276..3b91dd8215b 100644 --- a/test/e2e_tests/pageManager/webapp/pages/account.page.ts +++ b/test/e2e_tests/pageManager/webapp/pages/account.page.ts @@ -25,6 +25,7 @@ export class AccountPage { readonly page: Page; readonly sendUsageDataCheckbox: Locator; + readonly appLockCheckboxLabel: Locator; readonly appLockCheckbox: Locator; readonly deleteAccountButton: Locator; readonly backUpButton: Locator; @@ -42,7 +43,8 @@ export class AccountPage { this.page = page; this.sendUsageDataCheckbox = page.locator("[data-uie-name='status-preference-telemetry']+label"); - this.appLockCheckbox = page.locator("[data-uie-name='status-preference-applock']+label"); + this.appLockCheckboxLabel = page.locator("[data-uie-name='status-preference-applock']+label"); + this.appLockCheckbox = page.locator("[data-uie-name='status-preference-applock']"); this.deleteAccountButton = page.locator(selectByDataAttribute('go-delete-account')); this.backUpButton = page.locator(selectByDataAttribute('do-backup-export')); this.backupFileInput = page.locator(selectByDataAttribute('input-import-file')); @@ -89,7 +91,7 @@ export class AccountPage { } async toggleAppLock() { - await this.appLockCheckbox.click(); + await this.appLockCheckboxLabel.click(); } async clickLogoutButton() { diff --git a/test/e2e_tests/specs/AppLock/AppLock.spec.ts b/test/e2e_tests/specs/AppLock/AppLock.spec.ts index 118ad6efa77..d6fda98611f 100644 --- a/test/e2e_tests/specs/AppLock/AppLock.spec.ts +++ b/test/e2e_tests/specs/AppLock/AppLock.spec.ts @@ -18,9 +18,10 @@ */ import {getUser} from 'test/e2e_tests/data/user'; +import {checkAnyIndexedDBExists} from 'test/e2e_tests/utils/indexedDB.util'; import {completeLogin, setupBasicTestScenario} from 'test/e2e_tests/utils/setup.util'; import {tearDownAll} from 'test/e2e_tests/utils/tearDown.util'; -import {loginUser, setupAppLock} from 'test/e2e_tests/utils/userActions'; +import {handleAppLockState} from 'test/e2e_tests/utils/userActions'; import {test, expect} from '../../test.fixtures'; @@ -32,10 +33,11 @@ test.describe('AppLock', () => { const [memberA] = members; const teamName = 'AppLock'; const appLockPassCode = '1a3!567N4'; + test.beforeAll(async ({api}) => { const user = await setupBasicTestScenario(api, members, owner, teamName); owner = {...owner, ...user}; - await api.brig.enableAppLock(owner.teamId); + await api.brig.toggleAppLock(owner.teamId, 'enabled', true); }); test( @@ -57,29 +59,30 @@ test.describe('AppLock', () => { }, ); - test( - 'Web: I want the app to lock when I switch back to webapp tab after inactivity timeout expired', - {tag: ['@TC-2752', '@regression']}, - async ({pageManager}) => { - await pageManager.openMainPage(); - - await loginUser(memberA, pageManager); - - // open new tab and wait - // boost the browser time? - // open back the correct tab - // unlock the app - }, - ); - test( 'Web: App should not lock if I switch back to webapp tab in time (during inactivity timeout)', - {tag: ['@TC-2753', '@regression']}, - async ({pageManager}) => { + {tag: ['@TC-2752', '@TC-2753', '@regression']}, + async ({pageManager, browser}) => { + const {modals} = pageManager.webapp; + const webappPageA = await pageManager.getPage(); + await completeLogin(pageManager, memberA); - // open new tab and wait - // boost the browser time? - // open back the correct tab + await handleAppLockState(pageManager, appLockPassCode); + const unrelatedPage = await browser.newPage(); + await unrelatedPage.goto('about:blank'); + await unrelatedPage.bringToFront(); + await unrelatedPage.waitForTimeout(2_000); // open be only 2 sec in the other tab + await webappPageA.bringToFront(); + + await expect(modals.appLock().appLockModalHeader).not.toBeVisible(); + + await test.step('Web: I want the app to lock when I switch back to webapp tab after inactivity timeout expired', async () => { + await unrelatedPage.goto('about:blank'); + await unrelatedPage.bringToFront(); + await unrelatedPage.waitForTimeout(31_000); + await webappPageA.bringToFront(); + await expect(modals.appLock().appLockModalHeader).toBeVisible(); + }); }, ); @@ -87,110 +90,81 @@ test.describe('AppLock', () => { 'Web: I want to unlock the app with passphrase after login', {tag: ['@TC-2754', '@TC-2755', '@TC-2758', '@TC-2763', '@regression']}, async ({pageManager}) => { - await pageManager.openMainPage(); - const {modals} = pageManager.webapp; + const {modals, pages} = pageManager.webapp; - await pageManager.openMainPage(); await completeLogin(pageManager, memberA); - // wait for data share consent - await test.step('Web: I want the app to automatically lock after refreshing the page', async () => { - await setupAppLock(pageManager, appLockPassCode); + await handleAppLockState(pageManager, appLockPassCode); await pageManager.refreshPage(); expect(await modals.appLock().isVisible()).toBeTruthy(); }); await test.step('Web: I should not be able to unlock the app with wrong passphrase', async () => { - await setupAppLock(pageManager, 'wrongCredentials'); + await handleAppLockState(pageManager, 'wrongCredentials'); await expect(modals.appLock().errorMessage).toHaveText('Wrong passcode'); }); await test.step('Web: I should not be able to wipe database with wrong account password', async () => { await modals.appLock().clickForgotPassphrase(); - await pageManager.waitForTimeout(1000); await modals.appLock().clickWipeDB(); await modals.appLock().clickReset(); + await modals.appLock().inputUserPassword('wrong password'); - await pageManager.waitForTimeout(20_000); - // task: check if on start page - await expect(modals.appLock().errorMessage).toHaveText('Wrong passcode'); + expect(await checkAnyIndexedDBExists(await pageManager.getPage())).toBeTruthy(); }); await test.step('I want to wipe database when I forgot my app lock passphrase', async () => { await modals.appLock().inputUserPassword(memberA.password); - await pageManager.waitForTimeout(50_000); - }); - }, - ); - - test( - 'Web: I should not be able to wipe database with wrong account password', - {tag: ['@TC-2763', '@regression']}, - async ({pageManager}) => { - await pageManager.openMainPage(); - - await loginUser(memberA, pageManager); - // reload the app - // check lock modal - // click forget password in the modal? - // check if in browser the db is cleared? + await expect(pages.singleSignOn().ssoCodeEmailInput).toBeVisible(); + expect(await checkAnyIndexedDBExists(await pageManager.getPage())).toBeFalsy(); + }); }, ); test( - 'Web: Verify inactivity timeout set on a team level applies to team member accounts', - {tag: ['@TC-2767', '@regression']}, + 'I should not be able to switch off app lock if it is enforced for the team', + {tag: ['@TC-2770', '@TC-2767', '@regression']}, async ({pageManager}) => { - await pageManager.openMainPage(); + const {components, pages} = pageManager.webapp; + await completeLogin(pageManager, memberA); + await handleAppLockState(pageManager, appLockPassCode); + await components.conversationSidebar().clickPreferencesButton(); + const page = await pageManager.getPage(); - await loginUser(memberA, pageManager); + await expect(pages.account().appLockCheckbox).toBeDisabled(); + // check here string - // reload the app - // check lock modal - // click forget password in the modal? - // check if in browser the db is cleared? + await expect( + page.getByText('Lock Wire after 30 seconds in the background. Unlock with Touch ID or enter your passcode.'), + ).toHaveCount(1); }, ); - test( - 'I should not be able to switch off app lock if it is enforced for the team 0', - {tag: ['@TC-2770', '@regression']}, - async ({pageManager}) => { - await pageManager.openMainPage(); + test('I want to switch off app lock', {tag: ['@TC-2771', '@TC-2772', '@regression']}, async ({pageManager, api}) => { + await api.brig.toggleAppLock(owner.teamId, 'enabled', false); - await loginUser(memberA, pageManager); + const {components, pages, modals} = pageManager.webapp; - // reload the app - // go to settings try to disable the app lock - }, - ); + await completeLogin(pageManager, memberA); + await components.conversationSidebar().clickPreferencesButton(); + await pages.account().toggleAppLock(); + await handleAppLockState(pageManager, appLockPassCode); - test('I want to switch off app lock 0', {tag: ['@TC-2771', '@regression']}, async ({pageManager}) => { - await pageManager.openMainPage(); + await pages.account().toggleAppLock(); - await loginUser(memberA, pageManager); - - // reload the app - // check lock modal - // click forget password in the modal? - // check if in browser the db is cleared? + await modals.removeMember().clickConfirm(); + await expect(pages.account().appLockCheckbox).not.toBeChecked(); }); - test( + test.skip( 'Web: Verify inactivity timeout can be set if app lock is not enforced on a team level', {tag: ['@TC-2772', '@regression']}, - async ({pageManager}) => { - await pageManager.openMainPage(); - - await loginUser(memberA, pageManager); - - // reload the app - // check lock modal - // click forget password in the modal? - // check if in browser the db is cleared? + async ({pageManager, api}) => { + await completeLogin(pageManager, memberA); + // ? }, ); diff --git a/test/e2e_tests/utils/indexedDB.util.ts b/test/e2e_tests/utils/indexedDB.util.ts new file mode 100644 index 00000000000..9c9c1c73f12 --- /dev/null +++ b/test/e2e_tests/utils/indexedDB.util.ts @@ -0,0 +1,48 @@ +/* + * Wire + * Copyright (C) 2025 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + * + */ + +import {Page} from '@playwright/test'; +/** + * Checks if ANY IndexedDB databases exist in the current browser context. + * This is used when database names are randomly generated (e.g., UUIDs). + * * @param page The Playwright Page object. + * @returns A Promise that resolves to true if ONE or MORE DBs exist, otherwise false. + */ +export const checkAnyIndexedDBExists = async (page: Page): Promise => { + // The logic is executed directly inside the browser environment + return page.evaluate(async () => { + // Fallback for older browsers (though unlikely in modern Playwright tests) + if (!indexedDB.databases) { + console.error('Browser does not support indexedDB.databases(). Cannot check for existence.'); + return false; + } + + try { + // Retrieve a list of all existing databases for the current origin + const dbs = await indexedDB.databases(); + + // Return true if the list of databases is not empty + return dbs.length > 0; + } catch (error) { + // Handle potential errors (e.g., security restrictions) + console.error('Error retrieving IndexedDB list:', error); + return false; + } + }); +}; diff --git a/test/e2e_tests/utils/setup.util.ts b/test/e2e_tests/utils/setup.util.ts index a6c615c71ec..d43e5f1aedd 100644 --- a/test/e2e_tests/utils/setup.util.ts +++ b/test/e2e_tests/utils/setup.util.ts @@ -44,12 +44,12 @@ export const completeLogin = async (pageManager: PageManager, user: User) => { await pageManager.openMainPage(); await loginUser(user, pageManager); - const hasLocalData = await pages.historyInfo().isButtonVisible(); - if (hasLocalData) { + if (await pages.historyInfo().isButtonVisible()) { await pages.historyInfo().clickConfirmButton(); } await components.conversationSidebar().isPageLoaded(); - if (!hasLocalData) { + + if (await modals.dataShareConsent().isModalPresent()) { await modals.dataShareConsent().clickDecline(); } }; diff --git a/test/e2e_tests/utils/userActions.ts b/test/e2e_tests/utils/userActions.ts index 8643738005d..b9769f19ee1 100644 --- a/test/e2e_tests/utils/userActions.ts +++ b/test/e2e_tests/utils/userActions.ts @@ -92,7 +92,7 @@ export const createGroup = async (pageManager: PageManager, conversationName: st await pageManager.webapp.pages.groupCreation().clickCreateGroupButton(); }; -export const setupAppLock = async (pageManager: PageManager, appLockPassCode: string) => { +export const handleAppLockState = async (pageManager: PageManager, appLockPassCode: string) => { const {modals} = pageManager.webapp; const appLockModal = await modals.appLock(); if (await appLockModal.isVisible()) { From 800a9c7e0b7dee788563a880e8cae09a57e5532f Mon Sep 17 00:00:00 2001 From: Klaus Boldt Date: Tue, 14 Oct 2025 18:19:26 +0200 Subject: [PATCH 6/7] add comment --- test/e2e_tests/specs/AppLock/AppLock.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e_tests/specs/AppLock/AppLock.spec.ts b/test/e2e_tests/specs/AppLock/AppLock.spec.ts index d6fda98611f..ab89a9220c9 100644 --- a/test/e2e_tests/specs/AppLock/AppLock.spec.ts +++ b/test/e2e_tests/specs/AppLock/AppLock.spec.ts @@ -164,7 +164,7 @@ test.describe('AppLock', () => { {tag: ['@TC-2772', '@regression']}, async ({pageManager, api}) => { await completeLogin(pageManager, memberA); - // ? + // not implemented }, ); From f47b71bb1ff28661b6bcd7bb4cd739e31e9b2822 Mon Sep 17 00:00:00 2001 From: Klaus Boldt Date: Tue, 21 Oct 2025 16:35:52 +0200 Subject: [PATCH 7/7] fix import --- test/e2e_tests/specs/ArchiveSpecs/archive.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/e2e_tests/specs/ArchiveSpecs/archive.spec.ts b/test/e2e_tests/specs/ArchiveSpecs/archive.spec.ts index 506580ab92d..f890921575d 100644 --- a/test/e2e_tests/specs/ArchiveSpecs/archive.spec.ts +++ b/test/e2e_tests/specs/ArchiveSpecs/archive.spec.ts @@ -19,7 +19,7 @@ import {getUser} from 'test/e2e_tests/data/user'; import {PageManager} from 'test/e2e_tests/pageManager'; -import {setupBasicTestScenario, startUpApp} from 'test/e2e_tests/utils/setup.util'; +import {setupBasicTestScenario, completeLogin} from 'test/e2e_tests/utils/setup.util'; import {tearDownAll} from 'test/e2e_tests/utils/tearDown.util'; import {createGroup} from 'test/e2e_tests/utils/userActions'; @@ -43,7 +43,7 @@ test.describe('Accessibility', () => { {tag: ['@TC-97', '@regression']}, async ({pageManager}) => { const {components, modals, pages} = pageManager.webapp; - await startUpApp(pageManager, memberA); + await completeLogin(pageManager, memberA); await components.conversationSidebar().clickConnectButton(); await components.contactList().clickOnContact(memberB.fullName); @@ -73,7 +73,7 @@ test.describe('Accessibility', () => { const {components, modals, pages} = pageManagerA.webapp; const {pages: pagesB, components: componentsB, modals: modalsB} = memberPageManagerB.webapp; - await Promise.all([startUpApp(pageManagerA, memberA), startUpApp(memberPageManagerB, memberB)]); + await Promise.all([completeLogin(pageManagerA, memberA), completeLogin(memberPageManagerB, memberB)]); try { await modalsB.acknowledge().modal.waitFor({state: 'visible', timeout: 2500}); if (await modalsB.acknowledge().isModalPresent()) { @@ -111,7 +111,7 @@ test.describe('Accessibility', () => { async ({pageManager}) => { const groupName = 'test'; const {components, pages} = pageManager.webapp; - await startUpApp(pageManager, memberA); + await completeLogin(pageManager, memberA); await createGroup(pageManager, groupName, [memberB]); await pages.conversation().clickConversationInfoButton(); await pages.conversationDetails().clickArchiveButton(); @@ -130,7 +130,7 @@ test.describe('Accessibility', () => { {tag: ['@TC-105', '@regression']}, async ({pageManager}) => { const {components, modals, pages} = pageManager.webapp; - await startUpApp(pageManager, memberA); + await completeLogin(pageManager, memberA); await components.conversationSidebar().clickConnectButton(); await components.contactList().clickOnContact(memberB.fullName);