ldc-arcadia-api/TEST.md
Jérémy Munsch 41dbb04963
test(Architecture): ensure all Unit and Integration tests declare covers()
Added a test to verify that every Unit and Integration test file contains a covers() declaration.
2026-08-13 12:02:43 +02:00

4 KiB

Tests — Arcadia API

Ce document récapitule la stratégie et l'organisation des tests dans Arcadia API.

Sommaire


1. Commandes

# Exécuter l'ensemble de la suite de tests
composer test

# Exécuter les tests avec couverture de code (seuil minimal 85%)
composer test:coverage

2. Pyramide de Tests

                  .
                 / \
                /   \         1. FEATURE TESTS (Contrat OpenAPI & E2E)
               /     \        ----------------------------------------
              / Feature\      - Respect du contrat OpenAPI (openapi.yaml)
             /----------\     - Codes statut HTTP (200, 404, 422, 429) & Auth HMAC
            /            \    - Validation de bout en bout des réponses JSON
           / Integration  \
          /----------------\  2. INTEGRATION TESTS (Infra & Laravel)
         /                  \ ----------------------------------------
        /                    \- Adaptateurs Eloquent (requêtes BDD réelles)
       /        Unit          \- Service Providers & Bindings Laravel
      /                        \- Clients & adaptateurs de services externes
     /--------------------------\
    /                            \ 3. UNIT TESTS (Domaine & Use Cases)
   /                              \------------------------------------
  /                                \- Entités DDD, Value Objects, règles métier
 /                                  \- Use Cases (avec Mocks de Ports)
/____________________________________\- Pure PHP (sans instanciation de Laravel)

3. Structure des Dossiers

L'arborescence tests/ reproduit en miroir la structure de src/ :

  • tests/Architecture/ : Tests de règles d'architecture DDD, dépendances inter-couches et conventions (Pest Arch).
  • tests/Unit/ : Tests unitaires purs (sans conteneur Laravel, sans BDD, exécution instantanée).
  • tests/Integration/ : Tests des adaptateurs d'infrastructure (BDD, services).
  • tests/Feature/ : Tests de bout en bout des endpoints API (requêtes HTTP, middleware, réponses JSON).

4. Conventions de Code

Principes F.I.R.S.T.

Chaque test rédigé dans ce projet doit obligatoirement respecter les principes F.I.R.S.T. :

  • Fast (Rapide) : Les tests (en particulier unitaires) doivent s'exécuter en quelques millisecondes pour un feedback immédiat.
  • Isolated / Independent (Isolé) : Les tests ne doivent jamais dépendre les uns des autres ni de l'ordre d'exécution. Chaque test initialise son propre état et le nettoie.
  • Repeatable (Répétable) : Le test produit exactement le même résultat dans tous les environnements (machine locale, CI GitLab, conteneur Docker).
  • Self-validating (Auto-validant) : Le test passe ou échoue de façon binaire (OK / FAIL), sans nécessiter d'analyse manuelle des logs.
  • Timely (Opportun) : Les tests sont écrits au bon moment (en TDD ou simultanément avec le code de production).

Declaration covers() et Pattern GWT

Tous les tests unitaires (tests/Unit) et d'intégration (tests/Integration) doivent obligatoirement déclarer la classe ciblée via covers(NomDeLaClasse::class);, utiliser des blocs de commentaires explicites // GIVEN, // WHEN, // THEN et appartenir à un namespace Tests\... (vérifié par test d'architecture) :

namespace Tests\Unit\Domain\Models\ValueObjects;

use Domain\Models\ValueObjects\Entities\ArcadiaEmployeeId;

covers(ArcadiaEmployeeId::class);

it('validates an employee id', function (): void {
    // GIVEN
    $id = '12345678';

    // WHEN
    $entityId = new ArcadiaEmployeeId($id);

    // THEN
    expect($entityId->value)->toBe($id);
});