From 614d72856124db929872d3b250e7f6dc017493aa Mon Sep 17 00:00:00 2001 From: npeter83 Date: Sat, 3 Oct 2026 17:41:26 +0200 Subject: [PATCH] test(e2e): the nav spec opens the admin pages from their rail panel E31 put the admin pages behind one rail row ("Administration", nav-admin) that opens a panel. The spec still clicked nav-scheduler, nav-config, nav-users and nav-audit as rows of their own, and timed out on every engine. That went unseen from E31 to now because e2e ran in no required gate, the exact hole E32 closes: the first run of the new release e2e step found it. The rail test keeps the rail rows. A new test opens each admin page from the panel and checks that the group row is current and that the reopened panel marks the page. Seen red before the fix; the whole suite then passes, 52/52. --- frontend/e2e/nav.spec.ts | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/frontend/e2e/nav.spec.ts b/frontend/e2e/nav.spec.ts index 4427e1bc..5637be7d 100644 --- a/frontend/e2e/nav.spec.ts +++ b/frontend/e2e/nav.spec.ts @@ -6,18 +6,12 @@ import { openApp } from "./helpers"; // this exercises is precisely what the module-registry refactor replaces. test.describe("page switching", () => { // Core + admin modules (the E2E account is an admin, matching the real primary user), so this - // also exercises the render ternary's admin branches (scheduler / config / users / audit). - const RAIL = [ - "channels", - "playlists", - "stats", - "scheduler", - "config", - "users", - "audit", - "settings", - "feed", - ]; + // also exercises the admin pages. Since E31 those sit behind ONE rail row ("Administration", + // `nav-admin`) that opens a panel of them — the spec still listed them as rail rows of their own, + // and it failed on every run from E31 to E32 without anyone seeing it, because e2e was in no + // required gate (it is now part of `release`). + const RAIL = ["channels", "playlists", "stats", "settings", "feed"]; + const ADMIN = ["scheduler", "config", "users", "audit"]; test("each rail item activates its page", async ({ page }) => { await openApp(page); @@ -27,6 +21,22 @@ test.describe("page switching", () => { } }); + test("each admin page opens from the Administration panel and marks it current", async ({ + page, + }) => { + await openApp(page); + for (const id of ADMIN) { + await page.getByTestId("nav-admin").click(); + await page.getByTestId(`nav-admin-${id}`).click(); + // The panel closes on a pick; the group row carries the current page… + await expect(page.getByTestId("nav-admin")).toHaveAttribute("aria-current", "page"); + // …and, reopened, the panel marks which one. + await page.getByTestId("nav-admin").click(); + await expect(page.getByTestId(`nav-admin-${id}`)).toHaveAttribute("aria-current", "page"); + await page.keyboard.press("Escape"); + } + }); + test("browser Back steps through visited pages", async ({ page }) => { await openApp(page);