From a580f1c62cc6ba1f2d22ad51cd5d7bcb1916570b Mon Sep 17 00:00:00 2001 From: Lukas Hirt Date: Tue, 23 Jun 2026 13:14:12 +0200 Subject: [PATCH] test(group-management): [OCISDEV-995] wait for OIDC callback before navigating in e2e After the logon response arrives the browser still follows an in-flight redirect to /web-oidc-callback (or /oidc-callback.html). Calling page.goto('/group-management') before that redirect settles races against it and causes an intermittent 'navigation interrupted' failure. Fix loginAsUser() in authHelper.ts to wait for the My Account button to appear (confirming the OIDC flow is fully complete) before returning. Refactor groupManagement.spec.ts to use loginAsUser/logout from authHelper.ts instead of inlining the login sequence, so the fix lives in one place. Signed-off-by: Lukas Hirt --- .../tests/e2e/groupManagement.spec.ts | 21 +++---------------- support/helpers/authHelper.ts | 3 +++ 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/packages/web-app-group-management/tests/e2e/groupManagement.spec.ts b/packages/web-app-group-management/tests/e2e/groupManagement.spec.ts index 4814c4e4d..2e0aff57f 100644 --- a/packages/web-app-group-management/tests/e2e/groupManagement.spec.ts +++ b/packages/web-app-group-management/tests/e2e/groupManagement.spec.ts @@ -1,6 +1,5 @@ import { test, type Page, type APIRequestContext, expect } from '@playwright/test' -import { createContext, closeContext } from '../../../../support/helpers/actorHelper' -import { LoginPage } from '../../../../support/pages/loginPage' +import { loginAsUser, logout } from '../../../../support/helpers/authHelper' import { GroupManagementPage } from '../../../../support/pages/groupManagementPage' const TEST_GROUP = 'e2e group management' @@ -28,28 +27,14 @@ async function deleteTestGroup(request: APIRequestContext): Promise { test.describe('Group Management', () => { test.beforeEach(async ({ browser, request }) => { - const { page } = await createContext(browser) - const loginPage = new LoginPage(page) - await page.goto('/') - await Promise.all([ - page.waitForResponse( - (resp) => - resp.url().endsWith('logon') && - resp.status() === 200 && - resp.request().method() === 'POST' - ), - loginPage.login('admin', 'admin') - ]) + const { page } = await loginAsUser(browser, 'admin', 'admin') adminPage = page await deleteTestGroup(request) }) test.afterEach(async ({ request }) => { await deleteTestGroup(request) - const context = adminPage.context() - const loginPage = new LoginPage(adminPage) - await loginPage.logout() - await closeContext(context) + await logout(adminPage) }) test('renders the group management app', async () => { diff --git a/support/helpers/authHelper.ts b/support/helpers/authHelper.ts index 80103440f..4910348ff 100644 --- a/support/helpers/authHelper.ts +++ b/support/helpers/authHelper.ts @@ -18,6 +18,9 @@ export async function loginAsUser( ), loginPage.login(username, password) ]) + // Wait for the OIDC callback to fully complete so callers can safely call + // page.goto() without racing against the in-flight redirect. + await loginPage.myAccount.waitFor({ state: 'visible', timeout: 30000 }) return { page } }