lthn.io/app/Core/Tests/Unit/ApiVersionTest.php
Claude 41a90cbff8
feat: lthn.io API serving live chain data
Fixed: basePath self→static binding, namespace detection, event wiring,
SQLite cache, file cache driver. All Mod Boot classes converted to
$listens pattern for lifecycle event discovery.

Working endpoints:
- /v1/explorer/info — live chain height, difficulty, aliases
- /v1/explorer/stats — formatted chain statistics
- /v1/names/directory — alias directory grouped by type
- /v1/names/available/{name} — name availability check
- /v1/names/lookup/{name} — name details

Co-Authored-By: Charon <charon@lethean.io>
2026-04-03 17:17:42 +01:00

93 lines
2.6 KiB
PHP

<?php
declare(strict_types=1);
namespace Core\Tests\Unit;
use Core\Front\Api\ApiVersionService;
use Core\Front\Api\Middleware\ApiSunset;
use Core\Front\Api\Middleware\ApiVersion;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use PHPUnit\Framework\TestCase;
/**
* Tests for API Versioning components.
*
* @covers \Core\Front\Api\Middleware\ApiVersion
* @covers \Core\Front\Api\Middleware\ApiSunset
* @covers \Core\Front\Api\ApiVersionService
*/
class ApiVersionTest extends TestCase
{
protected function setUp(): void
{
parent::setUp();
// Mock config helper
if (! function_exists('config')) {
// This will be overridden when running in Laravel context
}
}
/**
* Helper to create middleware with mocked config.
*/
protected function createMiddleware(array $config = []): ApiVersion
{
$defaults = [
'default' => 1,
'current' => 2,
'supported' => [1, 2],
'deprecated' => [1],
'sunset' => [1 => '2025-12-31'],
];
$merged = array_merge($defaults, $config);
// We need to run these tests in Laravel context
// This file documents the expected behavior
return new ApiVersion;
}
}
/*
* API Version Test Documentation
*
* These tests require a Laravel application context to run.
* Run them using: php artisan test --filter=ApiVersion
*
* Expected behaviors to test:
*
* ApiVersion Middleware:
* - extracts version from URL path /api/v1/
* - extracts version from URL path /v2/ without api prefix
* - extracts version from Accept-Version header
* - extracts version from Accept-Version header without v prefix
* - extracts version from Accept header vendor type
* - uses default version when none specified
* - prefers URL path over headers
* - returns 400 for unsupported version
* - returns 400 when version is below minimum required
* - adds X-API-Version header to response
* - adds deprecation headers for deprecated versions
* - does not add deprecation headers for current version
*
* ApiSunset Middleware:
* - adds Sunset header with date
* - adds Link header when replacement provided
* - formats date to RFC7231 format
*
* ApiVersionService:
* - returns current version from request
* - returns version string from request
* - checks specific version
* - provides version shortcuts (isV1, isV2)
* - checks minimum version
* - checks if version is deprecated
* - returns configuration values
* - checks if version is supported
* - negotiates response based on version
* - falls back to lower version in negotiation
* - transforms data based on version
*/