Fix nav selectors (Erfassen), shared auth via global-setup to avoid login rate limits, and desktop sidebar viewport handling. Co-authored-by: Cursor <cursoragent@cursor.com>
65 lines
2.1 KiB
JavaScript
65 lines
2.1 KiB
JavaScript
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'})`
|
|
);
|
|
};
|