$belegNr,
'filename' => 'xss-test.pdf',
'storage_path' => '',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', $belegNr),
'beleg_datum' => $datum,
'belegtyp' => 'Eingangsrechnung',
]);
$this->assertGreaterThan(0, $belegId, 'Beleg angelegt');
$payload = '';
// Nachbau der Fehlerauflösung aus BookingController::store() (Zeile 100-105):
// eine nicht auflösbare Freitext-Kontonummer landet unescaped in $errors.
$errors = [
'kategorie_konto_id' => "Kontonummer '$payload' nicht gefunden.",
];
// BookingController::renderBelegDetail() nur bis zum Content-Fragment
// nachgebaut (belege/detail.php), ohne layout/base.php – ein zweiter
// voller Seiten-Render im selben Testlauf würde an der Funktions-
// deklaration in layout/nav.php scheitern (siehe Test 65).
$beleg = \Steuerkram\Models\Beleg::find($belegId);
$accounts = \Steuerkram\Models\Account::all(['aktiv' => 1]);
$controller = new \Steuerkram\Controllers\BookingController();
$renderView = new \ReflectionMethod($controller, 'renderView');
$renderView->setAccessible(true);
$html = $renderView->invoke($controller, 'belege/detail', [
'beleg' => $beleg,
'bookings' => \Steuerkram\Models\Booking::forBeleg($belegId),
'integrity' => \Steuerkram\Models\Beleg::verifyIntegrity($belegId),
'accounts' => $accounts,
'assets' => \Steuerkram\Models\Asset::all(),
'formErrors' => $errors,
'formData' => [],
'bankTx' => null,
'bankTxBrutto' => 0.0,
'linkedBankTx' => null,
]);
$this->assert(
!str_contains($html, $payload),
'Roher