Laravel
Laravel • Module Test • Chapitre 5

Tests d'Authentification & API Sanctum

Dans une API Laravel, la sécurisation des routes repose sur Laravel Sanctum. Grâce à la méthode Sanctum::actingAs(), vous pouvez authentifier instantanément un utilisateur de test et lui assigner des capacités (token abilities) granulaires sans avoir à générer manuellement de vrais jetons d'accès.

🔐
Sanctum::actingAs

Injecte l'utilisateur authentifié et son token virtuel directement dans le conteneur pour tous les appels getJson().

🎯
Token Abilities

Test des permissions fines (ex: ['invoices:read']) protégées par le middleware ability.

📐
assertJsonStructure

Validation récursive de l'arborescence JSON pour certifier que l'API respecte les contrats attendus par le Frontend.

🛡️
Policies & Gates

Vérification des règles d'autorisation métier au niveau modèle avec $this->authorize() (retourne 403 Forbidden).

Studio Interactif : Contrôle des Capacités Sanctum (Token Abilities)

Configurez les abilities du jeton Sanctum simulé pour observer l'évaluation des permissions par le middleware.

Tentative d'action sur l'API :
Middleware requis : ability:orders:read
Statut de réponse obtenu : 200 OK
// Script de test Pest avec Sanctum :
$user = User::factory()->create();
Sanctum::actingAs($user, ['orders:read']);
$response = $this->getJson('/api/orders');
✓ $response->assertStatus(200); // PASS
1. Test de Structure JSON Complète

Vérifiez la forme exacte des données paginées retournées par l'API sans tester chaque valeur une par une.

it('retourne la liste paginée avec la structure attendue', function () {
    $user = User::factory()->create();
    Order::factory()->count(2)->create(['user_id' => $user->id]);

    Sanctum::actingAs($user, ['orders:read']);

    $response = $this->getJson('/api/orders');

    $response->assertOk()
        ->assertJsonStructure([
            'data' => [
                '*' => ['id', 'amount', 'status', 'created_at']
            ],
            'links' => ['first', 'last', 'prev', 'next'],
            'meta'  => ['current_page', 'from', 'last_page', 'total']
        ]);
});
2. Test de Policy d'Autorisation (403 Forbidden)

Vérifiez qu'un utilisateur ne peut pas modifier un article qui appartient à un autre auteur.

it('interdit la modification d un article tiers via la Policy', function () {
    $auteur = User::factory()->create();
    $intrus = User::factory()->create();
    $post = Post::factory()->create(['user_id' => $auteur->id]);

    Sanctum::actingAs($intrus);

    $response = $this->putJson("/api/posts/{$post->id}", [
        'title' => 'Titre piraté',
    ]);

    $response->assertForbidden(); // 403 Forbidden retourné par PostPolicy
});