Files
alrahma_sunday_school_api/tests/Feature/Api/V1/FullSurface/ApiCrossVersionRouteCompatibilityMatrixTest.php
T
2026-06-08 23:45:55 -04:00

47 lines
2.0 KiB
PHP

<?php
namespace Tests\Feature\Api\V1\FullSurface;
use Tests\Feature\Api\V1\FullSurface\Support\FullSurfaceE2EContractCase;
class ApiCrossVersionRouteCompatibilityMatrixTest extends FullSurfaceE2EContractCase
{
public function test_v1_and_unversioned_auth_routes_keep_failure_contract_compatible(): void
{
$pairs = [
['/api/v1/auth/login', '/api/login'],
['/api/v1/auth/logout', '/api/logout'],
['/api/v1/auth/me', '/api/user'],
];
foreach ($pairs as [$versioned, $legacy]) {
$versionedResponse = str_contains($versioned, 'login')
? $this->postJson($versioned, ['email' => 'bad@example.test', 'password' => 'wrong'])
: $this->actingAs($this->admin, 'api')->getJson($versioned);
$legacyResponse = str_contains($legacy, 'login')
? $this->postJson($legacy, ['email' => 'bad@example.test', 'password' => 'wrong'])
: $this->actingAs($this->admin, 'api')->getJson($legacy);
$this->assertNoServerError($versionedResponse, 'versioned compatibility ' . $versioned);
$this->assertNoServerError($legacyResponse, 'legacy compatibility ' . $legacy);
$this->assertLessThan(500, $versionedResponse->getStatusCode());
$this->assertLessThan(500, $legacyResponse->getStatusCode());
}
}
public function test_legacy_routes_do_not_expand_beyond_documented_aliases_silently(): void
{
$legacyLike = [];
foreach ($this->apiRoutes() as $route) {
$uri = $route->uri();
if (! str_starts_with($uri, 'api/v1/') && ! str_contains($uri, 'docs') && ! str_contains($uri, 'health')) {
$legacyLike[] = $this->primaryMethod($route) . ' ' . $uri;
}
}
$this->assertLessThan(80, count($legacyLike), 'Unversioned API compatibility routes should remain bounded, not become a second API by accident: ' . implode(', ', $legacyLike));
}
}