// apps/web/e2e/fixtures/auth.fixture.ts import { test as base, type Page } from '@playwright/test'; import { ApiClient } from './api-client'; const API_BASE = process.env.E2E_API_URL || 'http://localhost:3000/api/v1'; type E2eFixtures = { api: ApiClient; authenticatedPage: Page; }; let loginPromise: Promise<{ access_token: string; refresh_token: string; user: object }> | null = null; function login() { if (!loginPromise) { loginPromise = (async () => { for (let attempt = 0; attempt < 3; attempt++) { try { const res = await fetch(`${API_BASE}/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: process.env.E2E_ADMIN_USER || 'admin', password: process.env.E2E_ADMIN_PASS || 'Admin@2026', }), }); const json = await res.json(); if (json.success) return json.data; } catch { /* retry */ } await new Promise((r) => setTimeout(r, 500 * (attempt + 1))); } throw new Error('Login failed after 3 attempts'); })(); } return loginPromise; } export const test = base.extend({ api: async ({}, use) => { const client = new ApiClient(); await client.loginAsAdmin(); await use(client); }, authenticatedPage: async ({ page }, use) => { const { access_token, refresh_token, user } = await login(); await page.addInitScript((args) => { localStorage.setItem('access_token', args.token); localStorage.setItem('refresh_token', args.refresh); localStorage.setItem('user', JSON.stringify(args.userData)); }, { token: access_token, refresh: refresh_token, userData: user }); await use(page); }, page: async ({ page }, use) => { const { access_token, refresh_token, user } = await login(); await page.addInitScript((args) => { localStorage.setItem('access_token', args.token); localStorage.setItem('refresh_token', args.refresh); localStorage.setItem('user', JSON.stringify(args.userData)); }, { token: access_token, refresh: refresh_token, userData: user }); await use(page); }, }); export { expect } from '@playwright/test';