This repository has been archived on 2026-05-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
app/apps/e2e/tests/login.spec.ts
T
Flea Flicker cd5feb1a14 fix(gro-56): guard dev login page behind import.meta.env.DEV
The DevLoginSelector page (including the "Continue as default dev user"
button) was rendering in production when AUTH_DISABLED=true. This guards
the /login route so the page only renders in Vite development mode
(import.meta.env.DEV). Also removes the skip-login button entirely since
it bypassed user selection without any identity assertion.

- Guard /login route with import.meta.env.DEV in App.tsx
- Remove skipLogin button from DevLoginSelector.tsx
- Add vite/client types to web tsconfig
- Remove corresponding e2e test

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-27 01:10:34 +00:00

67 lines
2.8 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.unroute("**/api/dev/users");
await page.route("**/api/dev/users", async (route) => {
await new Promise((r) => setTimeout(r, 200));
await route.fulfill({ json: { staff: [], clients: [] } });
});
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("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();
});
});