/** * Playwright auth helpers: log in via the API once per role, hydrate * localStorage so subsequent page.goto() lands inside the SPA already * authenticated. * * Avoids the per-test cost of driving the LoginPage form just to land on * /engagements. The actual UI login flow IS exercised in us2-login.spec.ts. */ import { type BrowserContext, type Page } from '@playwright/test'; import { BASE, login, type Role, type User } from './api'; export interface Session { token: string; user: User; } /** * Inject token into localStorage so the SPA's bootstrap hook picks it up * as if the user had already logged in. The frontend stores the JWT under * `mimic.token` (see frontend/src/api/client.ts). */ export async function seedTokenInStorage( context: BrowserContext, token: string, ): Promise { await context.addInitScript((t) => { try { window.localStorage.setItem('mimic.token', t); } catch { /* storage might not exist on about:blank — harmless */ } }, token); } export async function clearAuthStorage(context: BrowserContext): Promise { await context.addInitScript(() => { try { window.localStorage.removeItem('mimic.token'); } catch { /* noop */ } }); } /** * Log in as the given role and return both the API session and a helper * that prepares a Page with the auth token already seeded. */ export async function loginAs( context: BrowserContext, username: string, password: string, ): Promise { const session = await login(username, password); await seedTokenInStorage(context, session.token); return session; } /** * Convenience: navigate to a path on a page that's already had its * context seeded with a token. */ export async function gotoApp(page: Page, path = '/engagements'): Promise { await page.goto(`${BASE}${path}`); } export type { Role };