Finanzmanager/tests/run.php
fds2610-bot b1712bb7ea Phase 0: Projektgerüst mit nginx, php-fpm und MariaDB
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.
2026-08-09 20:21:42 +02:00

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);