a466053000
- apps/e2e/tests/login.spec.ts: 8 tests for DevLoginSelector page - renders staff and clients sections - shows loading state - displays staff with role/email, clients with pet count - clicking staff navigates to /admin with dev-user stored - clicking client navigates to / with dev-user stored - skip login removes dev-user and navigates to /admin - handles empty users response - apps/e2e/tests/impersonation.spec.ts: 8 tests for ImpersonationBanner - banner displays when session is active - shows reason and started time - End Session and Audit buttons visible - clicking End Session calls API and hides banner - Extend button appears when time < 5 mins and not extended - URL is cleaned when session ends - apps/e2e/tests/fixtures.ts: added /api/dev/users mock for login tests
69 lines
2.9 KiB
TypeScript
69 lines
2.9 KiB
TypeScript
import { test, expect } from "./fixtures.js";
|
|
|
|
/**
|
|
* E2E tests for the DevLoginSelector page (/login).
|
|
* Tests staff/client selection, skip login, and navigation redirects.
|
|
*/
|
|
|
|
test.describe("DevLoginSelector", () => {
|
|
test("renders login page with staff and clients sections", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await expect(page.getByText("Dev Login Selector")).toBeVisible();
|
|
await expect(page.getByText("Staff")).toBeVisible();
|
|
await expect(page.getByText("Clients")).toBeVisible();
|
|
});
|
|
|
|
test("shows loading state while fetching users", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await expect(page.getByText("Loading users...")).toBeVisible();
|
|
});
|
|
|
|
test("displays staff users with role and email", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await expect(page.getByText("Alice Groomer")).toBeVisible();
|
|
await expect(page.getByText("groomer · alice@groombook.dev")).toBeVisible();
|
|
await expect(page.getByText("Bob Manager")).toBeVisible();
|
|
await expect(page.getByText("manager · bob@groombook.dev")).toBeVisible();
|
|
});
|
|
|
|
test("displays client users with pet count", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await expect(page.getByText("Carol Client")).toBeVisible();
|
|
await expect(page.getByText("2 pets · carol@example.com")).toBeVisible();
|
|
await expect(page.getByText("Dave Client")).toBeVisible();
|
|
await expect(page.getByText("1 pet")).toBeVisible();
|
|
});
|
|
|
|
test("clicking staff user navigates to /admin and stores dev-user", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await page.getByText("Alice Groomer").click();
|
|
await expect(page).toHaveURL("/admin");
|
|
const devUser = await page.evaluate(() => localStorage.getItem("dev-user"));
|
|
expect(JSON.parse(devUser!)).toMatchObject({ type: "staff", id: "staff-1", name: "Alice Groomer" });
|
|
});
|
|
|
|
test("clicking client user navigates to / and stores dev-user", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await page.getByText("Carol Client").click();
|
|
await expect(page).toHaveURL("/");
|
|
const devUser = await page.evaluate(() => localStorage.getItem("dev-user"));
|
|
expect(JSON.parse(devUser!)).toMatchObject({ type: "client", id: "client-1", name: "Carol Client" });
|
|
});
|
|
|
|
test("skip login removes dev-user and navigates to /admin", async ({ page }) => {
|
|
await page.goto("/login");
|
|
await page.getByText("Continue as default dev user").click();
|
|
await expect(page).toHaveURL("/admin");
|
|
const devUser = await page.evaluate(() => localStorage.getItem("dev-user"));
|
|
expect(devUser).toBeNull();
|
|
});
|
|
|
|
test("no users available shows empty sections", async ({ page }) => {
|
|
await page.route("**/api/dev/users", (route) =>
|
|
route.fulfill({ json: { staff: [], clients: [] } })
|
|
);
|
|
await page.goto("/login");
|
|
await expect(page.getByText("Staff")).toBeVisible();
|
|
await expect(page.getByText("Clients")).toBeVisible();
|
|
});
|
|
}); |