# 06 — Plan de tests

> Stratégie de tests de yima-shop. L'infra fonctionnelle existe déjà (voir mémoire « tests fonctionnels API »).

## Pyramide de tests

```
        e2e / PWA (Cypress/Playwright, plus tard)      ← peu, flux critiques
     ┌───────────────────────────────────────────┐
     │  Fonctionnels API (WebTestCase)            │    ← moyen, par module
     │  login, ventes, caisse, permissions        │
   ┌─────────────────────────────────────────────────┐
   │  Unitaires (PHPUnit, mocks)                       │  ← beaucoup, logique métier
   │  services, calculs (totaux, TVA, remises), voters │
   └───────────────────────────────────────────────────┘
```

## Ce qui existe ✅

- **Unitaires** : `tests/Service/Security/EncryptionServiceTest.php`, `PermissionResolverTest.php`, `tests/Security/CompanyVoterTest.php`.
- **Fonctionnels API** : `tests/Functional/Api/AuthApiTest.php` (login/JWT/refresh/me + erreurs).
- **Config test** : `.env.test` (clés JWT dédiées, `APP_ENCRYPTION_KEY`, `ENABLE_TOKEN_SECURITY_VALIDATION=false`), base `yima-shop_test`, `phpunit.dist.xml` (strict : `failOnDeprecation/Notice/Warning`).
- **Scripts manuels** : `tests/api/*.php` (cURL).

## Règles par type

### Unitaires
- Cibler la logique pure : calcul de **totaux/remises/TVA**, arrondis FCFA (centimes), transitions d'état (vente, session de caisse), résolution de permissions.
- Mocks pour les repositories/services ; pas de DB.
- Data providers en **attribut** `#[DataProvider]` (PHPUnit 12 n'honore plus l'annotation docblock).

### Fonctionnels (WebTestCase)
- Un fichier par domaine : `tests/Functional/Api/{Sales,Catalog,CashSession,…}ApiTest.php`.
- **Seed idempotent** en `setUp()` (find-or-create) ; pas de dépendance à l'ordre.
- Vérifier : happy path + erreurs (401/403/422) + **autorisation** (permission manquante → 403).
- Garder le même client (UA/IP constants) ; token security désactivé en test.

### Tests d'autorisation
- Pour chaque endpoint : un utilisateur **autorisé** (200) et un **non autorisé** (403). Table de vérité par permission.

### Idempotence & hors-ligne
- Rejouer une création de vente avec le même `Idempotency-Key` → une seule vente créée.

## Prérequis base de test (une fois)

```bash
php bin/console doctrine:database:create --env=test --if-not-exists
php bin/console doctrine:schema:update --force --env=test
```

## Lancer

```bash
php bin/phpunit                                  # toute la suite
php bin/phpunit tests/Functional/Api/            # fonctionnels API
php bin/phpunit --filter testSaleAnonymous       # ciblé
```

## Données de test

- Client de test **AmansaShop** (`AppFixtures::createAmansaShop`) : manager `yalya96@gmail.com` / `Welcome123@`, base `amansa`.
- Les tests fonctionnels **re-seedent** leurs entités (indépendance).

## Couverture visée

- Flux critiques (auth, vente, paiement, caisse, permissions) : **≥ 80 %**.
- Chaque module livré ⇒ tests unitaires (logique) + ≥ 1 test fonctionnel (endpoint principal) + tests d'accès.

## CI (à mettre en place — phase 7)

- Job : install, préparer base test, `php bin/phpunit`, `lint:container`, `lint:twig`, `lint:yaml`.
- Échec bloquant sur test rouge ou lint KO.

## Vérifications non-régression transverses

- `doctrine:schema:update --dump-sql` : **aucun DROP** inattendu.
- `lint:container` vert après ajout de services.
- Aucune fuite de secret dans `var/logs/`.

## Suite

Suivi d'avancement : [07 — Suivi](07-suivi.md).
