# Stratégie de tests

## Niveaux

### Unit (`tests/Unit`)

Tests rapides du Domain et de l'Application. Ils n'utilisent ni base de données ni réseau et remplacent les dépendances par des doubles, mocks ou fakes.

### Integration (`tests/Integration`)

Tests des implémentations Infrastructure réelles: mappings Eloquent, migrations, persistence, transactions et services techniques. Ils utilisent MySQL et `RefreshDatabase` lorsqu'un test de base est ajouté.

### Feature (`tests/Feature`)

Tests du contrat HTTP et UI: routes, middleware, authentification, validation, Livewire et rendu principal. Ils ne recopient pas les règles déjà couvertes par les tests unitaires.

## Base de test

Docker crée automatiquement `naneasy_test` via `docker/mysql/init.sql`. PHPUnit force cette base avec `DB_DATABASE=naneasy_test`; la base de développement reste `naneasy`.

```bash
make up
docker compose exec app php artisan migrate --env=testing
docker compose exec app php artisan test --testsuite=Integration
```

Hors Docker, créer une base dédiée puis exporter `DB_CONNECTION=mysql`, `DB_DATABASE=naneasy_test`, `DB_USERNAME` et `DB_PASSWORD`. Ne jamais pointer PHPUnit vers la base de développement.

## Commandes

```bash
php artisan test
php artisan test --testsuite=Unit
php artisan test --testsuite=Integration
php artisan test --testsuite=Feature
```

La CI exécute séparément les trois suites après migration de la base de test. Les tests unitaires restent indépendants de cette base.
