import { chromium } from "@playwright/test"; import { ADMIN_EMAIL, ADMIN_PASSWORD, BASE } from "./helpers"; import * as fs from "fs"; import * as path from "path"; const AUTH_FILE = path.join(__dirname, ".auth-state.json"); export default async function globalSetup() { // If answer is not exposed in captcha, skip auth — tests requiring auth will skip themselves. const browser = await chromium.launch({ executablePath: `${process.env.HOME}/.cache/ms-playwright/chromium_headless_shell-1234/chrome-headless-shell-linux64/chrome-headless-shell`, args: ["--no-sandbox", "--disable-dev-shm-usage"], }); const context = await browser.newContext({ ignoreHTTPSErrors: true }); const page = await context.newPage(); try { const captchaRes = await page.request.get(`${BASE}/api/auth/captcha`); const captchaData = await captchaRes.json(); if (!captchaData.answer) { console.warn("\n⚠ CAPTCHA_EXPOSE_ANSWER not set — restart the API container to enable auth tests.\n Run: ./scripts/compose-dev.sh restart api\n"); fs.writeFileSync(AUTH_FILE, JSON.stringify({ available: false })); await browser.close(); return; } const loginRes = await page.request.post(`${BASE}/api/auth/login`, { data: { username: ADMIN_EMAIL, password: ADMIN_PASSWORD, challengeId: captchaData.challengeId, captchaAnswer: captchaData.answer, rememberMe: true, }, }); const body = await loginRes.json(); if (!body.accessToken) { console.warn("\n⚠ Admin login failed in global setup:", JSON.stringify(body)); fs.writeFileSync(AUTH_FILE, JSON.stringify({ available: false })); await browser.close(); return; } fs.writeFileSync(AUTH_FILE, JSON.stringify({ available: true, accessToken: body.accessToken, refreshToken: body.refreshToken, user: body.user, })); console.log("\n✓ Auth state cached for test suite\n"); } catch (e) { fs.writeFileSync(AUTH_FILE, JSON.stringify({ available: false })); console.warn("\n⚠ Global setup failed:", e); } await browser.close(); }