Pages /legal et /confidentialite réécrites d'après le système réel, purge des classes archivées depuis 90 jours (prouvée par Pest), archivage côté prof. Polices, xterm.js et CodeMirror ne sont plus chargés depuis Google ni jsDelivr. Pages d'aperçu signalées, sans vrais établissements ni faux chiffres. Journaux Laravel gardés 14 jours. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
37 lines
1.8 KiB
PHP
37 lines
1.8 KiB
PHP
<?php
|
||
|
||
use Illuminate\Support\Facades\Route;
|
||
|
||
// Toutes les pages publiques sans paramètre doivent s'afficher : la page
|
||
// /cours a été en erreur 500 de l'étape 8 à l'étape 12 sans que personne
|
||
// ne le voie.
|
||
test('chaque page publique s’affiche sans erreur', function () {
|
||
$pages = collect(Route::getRoutes())
|
||
->filter(fn ($r) => in_array('GET', $r->methods(), true)
|
||
&& $r->getName() !== null
|
||
&& ! str_contains($r->uri(), '{')
|
||
&& ! collect($r->gatherMiddleware())->contains(fn ($m) => is_string($m) && str_starts_with($m, 'auth')))
|
||
->reject(fn ($r) => str_starts_with($r->uri(), 'horizon') || str_starts_with($r->uri(), '_') || $r->uri() === 'up')
|
||
// Redirections voulues (ex. /statut vers le site de statut).
|
||
->reject(fn ($r) => $r->getActionName() === '\\Illuminate\\Routing\\RedirectController');
|
||
|
||
expect($pages)->not->toBeEmpty();
|
||
|
||
$echecs = $pages->mapWithKeys(fn ($r) => [$r->uri() => $this->get('/'.ltrim($r->uri(), '/'))->getStatusCode()])
|
||
->reject(fn ($code) => $code === 200);
|
||
|
||
expect($echecs->all())->toBe([]);
|
||
});
|
||
|
||
// Étape 14 : la politique de confidentialité affirme qu'aucune page ne fait
|
||
// partir l'adresse IP du visiteur chez un fournisseur de polices.
|
||
test('aucune page publique ne charge de police depuis un service externe', function () {
|
||
$pages = collect(Route::getRoutes())
|
||
->filter(fn ($r) => in_array('GET', $r->methods(), true) && $r->getName() !== null && ! str_contains($r->uri(), '{'))
|
||
->reject(fn ($r) => collect($r->gatherMiddleware())->contains(fn ($m) => is_string($m) && str_starts_with($m, 'auth')));
|
||
|
||
foreach ($pages as $route) {
|
||
$html = $this->get('/'.ltrim($route->uri(), '/'))->getContent();
|
||
expect($html)->not->toMatch('#fonts\.(googleapis|gstatic|bunny)\.(com|net)#', "page /{$route->uri()}");
|
||
}
|
||
});
|