Skip to content

Exercice 2 / Étape 2 — Plan de tests

Liste des cas de test à écrire, organisée selon la pyramide des tests (unitaire → intégration → E2E), du plus simple au plus complexe. Suivant la consigne de cette étape, seuls les cas nominaux (comportement attendu, pas les erreurs ni les effets de bord) sont listés ici — les erreurs/validations seront couvertes lors de l'implémentation (étapes 3 à 5) dans la mesure où elles sont nécessaires pour atteindre le seuil de couverture de 80 %, et documentées à part dans les étapes correspondantes.

Back-end — tests unitaires (Mockito), services

Service Cas de test Entrée Sortie attendue
UserService (existant) register() cas nominal User valide userRepository.save() appelé avec cet utilisateur, mot de passe encodé
UserService login() cas nominal login/password valides JWT non nul retourné (jwtService.generateToken() appelé)
JwtService generateToken() cas nominal UserDetails JWT non nul, avec subject = login, exp = iat + expiration-ms
JwtService extractUsername() cas nominal token généré par le service login d'origine
JwtService isTokenValid() cas nominal token + UserDetails correspondant true
StudentService create() cas nominal Student valide studentRepository.save() appelé
StudentService findAll() cas nominal liste des étudiants du repository
StudentService findById() cas nominal id existant Student correspondant
StudentService update() cas nominal id existant + nouvelles données étudiant mis à jour et sauvegardé
StudentService delete() cas nominal id existant studentRepository.delete() appelé

Back-end — tests d'intégration (Testcontainers), controllers

Controller Cas de test Requête Réponse attendue
UserController (existant) POST /api/register cas nominal corps valide 201
UserController POST /api/login cas nominal login/password valides 200 + corps = JWT
StudentController POST /api/students cas nominal (authentifié) corps valide + Bearer token 201 + StudentDTO
StudentController GET /api/students cas nominal (authentifié) — + Bearer token 200 + liste
StudentController GET /api/students/{id} cas nominal (authentifié) id existant + Bearer token 200 + StudentDTO
StudentController PUT /api/students/{id} cas nominal (authentifié) id existant + corps valide + Bearer token 200 + StudentDTO mis à jour
StudentController DELETE /api/students/{id} cas nominal (authentifié) id existant + Bearer token 204
StudentController accès sans token requête sans header Authorization 401 (cas de sécurité — traité comme nominal du point de vue de la spec, pas une "erreur" applicative)

Front-end — tests unitaires/intégration (Jest)

Fichier Cas de test Vérifie
UserService register() cas nominal POST /api/register appelé avec le bon corps
UserService login() cas nominal POST /api/login appelé, token stocké dans localStorage
UserService isLoggedIn() reflète la présence du token
StudentService findAll/findById/create/update/delete chaque méthode appelle le bon verbe/URL HTTP
RegisterComponent (existant : création only) soumission valide userService.register() appelé, navigation vers /login
LoginComponent soumission valide userService.login() appelé, navigation vers /students
LoginComponent formulaire invalide userService.login() non appelé
StudentListComponent chargement findAll() appelé au ngOnInit, liste affichée
StudentFormComponent mode création soumission → create() appelé
StudentFormComponent mode édition (id en route) findById() appelé au chargement, soumission → update() appelé
StudentDetailComponent chargement findById() appelé avec l'id de la route
authGuard utilisateur connecté retourne true
authGuard utilisateur non connecté retourne false et navigue vers /login
authInterceptor token présent header Authorization ajouté à la requête

Front-end — tests E2E (Cypress)

Du plus simple (formulaires) au plus complexe (CRUD complet), API mockée via cy.intercept() :

Parcours Étapes Vérifie
Inscription remplir le formulaire /register, soumettre requête POST /api/register envoyée, redirection vers /login
Connexion remplir le formulaire /login, soumettre requête POST /api/login envoyée, redirection vers /students
Accès protégé naviguer vers /students sans session redirection vers /login (Guard)
Liste des étudiants connecté, visite /students liste affichée à partir de la réponse mockée
Création d'un étudiant connecté, /students/new, soumettre POST /api/students envoyé, retour sur /students
Suppression d'un étudiant connecté, clic sur Delete + confirmation DELETE /api/students/{id} envoyé

Seuils de couverture visés

  • Back-end (JaCoCo) : ≥ 80 % lignes, sur service, controller, mapper.
  • Front-end (Jest) : ≥ 80 % statements/branches/functions/lines.
  • E2E (Cypress) : tous les écrans listés ci-dessus exécutés avec succès.