diff --git a/apps/e2e/tests/impersonation.spec.ts b/apps/e2e/tests/impersonation.spec.ts index cf2dd62..63801b2 100644 --- a/apps/e2e/tests/impersonation.spec.ts +++ b/apps/e2e/tests/impersonation.spec.ts @@ -19,48 +19,48 @@ const MOCK_SESSION = { test.describe("ImpersonationBanner", () => { test.beforeEach(async ({ page }) => { - await page.route("**/api/impersonation/session", (route) => + await page.route("**/api/impersonation/sessions/session-1", (route) => route.fulfill({ json: MOCK_SESSION }) ); - await page.route("**/api/impersonation/session/end", (route) => + await page.route("**/api/impersonation/sessions/session-1/end", (route) => route.fulfill({ json: { status: "ended" } }) ); - await page.route("**/api/impersonation/session/extend", (route) => + await page.route("**/api/impersonation/sessions/session-1/extend", (route) => route.fulfill({ json: { ...MOCK_SESSION, expiresAt: new Date(Date.now() + 60 * 60 * 1000).toISOString() } }) ); - await page.route("**/api/impersonation/audit/**", (route) => + await page.route("**/api/impersonation/sessions/session-1/audit-log", (route) => route.fulfill({ json: { logs: [] } }) ); }); test("banner displays when session is active", async ({ page }) => { - await page.goto("/"); - await expect(page.locator(".bg-amber-500")).toBeVisible(); + await page.goto("/?sessionId=session-1"); + await expect(page.locator("[data-testid=\"impersonation-banner\"]")).toBeVisible(); await expect(page.getByText("STAFF VIEW")).toBeVisible(); }); test("banner shows reason when session has reason", async ({ page }) => { - await page.goto("/"); + await page.goto("/?sessionId=session-1"); await expect(page.getByText(/Reason: Testing customer booking flow/)).toBeVisible(); }); test("banner shows started time", async ({ page }) => { - await page.goto("/"); - await expect(page.getByText(/Started \d{1,2}:\d{2}/)).toBeVisible(); + await page.goto("/?sessionId=session-1"); + await expect(page.getByText(/Started/)).toBeVisible(); }); test("End Session button is visible", async ({ page }) => { - await page.goto("/"); + await page.goto("/?sessionId=session-1"); await expect(page.getByRole("button", { name: /End Session/ })).toBeVisible(); }); test("Audit button is visible", async ({ page }) => { - await page.goto("/"); + await page.goto("/?sessionId=session-1"); await expect(page.getByRole("button", { name: /Audit/ })).toBeVisible(); }); test("clicking End Session calls API and redirects", async ({ page }) => { - await page.goto("/"); + await page.goto("/?sessionId=session-1"); await page.getByRole("button", { name: /End Session/ }).click(); await expect(page.getByText("STAFF VIEW")).not.toBeVisible(); }); @@ -70,17 +70,16 @@ test.describe("ImpersonationBanner", () => { ...MOCK_SESSION, expiresAt: new Date(Date.now() + 3 * 60 * 1000).toISOString(), }; - await page.route("**/api/impersonation/session", (route) => + await page.route("**/api/impersonation/sessions/session-1", (route) => route.fulfill({ json: lowTimeSession }) ); - await page.goto("/"); - await page.waitForTimeout(1100); + await page.goto("/?sessionId=session-1"); await expect(page.getByRole("button", { name: /Extend/ })).toBeVisible(); }); test("URL is cleaned when session ends", async ({ page }) => { - await page.goto("/?impersonation=session-1"); + await page.goto("/?sessionId=session-1"); await page.getByRole("button", { name: /End Session/ }).click(); - await expect(page).not.toHaveURL(/impersonation=session-1/); + await expect(page).not.toHaveURL(/sessionId=session-1/); }); -}); \ No newline at end of file +}); diff --git a/apps/e2e/tests/login.spec.ts b/apps/e2e/tests/login.spec.ts index e4e3a9d..4c826c7 100644 --- a/apps/e2e/tests/login.spec.ts +++ b/apps/e2e/tests/login.spec.ts @@ -14,6 +14,11 @@ test.describe("DevLoginSelector", () => { }); test("shows loading state while fetching users", async ({ page }) => { + await page.route("**/api/dev/users", async (route) => { + await page.waitForResponse((res) => res.url().includes("/api/dev/users")); + await new Promise((r) => setTimeout(r, 100)); + await route.fulfill({ json: { staff: [], clients: [] } }); + }); await page.goto("/login"); await expect(page.getByText("Loading users...")).toBeVisible(); }); @@ -66,4 +71,4 @@ test.describe("DevLoginSelector", () => { await expect(page.getByText("Staff")).toBeVisible(); await expect(page.getByText("Clients")).toBeVisible(); }); -}); \ No newline at end of file +}); diff --git a/apps/web/src/portal/ImpersonationBanner.tsx b/apps/web/src/portal/ImpersonationBanner.tsx index a019330..65259a0 100644 --- a/apps/web/src/portal/ImpersonationBanner.tsx +++ b/apps/web/src/portal/ImpersonationBanner.tsx @@ -35,7 +35,7 @@ export function ImpersonationBanner({ session, isExtended, onEnd, onExtend, onSh }, [session.expiresAt, onEnd]); return ( -