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.
53 lines
2.4 KiB
TypeScript
53 lines
2.4 KiB
TypeScript
import { test, expect } from "@playwright/test";
|
|
import { openApp } from "./helpers";
|
|
|
|
// Locks top-level navigation: each rail item activates its page (aria-current), and browser
|
|
// Back steps through the history the app pushes. The render ternary + prop-drilled page state
|
|
// 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 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);
|
|
for (const id of RAIL) {
|
|
await page.getByTestId(`nav-${id}`).click();
|
|
await expect(page.getByTestId(`nav-${id}`)).toHaveAttribute("aria-current", "page");
|
|
}
|
|
});
|
|
|
|
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);
|
|
|
|
await page.getByTestId("nav-channels").click();
|
|
await expect(page.getByTestId("nav-channels")).toHaveAttribute("aria-current", "page");
|
|
|
|
await page.getByTestId("nav-playlists").click();
|
|
await expect(page.getByTestId("nav-playlists")).toHaveAttribute("aria-current", "page");
|
|
|
|
await page.goBack();
|
|
await expect(page.getByTestId("nav-channels")).toHaveAttribute("aria-current", "page");
|
|
});
|
|
});
|