// 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, 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('python3', ['manage.py', 'migrate', '--noinput'], { cwd: ROOT, env: SERVER_ENV, stdio: 'inherit', }); execFileSync( 'python3', [ '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 }); 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(); };