91 lines
3.4 KiB
PHP
91 lines
3.4 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
/**
|
||
* Test 61: Netto/Brutto-Umschalter im Buchungsformular
|
||
*
|
||
* Prüft, dass in der Teil-View _buchungsform.php die beiden Umschalt-Buttons
|
||
* für Netto- bzw. Bruttobetrag vorhanden sind und die zugehörige JS-Logik
|
||
* (Moduswechsel, Umrechnung, Konvertierung vor dem Absenden) in
|
||
* static/js/beleg-form.js existiert.
|
||
*/
|
||
class BetragModusToggleTest extends TestCase
|
||
{
|
||
protected string $testName = 'Test 61: Netto/Brutto-Umschalter im Buchungsformular';
|
||
|
||
public function run(): void
|
||
{
|
||
$viewFile = __DIR__ . '/../src/Views/belege/_buchungsform.php';
|
||
$jsFile = __DIR__ . '/../public/static/js/beleg-form.js';
|
||
$viewContent = file_get_contents($viewFile);
|
||
$jsContent = file_get_contents($jsFile);
|
||
$content = $viewContent . "\n" . $jsContent;
|
||
|
||
$this->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'
|
||
);
|
||
}
|
||
}
|