Steuerkram/tests/81_EreignisseAlleFehlerTest.php

109 lines
5.6 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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