// @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') }) })