Files

60 lines
2.1 KiB
TypeScript

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();
}