Steuerkram an den e2e-runner angebunden (tests/e2e/, 44 Playwright-Tests). Der erste Smoke-Lauf fand zwei Seiten mit HTTP 500: AccountController::create las $_GET['from'] ungeprüft, assets/form.php nutzte $testMode und $defaultKontoId außerhalb des Bearbeiten-Zweigs. Beides war bis zur Fehler-Härtung (#142) nur eine stille Warning. Test 67 räumt sein Belegverzeichnis jetzt mit ab - es blieb als root-eigenes Verzeichnis liegen und blockierte spätere echte Uploads mit HTTP 500. Test 77 (neu) sichert die Löschsperre von Beleg::delete() ab.
79 lines
2.9 KiB
JavaScript
79 lines
2.9 KiB
JavaScript
// @ts-check
|
||
// Smoke-Tests: Jede Hauptseite muss ohne Serverfehler rendern.
|
||
//
|
||
// Diese Ebene fehlte bisher komplett — die PHP-Testsuite prüft Models und
|
||
// Services, aber nie das Zusammenspiel aus Router, Controller, View und
|
||
// Layout. Genau dort schlugen zuletzt Fehler nach Updates auf.
|
||
|
||
const { test, expect } = require('@playwright/test')
|
||
const { gotoOk, expectNoServerError } = require('../helpers/app')
|
||
|
||
const jahr = new Date().getFullYear()
|
||
const monat = String(new Date().getMonth() + 1).padStart(2, '0')
|
||
|
||
/** Lesende Seiten, die ohne Vorbedingungen erreichbar sein müssen. */
|
||
const seiten = [
|
||
['Dashboard', '/'],
|
||
['Dashboard (explizit)', '/dashboard'],
|
||
['Kontenrahmen', '/accounts'],
|
||
['Konto anlegen', '/accounts/new'],
|
||
['Belegliste', '/belege'],
|
||
['Beleg hochladen', '/belege/upload'],
|
||
['Bank buchen', '/bank'],
|
||
['Bank – Direktabruf', '/bank/direkt'],
|
||
['Bank – Upload', '/bank/upload'],
|
||
['Journal', '/journal'],
|
||
['Lieferanten', '/suppliers'],
|
||
['Lieferant anlegen', '/suppliers/new'],
|
||
['Kunden', '/customers'],
|
||
['Kunde anlegen', '/customers/new'],
|
||
['Rechnungen', '/invoices'],
|
||
['Rechnung anlegen', '/invoices/new'],
|
||
['Anlagevermögen', '/assets'],
|
||
['Anlage anlegen', '/assets/new'],
|
||
['UStVA', '/tax/ustva'],
|
||
['UStVA – Monat', `/tax/ustva/${jahr}/${monat}`],
|
||
['EÜR', '/tax/euer'],
|
||
['EÜR – Jahr', `/tax/euer/${jahr}`],
|
||
['Einstellungen', '/settings'],
|
||
['Einstellungen – Bankimport', '/settings/bankimport'],
|
||
['Buchungsvorlagen', '/einstellungen/buchungsvorlagen'],
|
||
['Buchungsvorlage anlegen', '/einstellungen/buchungsvorlagen/neu'],
|
||
['Ereignisse', '/ereignisse'],
|
||
['Benutzerverwaltung', '/useradmin'],
|
||
]
|
||
|
||
test.describe('Smoke: Hauptseiten rendern', () => {
|
||
for (const [name, pfad] of seiten) {
|
||
test(`${name} (${pfad})`, async ({ page }) => {
|
||
await gotoOk(page, pfad)
|
||
// Das Layout muss stehen — sonst ist die Seite nur halb gerendert.
|
||
await expect(page.locator('nav, .nav, #nav').first()).toBeVisible()
|
||
})
|
||
}
|
||
})
|
||
|
||
test.describe('Smoke: Grundverhalten', () => {
|
||
test('Unbekannte Route liefert 404 statt Serverfehler', async ({ page }) => {
|
||
const response = await page.goto('/gibt-es-nicht-e2e')
|
||
expect(response.status()).toBe(404)
|
||
await expectNoServerError(page)
|
||
})
|
||
|
||
test('Nicht angemeldet führt zum Login', async ({ browser }) => {
|
||
// Eigener Kontext ohne gespeicherten Session-Zustand.
|
||
const context = await browser.newContext({ storageState: { cookies: [], origins: [] } })
|
||
const page = await context.newPage()
|
||
await page.goto('/belege')
|
||
await expect(page).toHaveURL(/\/login/)
|
||
await expect(page.locator('#username')).toBeVisible()
|
||
await context.close()
|
||
})
|
||
|
||
test('CSV-Export der Belegliste liefert eine Datei', async ({ page }) => {
|
||
const response = await page.request.get('/belege/export')
|
||
expect(response.status()).toBe(200)
|
||
const disposition = response.headers()['content-disposition'] || ''
|
||
expect(disposition).toContain('attachment')
|
||
})
|
||
})
|