import type { Page } from '@playwright/test'; export const TEST_USER = { email: process.env['E2E_USER_EMAIL'] ?? 'e2e@example.com', password: process.env['E2E_USER_PASSWORD'] ?? 'password123', name: 'E2E Test User', }; export const ADMIN_USER = { email: process.env['E2E_ADMIN_EMAIL'] ?? 'admin@example.com', password: process.env['E2E_ADMIN_PASSWORD'] ?? 'adminpass123', name: 'E2E Admin User', }; /** * Set when the database was seeded by global-setup (CI sets it in the * publish.yml e2e step). Seeded credentials MUST work, so login failures are * hard failures and the skip-when-login-fails guards are disabled — otherwise * a login regression would skip every authenticated suite and the gate would * pass while proving nothing. Unset (a live environment used as a test * target), the guards stay on and unseeded credentials skip their suites. */ export const REQUIRE_SEEDED_AUTH = process.env['E2E_REQUIRE_SEEDED_AUTH'] === '1'; /** * Fill the login form and submit, then wait for the post-login redirect to * /chat. Under REQUIRE_SEEDED_AUTH a missed redirect throws (failing the * test). Otherwise the timeout is swallowed: the page stays on /login and the * callers' `test.skip(...)` guards see that. Without this wait, every guard * read page.url() before the redirect happened and skipped its suite even * when login succeeded (#1445). */ export async function loginAs(page: Page, email: string, password: string): Promise { await page.goto('/login'); await page.getByLabel('Email').fill(email); await page.getByLabel('Password').fill(password); await page.getByRole('button', { name: /sign in/i }).click(); const redirect = page.waitForURL(/\/chat/, { timeout: 10_000 }); await (REQUIRE_SEEDED_AUTH ? redirect : redirect.catch(() => {})); }