# Partie 4 — Plan de tests ## Vue d'ensemble | Catégorie | Cas documentés | Automatisés (pytest) | Résultat réel (2026-08-20) | |---|---|---|---| | Tests unitaires (UT) | 17 | 17 | 17/17 réussis | | Tests d'intégration (IT) | 11 | 11 | 11/11 réussis | | Tests de sécurité (TS) | 6 | 6 | 6/6 réussis | | Tests de déploiement (TD) | 6 | Manuels (checklist) | Voir Partie 3 | | Tests fonctionnels (TF) | 4 | Manuels / scénarios | Voir ci-dessous | | **Total automatisé** | **34** | **34 exécutés** | **34/34 réussis** | Exécution réelle : `pytest tests/ -v` contre une base MariaDB 10.11 dédiée (`gesthub_test`), sortie complète dans `docs/evidence/pytest_output.txt`. Contrairement à des tests reposant sur des mocks de la couche SQL, cette suite détecte aussi les erreurs de requête (colonnes, contraintes) — c'est d'ailleurs ainsi qu'ont été trouvés les 3 bugs mentionnés en Annexe A1. ## Détail des tests unitaires (UT) | ID | Fonction testée | Entrée | Résultat attendu | |---|---|---|---| | UT-01 | `annonce_service.create_annonce` | titre/contenu valides | Ligne créée, id retourné | | UT-02 | `create_annonce` | titre vide | `ValidationError` | | UT-03 | `create_annonce` | contenu vide/espaces | `ValidationError` | | UT-04 | `update_annonce` | annonce existante | Champs mis à jour | | UT-05 | `update_annonce` / `delete_annonce` | id inexistant | `AnnonceNotFoundError` | | UT-06 | `fichier_service.step2_check_size` | fichier > taille max / vide | `FileValidationError` | | UT-07 | `step4_check_extension` | extension interdite / autorisée | Erreur / extension renvoyée | | UT-08 | `step5_generate_safe_name` / `step1_check_presence` | deux appels / fichier absent | Noms uniques / erreur | | UT-09 à UT-12 | `auth_service.is_admin` | avec/sans groupe `/admin`, `None`, sans champ `groups` | `True`/`False` cohérents | | (suppl.) | `handle_upload` bout en bout | fichier PDF valide | Upload complet réussi | ## Détail des tests d'intégration (IT) — client de test Flask | ID | Route | Cas | Résultat attendu | |---|---|---|---| | IT-01 | `GET /api/annonces` | sans session | 401 | | IT-02 | `GET /api/annonces` | utilisateur standard | 200, liste vide | | IT-03 | `POST /api/annonces` | utilisateur standard (non admin) | 403 | | IT-04 | `POST /api/annonces` puis `GET` | admin | 201, annonce visible | | IT-05 | `PUT /api/annonces/{id}` | admin | 200 | | IT-06 | `DELETE /api/annonces/{id}` | admin | 200 | | IT-07 | `GET /api/is_admin` | admin vs standard | reflète le groupe réel | | IT-08 | `POST /api/fichiers/upload` | sans fichier joint | 400 | | IT-09 | `POST /api/evenements` | date_fin < date_debut | 400 | | IT-10 | `GET /` | sans session | 302 vers `/login` | | (suppl.) | `POST /api/annonces` | titre manquant | 400 | ## Détail des tests de sécurité (TS) — OWASP Top 10 2021 | ID | Vecteur | Résultat attendu | Résultat réel | |---|---|---|---| | TS-01 | Injection SQL dans le titre d'une annonce | Payload stocké tel quel, table intacte | Réussi | | TS-02 | Accès à `/api/fichiers` et `/api/annonces` (POST) sans token | 401 | Réussi | | TS-03 | Cookie de session falsifié (non signé) | Traité comme non authentifié, 401 | Réussi | | TS-04 | Contenu `