assert($view !== false, 'View-Datei ereignisse/index.php ist lesbar'); $this->assert( str_contains($view, 'id="events-autoreload-toggle"'), 'Ein-/Aus-Button für Auto-Reload ist vorhanden' ); $this->assert( str_contains($view, 'localStorage'), 'Zustand des Auto-Reload-Buttons wird persistiert (localStorage)' ); $this->assert( str_contains($view, 'setInterval') && str_contains($view, "'/ereignisse/data'"), 'JavaScript pollt periodisch den Daten-Endpunkt' ); $this->assert( str_contains($view, 'window.location.search'), 'Der Poll übernimmt den eingestellten Filter' ); $this->assert( str_contains($view, "toggle.addEventListener('change'"), 'Toggle-Switch schaltet Auto-Reload per Umlegen ein/aus' ); $this->assert( str_contains($view, 'class="switch"') && str_contains($view, 'type="checkbox"'), 'Auto-Reload wird als iOS-artiger Toggle-Switch (Checkbox) dargestellt' ); // Partial für Tabellen-Body existiert und wird sowohl beim initialen // Laden als auch für den Daten-Endpunkt verwendet $partialFile = __DIR__ . '/../src/Views/ereignisse/_body.php'; $this->assert(file_exists($partialFile), 'Partial _body.php existiert'); $controllerFile = __DIR__ . '/../src/Controllers/EventController.php'; $controller = file_get_contents($controllerFile); $this->assert( str_contains($controller, 'function indexData'), 'EventController::indexData() ist implementiert' ); $this->assert( substr_count($controller, "'ereignisse/_body'") >= 2, 'Daten-Endpunkt rendert dasselbe Partial wie die initiale Seite' ); $routesFile = __DIR__ . '/../public/index.php'; $routes = file_get_contents($routesFile); $this->assert( str_contains($routes, "'/ereignisse/data'") && str_contains($routes, 'indexData'), 'Route /ereignisse/data ist registriert' ); $this->assert( str_contains($routes, "'/ereignisse/nextcloud-import/data'"), 'Der bisherige Nextcloud-Endpunkt bleibt erreichbar' ); } }