---
title: "Tests — Documentation Fonctionnelle"
module: dev
type: functional
status: active
updated: 2026-03-13
---

# Tests — Documentation Fonctionnelle

> Stratégie de tests de l'application ISI-APP : organisation, commandes et patterns principaux.

---

## Vue d'ensemble

ISI-APP utilise PHPUnit 12 comme framework de test unique. La suite compte plus de 1 100 tests couvrant l'authentification, les accès, les middlewares et les fonctionnalités métier. Les tests s'exécutent sur une base de données MySQL dédiée avec rollback automatique entre chaque test (aucune donnée persistée).

## Accès

Les tests sont réservés aux développeurs. Ils s'exécutent en ligne de commande depuis la racine du projet.

## Commandes principales

| Commande | Usage |
|----------|-------|
| `php artisan test --compact` | Lancer toute la suite |
| `php artisan test --compact --filter=NomDuTest` | Lancer un seul test |
| `php artisan test --compact tests/Feature/MonFichier.php` | Lancer un fichier |

Avant de finaliser : `vendor/bin/duster fix --dirty` pour formater le code.

## Organisation des tests

Les tests sont organisés en deux suites :

- **Unit** (`tests/Unit/`) — tests unitaires isolés
- **Feature** (`tests/Feature/`) — tests fonctionnels avec requêtes HTTP

Chaque domaine dispose de son propre dossier : `Auth/`, `Store/`, etc.

## Patterns de tests

### Authentification et session

Tous les tests nécessitant un utilisateur connecté utilisent le trait `AuthenticatesUser` qui expose trois méthodes : `createTestUser()` (crée un utilisateur de test), `loginTestUser()` (POST sur `/login`) et `setupTestSession()` (construit la session directement sans passer par le flow de connexion).

### Patterns courants par type de fonctionnalité

| Fonctionnalité | Ce qui est testé |
|---------------|-----------------|
| Liste / tableau | Tri, recherche, pagination, filtres |
| Création | Formulaire rempli → enregistrement en base, modal fermée, liste rafraîchie |
| Modification | Formulaire pré-rempli → mise à jour en base, soft delete respecté |
| Suppression | Confirmation SweetAlert → `dtdel` mis à jour, élément masqué de la liste |
| Export | Fichier généré (Excel / PDF), format valide |
| Import | Prévisualisation correcte, changements appliqués après confirmation |
| Filtres | Résultats cohérents avec les options sélectionnées |
| Multi-tenant | Seules les données du tenant courant sont visibles |
| ACL | Les utilisateurs sans droit ne voient rien ou obtiennent une erreur 403 |

### Edge cases à couvrir systématiquement

- Recherche vide : tous les éléments affichés
- Champ obligatoire manquant : message de validation visible
- Export sur un grand jeu de données (1 000+ lignes)
- Import d'un enregistrement en double : erreur ou mise à jour selon la règle métier
- Soft delete : les éléments supprimés ne réapparaissent pas dans les listes
- Isolation multi-tenant : un utilisateur ne peut pas accéder aux données d'un autre tenant

## Checklist avant mise en production

- [ ] Toutes les opérations CRUD testées (créer, lire, modifier, supprimer)
- [ ] Tous les filtres appliqués correctement
- [ ] La recherche couvre toutes les colonnes concernées
- [ ] Export Excel / PDF fonctionnel
- [ ] Prévisualisation d'import correcte, changements appliqués
- [ ] Pagination (première, dernière, suivante, précédente)
- [ ] Tri des colonnes (ascendant / descendant)
- [ ] Soft delete : l'élément disparaît après suppression
- [ ] Multi-tenant : aucune fuite de données entre tenants
- [ ] ACL : les utilisateurs sans droits ne voient rien

## Voir aussi

- Documentation technique : `.claude/technical-docs/dev/tests.md`
- Patterns rapides : `.claude/technical-docs/dev/test-patterns-quick-ref.md`
