98 lines
4.1 KiB
PHP
98 lines
4.1 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
/**
|
||
* Test 86: Struktur von belege/detail.php (Fix #157)
|
||
*
|
||
* detail.php war mit 1.548 Zeilen (davon 827 JavaScript in neun
|
||
* <script>-Blöcken) die mit Abstand größte View der Anwendung. Dieser Test
|
||
* hält die im Zuge der Aufteilung entstandene Struktur fest: detail.php ist
|
||
* nur noch ein Gerüst aus Includes und <script src>-Tags, das Markup steckt
|
||
* in Teil-Views, die Logik in eigenständigen, cachefähigen JS-Dateien.
|
||
*/
|
||
class BelegDetailStrukturTest extends TestCase
|
||
{
|
||
protected string $testName = 'Test 86: Struktur von belege/detail.php';
|
||
|
||
public function run(): void
|
||
{
|
||
$viewDir = __DIR__ . '/../src/Views/belege';
|
||
$jsDir = __DIR__ . '/../public/static/js';
|
||
$viewFile = $viewDir . '/detail.php';
|
||
$content = file_get_contents($viewFile);
|
||
|
||
$this->assert($content !== false, 'belege/detail.php ist lesbar');
|
||
|
||
$lines = substr_count($content, "\n") + 1;
|
||
$this->assert(
|
||
$lines < 200,
|
||
"belege/detail.php bleibt unter 200 Zeilen (erhalten: $lines)"
|
||
);
|
||
|
||
// Kein <script>-Block mit Logik mehr – nur noch <script src>-Tags
|
||
$this->assert(
|
||
preg_match('/<script>/', $content) === 0,
|
||
'Keine inline <script>-Blöcke mehr in detail.php'
|
||
);
|
||
|
||
preg_match_all('/<script\b[^>]*>/', $content, $scriptTags);
|
||
foreach ($scriptTags[0] as $tag) {
|
||
$this->assert(
|
||
str_contains($tag, 'src='),
|
||
"Script-Tag lädt eine externe Datei statt Inline-JS: $tag"
|
||
);
|
||
}
|
||
|
||
// Alle per include __DIR__ . '/_xyz.php' eingebundenen Teil-Views existieren
|
||
preg_match_all('/include\s+__DIR__\s*\.\s*\'\/([^\']+)\'/', $content, $includes);
|
||
$this->assertGreaterThan(0, count($includes[1]), 'detail.php bindet Teil-Views per include ein');
|
||
foreach ($includes[1] as $partial) {
|
||
$this->assert(
|
||
is_file($viewDir . '/' . $partial),
|
||
"Teil-View $partial existiert in src/Views/belege/"
|
||
);
|
||
}
|
||
|
||
// Alle referenzierten JS-Dateien existieren
|
||
preg_match_all('/<script\s+src="\/static\/js\/([^"?]+)/', $content, $scripts);
|
||
$this->assertGreaterThan(0, count($scripts[1]), 'detail.php bindet JS-Dateien per <script src> ein');
|
||
foreach ($scripts[1] as $js) {
|
||
$this->assert(
|
||
is_file($jsDir . '/' . $js),
|
||
"JS-Datei $js existiert in public/static/js/"
|
||
);
|
||
}
|
||
|
||
// Erwartete Teil-Views laut Fix #157 sind tatsächlich vorhanden
|
||
foreach (['_infobar.php', '_vorschau.php', '_buchungsform.php', '_anlage_modal.php', '_crop_modal.php'] as $partial) {
|
||
$this->assert(is_file($viewDir . '/' . $partial), "Teil-View $partial existiert");
|
||
}
|
||
|
||
// Erwartete JS-Dateien laut Fix #157 sind tatsächlich vorhanden
|
||
foreach (['beleg-form.js', 'beleg-anlage.js', 'beleg-ki.js', 'beleg-crop.js', 'beleg-ui.js'] as $js) {
|
||
$this->assert(is_file($jsDir . '/' . $js), "JS-Datei $js existiert");
|
||
}
|
||
|
||
// beleg-form.js muss vor beleg-ki.js eingebunden werden: beleg-form.js
|
||
// definiert updateAutoUst() und initialisiert Formular-Defaults per
|
||
// DOMContentLoaded, bevor der KI-Vorschlag diese ggf. überschreibt.
|
||
$posForm = strpos($content, 'beleg-form.js');
|
||
$posKi = strpos($content, 'beleg-ki.js');
|
||
if ($posKi !== false) {
|
||
$this->assert(
|
||
$posForm !== false && $posForm < $posKi,
|
||
'beleg-form.js wird vor beleg-ki.js eingebunden'
|
||
);
|
||
}
|
||
|
||
// Kein PHP-Interpolations-Marker mehr innerhalb der ausgelagerten JS-Dateien
|
||
foreach (['beleg-form.js', 'beleg-anlage.js', 'beleg-ki.js', 'beleg-crop.js', 'beleg-ui.js'] as $js) {
|
||
$jsContent = file_get_contents($jsDir . '/' . $js);
|
||
$this->assert(
|
||
$jsContent !== false && !str_contains($jsContent, '<?php') && !str_contains($jsContent, '<?='),
|
||
"$js enthält keine PHP-Interpolation"
|
||
);
|
||
}
|
||
}
|
||
}
|