import { type APIRequestContext, type Page } from "@playwright/test"; export const BASE_URL = process.env.E2E_BASE_URL ?? "http://localhost:3000"; let ownerEmail = process.env.E2E_OWNER_EMAIL ?? ""; let ownerPassword = process.env.E2E_OWNER_PASSWORD ?? ""; /** Ensures an owner account exists and returns its credentials, bootstrapping the instance if needed. */ export async function ensureOwner(request: APIRequestContext): Promise<{ email: string; password: string }> { if (ownerEmail && ownerPassword) return { email: ownerEmail, password: ownerPassword }; const status = await request.get(`${BASE_URL}/auth/bootstrap-status`); const body = await status.json(); if (!body.needs_setup) { throw new Error( "Instance is already bootstrapped and E2E_OWNER_EMAIL/E2E_OWNER_PASSWORD were not set - " + "cannot create the owner account this suite needs to provision fresh members per test.", ); } ownerEmail = `e2e-owner-${Date.now()}@vantage.test`; ownerPassword = "correct horse battery staple 1"; const res = await request.post(`${BASE_URL}/auth/bootstrap`, { data: { instance_name: "E2E", email: ownerEmail, password: ownerPassword }, }); if (!res.ok()) throw new Error(`bootstrap failed: ${res.status()} ${await res.text()}`); return { email: ownerEmail, password: ownerPassword }; } /** Fills the login form and submits it. */ export async function signIn(page: Page, email: string, password: string) { await page.goto("/login"); await page.getByLabel("Email").fill(email); await page.getByLabel("Password").fill(password); await page.getByRole("button", { name: "Sign In" }).click(); }