Paillasse/portail/tests/Feature/WebdavTest.php

70 lines
2.3 KiB
PHP
Raw Normal View History

<?php
use App\Models\Classe;
use App\Models\Eleve;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Storage;
beforeEach(function () {
Storage::fake('webdav');
});
test('la sous-requête Nginx refuse sans identifiants', function () {
$this->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');
});