Steuerkram/tests/86_BelegDetailStrukturTest.php

98 lines
4.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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"
);
}
}
}