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