60 lines
2.1 KiB
TypeScript
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();
|
||
|
|
}
|