get(route('interne.webdav-auth'))->assertStatus(401); }); test('la sous-requête Nginx refuse un code secret incorrect', function () { $eleve = Eleve::factory()->create(); $this->withBasicAuth($eleve->identifiant, 'mauvais-code') ->get(route('interne.webdav-auth')) ->assertStatus(401); }); test('la sous-requête Nginx accepte les identifiants de connexion et pose le dossier de l’élève', function () { $eleve = Eleve::factory()->create(['code_secret' => bcrypt('monCode123')]); $this->withBasicAuth($eleve->identifiant, 'monCode123') ->get(route('interne.webdav-auth')) ->assertStatus(200) ->assertHeader('X-Eleve-Dossier', (string) $eleve->id); Storage::disk('webdav')->assertExists((string) $eleve->id); }); test('5 échecs de suite bloquent temporairement même avec le bon code juste après', function () { $eleve = Eleve::factory()->create(['code_secret' => bcrypt('monCode123')]); for ($i = 0; $i < 5; $i++) { $this->withBasicAuth($eleve->identifiant, 'mauvais') ->get(route('interne.webdav-auth')) ->assertStatus(401); } $this->withBasicAuth($eleve->identifiant, 'monCode123') ->get(route('interne.webdav-auth')) ->assertStatus(401); RateLimiter::clear('webdav:'.$eleve->identifiant.'|127.0.0.1'); }); test('un élève connecté voit l’adresse de son dossier WebDAV', function () { $eleve = Eleve::factory()->create(); eleve($this, $eleve)->get(route('mes-fichiers')) ->assertOk() ->assertSee('/webdav/') ->assertSee($eleve->identifiant); }); test('purger une classe archivée supprime aussi le dossier WebDAV de ses élèves', function () { $classe = Classe::factory()->create(); $eleve = Eleve::factory()->create(['classe_id' => $classe->id]); Storage::disk('webdav')->put($eleve->id.'/photo.jpg', 'contenu'); $classe->forceFill(['archivee_a' => now()->subDays(91)])->save(); $this->artisan('classes:purger-archivees'); Storage::disk('webdav')->assertMissing($eleve->id.'/photo.jpg'); });