- Books: Reader sprang beim Scroll+sofortigem Tap auf die alte Position zurück (Anker-Tracking lief nur alle 2s über den Save-Debounce, jetzt eigener 150ms-Tracker unabhängig davon) - Books: +/- Buttons neben den Reader-Slidern (Font/Zeilenhöhe/Breite) - Books: Sicherheitsnetz-Toast bei plötzlichen großen Scroll-Sprüngen (Fling, aus Versehen 'G' gedrückt) mit Zurückspringen-Option; bewusste Sprünge (TOC, Lesezeichen, Fortschritts-Eingabe, Suche) lösen ihn nicht aus - Radio: Donation-Hinweis kam bei vielen Lieblingssendern gefühlt ständig — jetzt zusätzlich auf ~1-von-10 Plays gedrosselt - UI: farbige Emoji-Icons (🔍📻⏪⏩💡 etc.) durch monochrome Unicode-Symbole ersetzt, die nicht mehr je nach OS/Browser-Font unterschiedlich aussehen; Lesezeichen-Icon war zudem fast identisch zum TOC-Icon - UI: native alert()/confirm()/prompt() durch eigenes Modal-System ersetzt - UI: Hash-basiertes URL-Routing für Tabs (#radio/saved, #podcasts/feeds, …) — Browser-Zurück/Vor und Deep-Links funktionieren jetzt - Tests: Playwright e2e-Setup gegen isolierte Test-DB (DIORA_DB_NAME), Smoke- und Auth-Specs Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
37 lines
1.6 KiB
JavaScript
37 lines
1.6 KiB
JavaScript
// Unauthenticated smoke tests: no storageState, run as an anonymous visitor.
|
|
const { test, expect } = require('@playwright/test');
|
|
|
|
test('home page loads for an anonymous visitor', async ({ page }) => {
|
|
await page.goto('/');
|
|
await expect(page).toHaveTitle(/diora/);
|
|
await expect(page.locator('.navbar-brand')).toHaveText('diora');
|
|
await expect(page.locator('.navbar-links a[href="/accounts/login/"]')).toBeVisible();
|
|
});
|
|
|
|
test('login page renders the auth form', async ({ page }) => {
|
|
await page.goto('/accounts/login/');
|
|
await expect(page.locator('[name=username]')).toBeVisible();
|
|
await expect(page.locator('[name=password]')).toBeVisible();
|
|
});
|
|
|
|
test('a new user can register and lands on the home page logged in', async ({ page }) => {
|
|
const username = `e2e_reg_${Date.now()}`;
|
|
await page.goto('/accounts/register/');
|
|
await page.fill('[name=username]', username);
|
|
await page.fill('[name=password1]', 'a-very-unlikely-pw-98234');
|
|
await page.fill('[name=password2]', 'a-very-unlikely-pw-98234');
|
|
await Promise.all([
|
|
page.waitForURL('/'),
|
|
page.click('button[type=submit]'),
|
|
]);
|
|
await expect(page.locator('.navbar-user')).toHaveText(username);
|
|
});
|
|
|
|
test('login with wrong credentials shows an error and stays on the login page', async ({ page }) => {
|
|
await page.goto('/accounts/login/');
|
|
await page.fill('[name=username]', 'nobody-such-user');
|
|
await page.fill('[name=password]', 'wrong-password');
|
|
await page.click('button[type=submit]');
|
|
await expect(page).toHaveURL(/\/accounts\/login\//);
|
|
await expect(page.locator('.form-errors, .field-errors')).toBeVisible();
|
|
});
|