Paillasse/portail/tests/Feature/TableauDeBordProfTest.php

105 lines
5.4 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
use App\Models\Classe;
use App\Models\Correction;
use App\Models\Eleve;
use App\Models\Lab;
use App\Models\LabSession;
use App\Models\Seance;
use Illuminate\Support\Facades\Cache;
test('le tableau de bord d’une classe vide affiche les cartes réelles, sans aucune donnée inventée', function () {
$classe = Classe::factory()->create(['nom' => 'Classe A']);
$autre = Classe::factory()->create(['user_id' => $classe->user_id, 'nom' => 'Classe B']);
commeProf($this, $classe->prof)
->get(route('mes-classes.show', $classe))
->assertOk()
->assertSee('Classe A')
->assertSee('Classe B') // le sélecteur de classe liste bien les deux
->assertSee('0', false) // Élèves : 0
->assertDontSee('Mains levées')
->assertDontSee('Dans la séance');
});
test('une séance en cours montre les vrais élèves, leur état et leur dernière correction', function () {
$classe = Classe::factory()->create();
$lab = Lab::factory()->create(['identifiant' => '08-deux-lan-routeur', 'titre' => 'Lab 08']);
$seance = Seance::create(['classe_id' => $classe->id, 'lab_id' => $lab->id, 'statut' => Seance::EN_COURS, 'demarree_a' => now()]);
$eleveActif = Eleve::factory()->create(['classe_id' => $classe->id, 'prenom' => 'Léa']);
$eleveEchec = Eleve::factory()->create(['classe_id' => $classe->id, 'prenom' => 'Yanis']);
$sessionActive = LabSession::create(['seance_id' => $seance->id, 'eleve_id' => $eleveActif->id, 'lab_id' => $lab->id, 'etat' => LabSession::ACTIF]);
Correction::create(['lab_session_id' => $sessionActive->id, 'reussi' => true, 'note' => 8, 'note_max' => 10, 'details' => []]);
LabSession::create(['seance_id' => $seance->id, 'eleve_id' => $eleveEchec->id, 'lab_id' => $lab->id, 'etat' => LabSession::ECHEC, 'raison_echec' => 'CREATE_FAILED']);
commeProf($this, $classe->prof)
->get(route('mes-classes.show', $classe))
->assertOk()
->assertSee('Lab 08')
->assertSee('Léa')
->assertSee('Réussi')
->assertSee('8/10')
->assertSee('Yanis')
->assertSee('Échec (3 essais)')
->assertSee('1/2') // dans la séance : 1 admis/actif sur 2 élèves
->assertSee('100%') // réussite moyenne : la seule correction existante a réussi
->assertDontSee('Mains levées'); // pas de visio ouverte : la carte n'existe pas
});
test('l’avancement du lab compte les vraies vérifications réussies, jamais les bonus', function () {
$classe = Classe::factory()->create();
$lab = Lab::factory()->create(['identifiant' => '08-deux-lan-routeur']);
$seance = Seance::create(['classe_id' => $classe->id, 'lab_id' => $lab->id, 'statut' => Seance::EN_COURS, 'demarree_a' => now()]);
$eleve = Eleve::factory()->create(['classe_id' => $classe->id]);
$session = LabSession::create(['seance_id' => $seance->id, 'eleve_id' => $eleve->id, 'lab_id' => $lab->id, 'etat' => LabSession::ACTIF]);
Correction::create(['lab_session_id' => $session->id, 'reussi' => false, 'note' => 1, 'note_max' => 7, 'details' => [
['id' => 'ip-pc-a', 'titre' => 'Adresse de PC-A', 'points' => 1, 'bonus' => false, 'reussi' => true, 'message' => null],
['id' => 'forwarding', 'titre' => 'Routage activé', 'points' => 1, 'bonus' => false, 'reussi' => false, 'message' => 'Regarde net.ipv4.ip_forward.'],
['id' => 'bonus-permanent', 'titre' => 'Routage permanent', 'points' => 1, 'bonus' => true, 'reussi' => true, 'message' => null],
]]);
commeProf($this, $classe->prof)
->get(route('mes-classes.show', $classe))
->assertOk()
->assertSee('Avancement du lab')
->assertSee('Adresse de PC-A')
->assertSee('1/1') // réussi par le seul élève corrigé
->assertSee('Routage activé')
->assertSee('0/1') // pas réussi
->assertDontSee('Routage permanent'); // bonus : hors du parcours normal
});
test('les mains levées de la visio apparaissent sur le tableau de bord, avec l’action réelle « donner la parole »', function () {
$classe = Classe::factory()->create();
$lab = Lab::factory()->create(['identifiant' => '08-deux-lan-routeur']);
$seance = Seance::create([
'classe_id' => $classe->id, 'lab_id' => $lab->id, 'statut' => Seance::EN_COURS, 'demarree_a' => now(),
'visio_ouverte_a' => now(), 'visio_salle' => 'syllabus-test', 'visio_chat' => false,
]);
$eleve = Eleve::factory()->create(['classe_id' => $classe->id, 'prenom' => 'Léa']);
Cache::put("visio:{$seance->id}", [
'mains' => [$eleve->id => ['nom' => 'Léa', 'depuis' => time() - 90]],
'participants' => [], 'presences' => [],
], 3600);
commeProf($this, $classe->prof)
->get(route('mes-classes.show', $classe))
->assertOk()
->assertSee('Mains levées')
->assertSee('Léa')
->assertSee('1 min 30 s')
->assertSee(route('seances.visio.parole', [$seance, $eleve]), false);
});
test('un prof ne voit pas la séance en cours d’une autre classe', function () {
$classe = Classe::factory()->create();
$autreClasse = Classe::factory()->create();
$lab = Lab::factory()->create();
Seance::create(['classe_id' => $autreClasse->id, 'lab_id' => $lab->id, 'statut' => Seance::EN_COURS, 'demarree_a' => now()]);
commeProf($this, $classe->prof)
->get(route('mes-classes.show', $classe))
->assertOk()
->assertDontSee('Dans la séance');
});