assert( $viewContent !== false, 'Teil-View belege/_buchungsform.php ist lesbar' ); $this->assert( $jsContent !== false, 'JS-Datei static/js/beleg-form.js ist lesbar' ); $this->assert( str_contains($content, 'id="betrag_modus_netto_btn"') && str_contains($content, 'id="betrag_modus_brutto_btn"'), 'Beide Umschalt-Buttons (Netto/Brutto) sind vorhanden' ); // Kein Inline-Handler mehr im Markup (CSP) – die Verdrahtung läuft über // zentrale addEventListener()-Aufrufe in beleg-form.js. $this->assert( !str_contains($viewContent, 'onclick='), 'Umschalt-Buttons haben keinen Inline-Handler mehr' ); $this->assert( str_contains($jsContent, "_betragModusNettoBtn.addEventListener('click', function () { setBetragModus('netto'); });") && str_contains($jsContent, "_betragModusBruttoBtn.addEventListener('click', function () { setBetragModus('brutto'); });"), 'Buttons rufen setBetragModus() mit dem jeweiligen Modus auf' ); $this->assert( str_contains($content, 'function setBetragModus(modus)'), 'JavaScript-Funktion setBetragModus() ist definiert' ); $this->assert( str_contains($content, 'function getBetragModus()'), 'JavaScript-Funktion getBetragModus() ist definiert' ); $this->assert( str_contains($content, "classList.toggle('active'"), 'Aktiver Button wird optisch (CSS-Klasse) hervorgehoben' ); // Vor dem Absenden muss im Brutto-Modus der Feldwert in den Nettobetrag // umgerechnet werden, da das Backend ausschließlich betrag_netto erwartet. $this->assert( str_contains($content, "if (_betragModus !== 'brutto') return;") && str_contains($content, "addEventListener('submit'"), 'Vor dem Absenden wird im Brutto-Modus auf Nettobetrag umgerechnet' ); // CSS-Klasse für den Umschalter muss definiert sein $cssFile = __DIR__ . '/../public/static/css/app.css'; $cssContent = file_get_contents($cssFile); $this->assert( $cssContent !== false && str_contains($cssContent, '.betrag-modus-btn'), 'CSS-Klasse .betrag-modus-btn ist definiert' ); $this->assert( str_contains($cssContent, '.betrag-modus-btn.active'), 'CSS für aktiven Zustand des Umschalters ist definiert' ); } }