ajoute Quiz flash (chantier vrai cockpit, étape 2) : QCM et vrai/faux, lancé en direct, indépendant d'une séance de lab

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Adam Belkacemi 2026-10-13 12:14:30 +02:00
parent 45f8a69e26
commit 16d1293911
24 changed files with 1249 additions and 5 deletions

View file

@ -887,3 +887,29 @@ Le choix qui a le plus simplifié ce chantier n'était pas technique mais de mé
**Suite**
Dette retirée. Reste dans `docs/dette.md` : le test de bascule TURN en navigateur réel, et l'image Jitsi/Kuma à faire évoluer vers un tag versionné. Chantier « vrai cockpit » : Quiz flash, toujours en attente.
## 2026-10-13 — Chantier « vrai cockpit », étape 2 : Quiz flash
Deuxième fonction réelle du chantier (après le tableau de bord). Deux décisions d'Adam avant de coder : formats QCM **et** Vrai/Faux dès la version 1 ; le quiz se lance **indépendamment** d'une séance de lab (pas besoin de code à rejoindre : l'élève est déjà un compte réel de sa classe, le quiz apparaît sur son tableau de bord).
**Fait**
- 5 tables (`quizzes`, `questions_quiz`, `choix_questions_quiz`, `sessions_quiz`, `reponses_quiz`) et leurs modèles. Une banque de questions par classe (`Quiz`), réutilisable ; un lancement en direct (`SessionQuiz`) avance question par question, se termine seule après la dernière.
- Prof : `/mes-classes/{classe}/quiz` (créer un quiz, ajouter des questions une par une — même esprit que « ajouter un élève »), panneau de contrôle en direct (`/sessions-quiz/{session}`) avec décompte des réponses en temps réel (qui a répondu, combien de bonnes réponses), bouton « Suivante »/« Terminer ».
- Élève : rien à rejoindre. Une zone sur `/eleve`, cachée par défaut, interrogée toutes les 2 s (`/quiz-flash/etat`) ; apparaît dès qu'un quiz est lancé pour sa classe, avec la question et un formulaire. Une réponse par question (contrainte unique en base, vérifiée aussi côté application) : pas de changement d'avis, pas de double clic compté deux fois.
- Menu : les liens « Quiz flash » de la vitrine (mégamenu et pied de page) pointent désormais vers `/mes-classes` pour un prof connecté, au lieu de la démo — même correctif que pour le tableau de bord.
- 16 tests Pest (72 au total), dont un qui rend les vraies pages et vérifie leurs scripts avec Node (même piège que `/ide` à l'étape 14, évité ici dès la construction) et un qui vérifie que la purge RGPD d'une classe supprime bien ses quiz, questions, choix, sessions et réponses.
**Un vrai bug de migration, trouvé par les tests avant le serveur réel**
`constrained()` devine le nom de la table à partir du nom de la colonne, en la mettant au pluriel anglais standard. Nos tables ont des noms différents de cette convention (`questions_quiz`, pas `question_quizzes` ; `sessions_quiz`, pas `session_quizzes` ; `choix_questions_quiz`, pas `choix_question_quizzes`) : trois clés étrangères pointaient vers des tables qui n'existaient pas. Corrigé en précisant le nom de chaque table explicitement (`constrained('questions_quiz')`, etc.) — seul `quiz_id` → `quizzes` correspondait déjà à la convention (vérifié avec `Str::plural('quiz')`, pas supposé).
**Critère vérifié sur le serveur réel** (scénario à 2 élèves, nettoyé ensuite) : un prof a créé un quiz (1 QCM, 1 vrai/faux), l'a lancé ; un élève a répondu juste (Paris), l'autre faux (Lyon) ; le panneau du prof a montré en direct « 2 ont répondu, 1 correcte » ; une deuxième réponse du même élève a été refusée (409, « Déjà répondu ») ; passage à la question suivante, l'élève l'a vue sans son ancien « déjà répondu » ; fin du quiz, l'élève ne voit plus rien.
**Comprendre**
Le bug de migration est un bon rappel que les conventions de Laravel ne devinent pas, elles supposent — et l'hypothèse casse silencieusement dès qu'on s'éloigne un peu du nom de table standard (ici, un ordre « pluriel-puis-singulier » choisi pour que les noms de table se lisent bien en français). Heureusement, les tests Pest l'ont trouvé avant même d'atteindre le serveur : la bonne nouvelle de ce chantier n'est pas qu'il n'y a pas eu de bug, mais que chaque bug a été trouvé au bon moment — jamais après coup.
**Suite**
Chantier « vrai cockpit », étape 3 : Devoirs maison (prochaine fonction).