109 lines
5.6 KiB
PHP
109 lines
5.6 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
use Steuerkram\Database;
|
||
use Steuerkram\Models\EventLog;
|
||
|
||
/**
|
||
* Test 81: Ereignisse umfassen alle Fehler und Warnungen (Issue #165)
|
||
*
|
||
* Bis dahin protokollierte nur der Nextcloud-Import in die Ereignisliste. Jetzt
|
||
* hat jeder Eintrag einen Schweregrad, die Liste lässt sich nach Bereich und
|
||
* Schweregrad filtern, und Fehlermeldungen aus dem übrigen System – etwa ein
|
||
* fehlgeschlagener Beleg-Upload – landen ebenfalls dort.
|
||
*/
|
||
class EreignisseAlleFehlerTest extends TestCase
|
||
{
|
||
protected string $testName = 'Test 81: Ereignisliste zeigt Fehler und Warnungen aus dem ganzen System';
|
||
|
||
public function run(): void
|
||
{
|
||
// ── Schweregrad wird gespeichert ─────────────────────────────
|
||
$spalte = Database::fetchOne("SHOW COLUMNS FROM system_events LIKE 'level'");
|
||
$this->assertNotEmpty($spalte, 'Tabelle system_events hat eine Spalte level');
|
||
|
||
$kanal = 'test-' . uniqid();
|
||
EventLog::add($kanal, 'Alles in Ordnung');
|
||
EventLog::warning($kanal, 'Etwas ist ungewöhnlich');
|
||
EventLog::error($kanal, 'Etwas ist schiefgelaufen');
|
||
|
||
$alle = EventLog::findByChannel($kanal);
|
||
$this->assertEquals(3, count($alle), 'Drei Einträge im Testkanal');
|
||
$this->assertEquals('error', $alle[0]['level'], 'Fehler wird als error gespeichert');
|
||
$this->assertEquals('warning', $alle[1]['level'], 'Warnung wird als warning gespeichert');
|
||
$this->assertEquals('info', $alle[2]['level'], 'Ohne Angabe gilt info');
|
||
|
||
// Ungültiger Schweregrad fällt auf info zurück
|
||
EventLog::add($kanal, 'Unbekannter Grad', 'katastrophe');
|
||
$this->assertEquals('info', EventLog::findByChannel($kanal)[0]['level'], 'Ungültiger Schweregrad wird zu info');
|
||
|
||
// ── Filter nach Schweregrad und Bereich ──────────────────────
|
||
$nurFehler = EventLog::find(['channel' => $kanal, 'level' => 'error']);
|
||
$this->assertEquals(1, count($nurFehler), 'Filter nach Schweregrad liefert nur den Fehler');
|
||
$this->assertEquals('Etwas ist schiefgelaufen', $nurFehler[0]['message'], 'Der richtige Eintrag wird geliefert');
|
||
|
||
$andererKanal = 'test-' . uniqid();
|
||
EventLog::error($andererKanal, 'Fehler im anderen Bereich');
|
||
$kanalgefiltert = EventLog::find(['channel' => $kanal]);
|
||
$this->assertEquals(4, count($kanalgefiltert), 'Bereichsfilter blendet fremde Kanäle aus');
|
||
|
||
$ohneFilter = EventLog::find([], 500);
|
||
$this->assert(count($ohneFilter) >= 5, 'Ohne Filter erscheinen die Einträge aller Bereiche');
|
||
|
||
$kanaele = EventLog::channels();
|
||
$this->assert(in_array($kanal, $kanaele, true), 'Der Bereich taucht in der Kanalliste auf');
|
||
$this->assert(in_array($andererKanal, $kanaele, true), 'Auch der zweite Bereich wird gelistet');
|
||
|
||
// Ein unbekannter Schweregrad im Filter wird ignoriert statt zu filtern
|
||
$this->assertEquals(
|
||
4,
|
||
count(EventLog::find(['channel' => $kanal, 'level' => 'quatsch'])),
|
||
'Unbekannter Schweregrad im Filter wird ignoriert'
|
||
);
|
||
|
||
// ── tryAdd schluckt Fehler statt sie weiterzureichen ─────────
|
||
EventLog::tryAdd($kanal, str_repeat('x', 100), EventLog::LEVEL_ERROR);
|
||
$this->assertEquals(5, count(EventLog::findByChannel($kanal)), 'tryAdd schreibt den Eintrag');
|
||
|
||
// ── Fehlerquellen sind angebunden ────────────────────────────
|
||
$view = (string)file_get_contents(__DIR__ . '/../src/View.php');
|
||
$this->assert(
|
||
str_contains($view, 'logFlash') && str_contains($view, 'EventLog::tryAdd'),
|
||
'Fehler- und Warnhinweise aus View::redirect() werden protokolliert'
|
||
);
|
||
|
||
$beleg = (string)file_get_contents(__DIR__ . '/../src/Controllers/BelegController.php');
|
||
$this->assert(
|
||
str_contains($beleg, "EventLog::tryAdd(\n 'beleg-upload'"),
|
||
'Fehlgeschlagene Beleg-Uploads werden protokolliert'
|
||
);
|
||
|
||
$front = (string)file_get_contents(__DIR__ . '/../public/index.php');
|
||
$this->assert(
|
||
str_contains($front, 'steuerkramLogEvent') && substr_count($front, "'system'") >= 2,
|
||
'Unbehandelte Ausnahmen und schwere Fehler landen im Bereich system'
|
||
);
|
||
|
||
// ── Ansicht und Routen ───────────────────────────────────────
|
||
$controller = (string)file_get_contents(__DIR__ . '/../src/Controllers/EventController.php');
|
||
$this->assert(str_contains($controller, 'function indexData'), 'EventController::indexData() existiert');
|
||
$this->assert(
|
||
str_contains($controller, 'filterFromRequest'),
|
||
'Bereich und Schweregrad werden aus der Anfrage übernommen'
|
||
);
|
||
|
||
$routes = (string)file_get_contents(__DIR__ . '/../public/index.php');
|
||
$this->assert(str_contains($routes, "'/ereignisse/data'"), 'Route /ereignisse/data ist registriert');
|
||
|
||
$index = (string)file_get_contents(__DIR__ . '/../src/Views/ereignisse/index.php');
|
||
$this->assert(
|
||
str_contains($index, 'name="channel"') && str_contains($index, 'name="level"'),
|
||
'Die Ansicht bietet Filter für Bereich und Schweregrad'
|
||
);
|
||
$this->assert(
|
||
str_contains($index, 'id="events-autoreload-toggle"') && str_contains($index, 'setInterval'),
|
||
'Der automatische Neuaufbau bleibt erhalten'
|
||
);
|
||
}
|
||
}
|