Files

37 lines
1.3 KiB
PHP
Raw Permalink Normal View History

<?php
use App\Models\User;
/**
* T6.1 — write-heavy booking/payment endpoints are throttled tighter than
* read-only catalog/routing endpoints (domain.md §8).
*/
test('the booking write limiter is tighter than the catalog read limiter', function () {
$user = User::factory()->create();
$token = $user->createToken('test')->plainTextToken;
$readResponses = collect(range(1, 25))->map(
fn () => $this->withHeader('Authorization', "Bearer {$token}")->getJson('/api/v1/companies')
);
expect($readResponses->every(fn ($response) => $response->status() !== 429))->toBeTrue();
$writeResponses = collect(range(1, 25))->map(
fn () => $this->withHeader('Authorization', "Bearer {$token}")->postJson('/api/v1/bookings', [])
);
expect($writeResponses->contains(fn ($response) => $response->status() === 429))->toBeTrue();
});
test('a rate-limited api request gets a 429 JSON envelope', function () {
$user = User::factory()->create();
$token = $user->createToken('test')->plainTextToken;
$responses = collect(range(1, 25))->map(
fn () => $this->withHeader('Authorization', "Bearer {$token}")->postJson('/api/v1/bookings', [])
);
$limited = $responses->first(fn ($response) => $response->status() === 429);
expect($limited)->not->toBeNull();
$limited->assertJsonStructure(['message']);
});