diora-web/e2e/global-setup.js
mrwnslz ffcb6fba4f
Some checks failed
Test / e2e (push) Waiting to run
Build and push Docker image / build (push) Successful in 16s
Test / test (push) Has been cancelled
Refactoring Schritt 1: Browser-Tests für den Reader, in der CI; Plan in docs/refactoring.md
- e2e/reader.spec.js: ein Test-EPUB (e2e/make_epub.py) hochladen, öffnen ohne
  zu senden, lesen und Lesestand nach Neuladen, Fußnote, Markierung und
  Notizleiste, Hell/Dunkel samt Reader, alle Tabs ohne Seitenfehler.
- e2e/env.js: E2E_PORT und E2E_PYTHON; nie einen laufenden Server
  wiederverwenden (dahinter läge eine echte Datenbank).
- CI: eigener Job e2e (Playwright + Chromium); blockiert den Docker-Build nicht.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:25:06 +02:00

62 lines
2.2 KiB
JavaScript

// Runs once before the e2e suite, after Playwright's webServer is already up
// (see playwright.config.js) but before any test executes.
//
// 1. Resets and migrates a throwaway SQLite DB (data/e2e_test.sqlite3) so
// tests never touch the real dev database.
// 2. Creates a fixed test user.
// 3. Logs that user in through the real login form and saves the resulting
// storage state, so authenticated specs can start already logged in via
// `test.use({ storageState: 'e2e/.auth/user.json' })`.
const fs = require('fs');
const path = require('path');
const { execFileSync } = require('child_process');
const { chromium } = require('@playwright/test');
const { BASE_URL, PYTHON, SERVER_ENV, TEST_USER } = require('./env');
const ROOT = path.join(__dirname, '..');
const DB_PATH = path.join(ROOT, 'data', SERVER_ENV.DIORA_DB_NAME);
const AUTH_DIR = path.join(__dirname, '.auth');
const AUTH_FILE = path.join(AUTH_DIR, 'user.json');
module.exports = async function globalSetup() {
// Fresh DB every run.
fs.rmSync(DB_PATH, { force: true });
execFileSync(PYTHON, ['manage.py', 'migrate', '--noinput'], {
cwd: ROOT,
env: SERVER_ENV,
stdio: 'inherit',
});
execFileSync(
PYTHON,
[
'manage.py',
'shell',
'-c',
`
from django.contrib.auth import get_user_model
User = get_user_model()
User.objects.filter(username=${JSON.stringify(TEST_USER.username)}).delete()
User.objects.create_user(${JSON.stringify(TEST_USER.username)}, "", ${JSON.stringify(TEST_USER.password)})
`,
],
{ cwd: ROOT, env: SERVER_ENV, stdio: 'inherit' }
);
fs.mkdirSync(AUTH_DIR, { recursive: true });
// The book the reader tests read (e2e/make_epub.py).
execFileSync(PYTHON, [path.join(__dirname, 'make_epub.py'), path.join(AUTH_DIR, 'book.epub')], { stdio: 'inherit' });
const browser = await chromium.launch();
const page = await browser.newPage({ baseURL: BASE_URL });
await page.goto(`${BASE_URL}/accounts/login/`);
await page.fill('[name=username]', TEST_USER.username);
await page.fill('[name=password]', TEST_USER.password);
await Promise.all([
page.waitForURL(BASE_URL + '/'),
page.click('button[type=submit]'),
]);
await page.context().storageState({ path: AUTH_FILE });
await browser.close();
};