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.
47 lines
1.7 KiB
PHP
47 lines
1.7 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
use Finanzmanager\Router;
|
||
|
||
class RouterTest extends TestCase
|
||
{
|
||
protected string $testName = 'Test 03: Routing';
|
||
|
||
public function run(): void
|
||
{
|
||
$this->einfachePfade();
|
||
$this->platzhalter();
|
||
$this->keineTeiltreffer();
|
||
}
|
||
|
||
private function einfachePfade(): void
|
||
{
|
||
$this->assertEquals([], Router::passt('/', '/'), 'Wurzelpfad passt');
|
||
$this->assertEquals([], Router::passt('/einstellungen', '/einstellungen'), 'Fester Pfad passt');
|
||
$this->assertNull(Router::passt('/einstellungen', '/konten'), 'Anderer Pfad passt nicht');
|
||
}
|
||
|
||
private function platzhalter(): void
|
||
{
|
||
$treffer = Router::passt('/konten/{id}', '/konten/42');
|
||
$this->assertEquals('42', $treffer['id'] ?? null, 'Platzhalter liefert den Wert');
|
||
|
||
$treffer = Router::passt('/konten/{id}/buchungen/{buchung}', '/konten/7/buchungen/199');
|
||
$this->assertEquals('7', $treffer['id'] ?? null, 'Erster Platzhalter stimmt');
|
||
$this->assertEquals('199', $treffer['buchung'] ?? null, 'Zweiter Platzhalter stimmt');
|
||
}
|
||
|
||
private function keineTeiltreffer(): void
|
||
{
|
||
// Der Platzhalter darf keinen Schrägstrich verschlucken – sonst würde
|
||
// /konten/{id} auch /konten/1/bearbeiten abfangen.
|
||
$this->assertNull(
|
||
Router::passt('/konten/{id}', '/konten/1/bearbeiten'),
|
||
'Platzhalter greift nicht über Pfadgrenzen hinweg'
|
||
);
|
||
|
||
$this->assertNull(Router::passt('/konten', '/konten/1'), 'Fester Pfad matcht keinen Unterpfad');
|
||
$this->assertNull(Router::passt('/konten', '/xkonten'), 'Kein Treffer bei Präfix davor');
|
||
}
|
||
}
|