const { chromium } = require('@playwright/test'); const fs = require('fs'); const path = require('path'); const TEST_EMAIL = process.env.TEST_EMAIL || 'lars@stommer.com'; const TEST_PASSWORD = process.env.TEST_PASSWORD || '5112'; const AUTH_FILE = path.join(__dirname, '.auth', 'user.json'); async function tryLogin(page, baseURL) { await page.goto(`${baseURL}/`); await page.waitForLoadState('networkidle'); const loginBtn = page.locator('button:has-text("Anmelden")'); if ((await loginBtn.count()) === 0) { return { ok: true, status: 200 }; } await page.fill('input[type="email"]', TEST_EMAIL); await page.fill('input[type="password"]', TEST_PASSWORD); const responsePromise = page .waitForResponse( (r) => r.url().includes('/api/auth/login') && r.request().method() === 'POST', { timeout: 15000 } ) .catch(() => null); await page.click('button:has-text("Anmelden")'); const response = await responsePromise; await page.waitForLoadState('networkidle'); const loginVisible = await page.locator('button:has-text("Anmelden")').count(); return { ok: loginVisible === 0, status: response?.status() ?? null }; } module.exports = async (config) => { fs.mkdirSync(path.dirname(AUTH_FILE), { recursive: true }); const browser = await chromium.launch({ channel: 'chrome', headless: true }); const page = await browser.newPage(); const baseURL = config.projects?.[0]?.use?.baseURL || 'https://dev.mitai.jinkendo.de'; const waits = [0, 15000, 30000, 45000]; let lastStatus = null; for (let i = 0; i < waits.length; i++) { if (waits[i] > 0) { console.log(`Global setup: warte ${waits[i] / 1000}s (Login-Rate-Limit 5/min)…`); await page.waitForTimeout(waits[i]); } const result = await tryLogin(page, baseURL); lastStatus = result.status; if (result.ok) { await page.context().storageState({ path: AUTH_FILE }); await browser.close(); return; } } await browser.close(); throw new Error( `Global setup: Login fehlgeschlagen (letzter HTTP-Status: ${lastStatus ?? 'unbekannt'})` ); };