ajoute la banque de quiz : partager un quiz, le dupliquer dans une autre classe

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Adam Belkacemi 2026-10-13 12:25:42 +02:00
parent 16d1293911
commit bd74eaf20f
10 changed files with 271 additions and 5 deletions

View file

@ -207,3 +207,60 @@ test('les scripts en ligne des pages du quiz flash sont du JavaScript valide', f
expect($erreurs)->toBe([]);
});
test('un prof partage un quiz, un autre prof le voit dans la banque et le duplique dans sa propre classe', function () {
['classe' => $classe, 'quiz' => $quiz] = quizPret();
$autreClasse = Classe::factory()->create();
commeProf($this, $classe->prof)->post(route('mes-classes.quiz.partager', [$classe, $quiz]))->assertRedirect();
expect($quiz->refresh()->partage)->toBeTrue();
commeProf($this, $autreClasse->prof)->get(route('banque-quiz.index'))
->assertSee('Capitales')
->assertSee($classe->etablissement->nom);
commeProf($this, $autreClasse->prof)
->post(route('banque-quiz.dupliquer', $quiz), ['classe_id' => $autreClasse->id])
->assertRedirect();
$copie = Quiz::where('classe_id', $autreClasse->id)->first();
expect($copie)->not->toBeNull()
->and($copie->id)->not->toBe($quiz->id)
->and($copie->titre)->toBe('Capitales')
->and($copie->partage)->toBeFalse() // la copie n'est pas partagée d'office
->and($copie->questions)->toHaveCount(2);
$copieQcm = $copie->questions->firstWhere('type', 'qcm');
expect($copieQcm->choix)->toHaveCount(2)
->and($copieQcm->choix->firstWhere('texte', 'Paris')->est_correct)->toBeTrue()
->and($copieQcm->id)->not->toBe($quiz->questions->firstWhere('type', 'qcm')->id); // vraie copie, pas une référence
// Modifier la copie ne doit jamais toucher l'original.
$copie->update(['titre' => 'Capitales (adapté)']);
expect($quiz->refresh()->titre)->toBe('Capitales');
});
test('un prof ne peut pas dupliquer un quiz non partagé, ni dans la classe d’un autre prof', function () {
['classe' => $classe, 'quiz' => $quiz] = quizPret();
$autreClasse = Classe::factory()->create();
// Pas partagé : 404.
commeProf($this, $autreClasse->prof)
->post(route('banque-quiz.dupliquer', $quiz), ['classe_id' => $autreClasse->id])
->assertNotFound();
$quiz->update(['partage' => true]);
// Partagé, mais vers une classe qui n'est pas la sienne : refusé.
commeProf($this, $autreClasse->prof)
->post(route('banque-quiz.dupliquer', $quiz), ['classe_id' => $classe->id])
->assertNotFound();
});
test('seul le prof propriétaire peut partager ou retirer son quiz de la banque', function () {
['classe' => $classe, 'quiz' => $quiz] = quizPret();
$autreClasse = Classe::factory()->create();
commeProf($this, $autreClasse->prof)->post(route('mes-classes.quiz.partager', [$classe, $quiz]))->assertForbidden();
expect($quiz->refresh()->partage)->toBeFalse();
});