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'); });