Docker Compose mit drei Services (nginx auf Port 8000), Migrationsmechanik, Update- und Backup-Skript. Anwendung: Router mit CSRF-Prüfung, Anmeldung und Ersteinrichtung, zentraler Einstellungsdialog mit Reitern, ein- und ausschaltbares Debug-Log mit Maskierung von Zugangsdaten. Layout nach Vorbild des FinanzManagers: feste Navigation links, Werkzeugleiste oben, Tab-Leiste; Farbschema hell/dunkel/System. Tests: 51 PHP-Prüfungen und 7 Playwright-Tests, alle grün.
86 lines
2.2 KiB
PHP
Executable file
86 lines
2.2 KiB
PHP
Executable file
#!/usr/bin/env php
|
|
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* Test-Runner. Führt alle Tests aus tests/NN_*.php aus.
|
|
*
|
|
* Exit-Code: 0 = alles bestanden, 1 = mindestens ein Fehler.
|
|
*
|
|
* docker compose exec -u www-data php php tests/run.php
|
|
* docker compose exec -u www-data php php tests/run.php --json
|
|
*/
|
|
|
|
$wurzel = dirname(__DIR__);
|
|
$autoload = $wurzel . '/vendor/autoload.php';
|
|
|
|
if (!file_exists($autoload)) {
|
|
fwrite(STDERR, "vendor/autoload.php fehlt. Zuerst 'composer install' im Container ausführen.\n");
|
|
exit(1);
|
|
}
|
|
|
|
require $autoload;
|
|
require __DIR__ . '/TestCase.php';
|
|
|
|
Finanzmanager\Config::load();
|
|
|
|
$jsonModus = in_array('--json', $argv ?? [], true);
|
|
|
|
$dateien = glob(__DIR__ . '/[0-9][0-9]_*.php') ?: [];
|
|
sort($dateien);
|
|
|
|
$klassen = [];
|
|
foreach ($dateien as $datei) {
|
|
$vorher = get_declared_classes();
|
|
require $datei;
|
|
foreach (array_diff(get_declared_classes(), $vorher) as $klasse) {
|
|
if (is_subclass_of($klasse, 'TestCase')) {
|
|
$klassen[] = $klasse;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($klassen === []) {
|
|
echo "Keine Tests gefunden.\n";
|
|
exit(0);
|
|
}
|
|
|
|
$ergebnisse = [];
|
|
|
|
foreach ($klassen as $klasse) {
|
|
/** @var TestCase $test */
|
|
$test = new $klasse();
|
|
$test->fuehreAus();
|
|
|
|
$ergebnisse[] = [
|
|
'name' => $test->name(),
|
|
'bestanden' => $test->bestanden(),
|
|
'fehlgeschlagen' => $test->fehlgeschlagen(),
|
|
'fehler' => $test->fehlermeldungen(),
|
|
];
|
|
|
|
if (!$jsonModus) {
|
|
$zeichen = $test->fehlgeschlagen() === 0 ? "\e[32m✓\e[0m" : "\e[31m✗\e[0m";
|
|
printf("%s %s (%d bestanden, %d fehlgeschlagen)\n",
|
|
$zeichen, $test->name(), $test->bestanden(), $test->fehlgeschlagen());
|
|
foreach ($test->fehlermeldungen() as $meldung) {
|
|
echo " \e[31m→\e[0m {$meldung}\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
$fehler = TestCase::gesamtFehler();
|
|
|
|
if ($jsonModus) {
|
|
echo json_encode([
|
|
'bestanden' => TestCase::gesamtBestanden(),
|
|
'fehlgeschlagen' => $fehler,
|
|
'tests' => $ergebnisse,
|
|
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), "\n";
|
|
} else {
|
|
echo str_repeat('─', 60), "\n";
|
|
printf("%d Prüfungen bestanden, %d fehlgeschlagen.\n", TestCase::gesamtBestanden(), $fehler);
|
|
}
|
|
|
|
exit($fehler === 0 ? 0 : 1);
|