$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