Files
michaelschiemer/tests/Framework/Router/HttpRouterTest.php
Michael Schiemer 55a330b223 Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
2025-08-11 20:13:26 +02:00

123 lines
3.9 KiB
PHP

<?php
declare(strict_types=1);
use App\Framework\Core\DynamicRoute;
use App\Framework\Core\StaticRoute;
use App\Framework\Http\HttpRequest;
use App\Framework\Http\Method;
use App\Framework\Http\Request;
use App\Framework\Router\CompiledRoutes;
use App\Framework\Router\HttpRouter;
use App\Framework\Router\NoRouteMatch;
use App\Framework\Router\RouteContext;
use App\Framework\Router\RouteMatchSuccess;
beforeEach(function () {
// Create test routes
$this->staticRoutes = [
'/home' => new StaticRoute(
controller: 'HomeController',
action: 'index',
parameters: [],
name: 'home',
path: '/home'
),
'/api/status' => new StaticRoute(
controller: 'StatusController',
action: 'check',
parameters: [],
name: 'status',
path: '/api/status'
),
];
// Create properly structured static routes for CompiledRoutes
$staticRoutes = [
'GET' => [
'/home' => $this->staticRoutes['/home'],
'/api/status' => $this->staticRoutes['/api/status'],
],
];
$this->compiledRoutes = new CompiledRoutes(
staticRoutes: $staticRoutes,
dynamicPatterns: [],
namedRoutes: []
);
$this->router = new HttpRouter($this->compiledRoutes);
// Create test request
$this->request = new HttpRequest(
method: Method::GET,
path: '/home'
);
});
it('matches static route successfully', function () {
$context = $this->router->match($this->request);
expect($context)->toBeInstanceOf(RouteContext::class);
expect($context->match)->toBeInstanceOf(RouteMatchSuccess::class);
expect($context->method)->toBe(Method::GET);
expect($context->path)->toBe('/home');
$matchedRoute = $context->match->route;
expect($matchedRoute)->toBeInstanceOf(StaticRoute::class);
expect($matchedRoute->path)->toBe('/home');
expect($matchedRoute->controller)->toBe('HomeController');
expect($matchedRoute->action)->toBe('index');
});
it('matches different static route', function () {
$request = new HttpRequest(method: Method::GET, path: '/api/status');
$context = $this->router->match($request);
expect($context->match)->toBeInstanceOf(RouteMatchSuccess::class);
$matchedRoute = $context->match->route;
expect($matchedRoute->path)->toBe('/api/status');
expect($matchedRoute->controller)->toBe('StatusController');
expect($matchedRoute->action)->toBe('check');
});
it('returns NoRouteMatch for non-existent route', function () {
$request = new HttpRequest(method: Method::GET, path: '/non-existent');
$context = $this->router->match($request);
expect($context->match)->toBeInstanceOf(NoRouteMatch::class);
expect($context->path)->toBe('/non-existent');
});
it('creates correct route context', function () {
$context = $this->router->match($this->request);
expect($context->method)->toBe(Method::GET);
expect($context->path)->toBe('/home');
expect($context->match)->toBeInstanceOf(RouteMatchSuccess::class);
});
it('handles different HTTP methods', function () {
$request = new HttpRequest(method: Method::POST, path: '/home');
$context = $this->router->match($request);
// POST method should not match GET route
expect($context->match)->toBeInstanceOf(NoRouteMatch::class);
});
it('router has optimized routes', function () {
expect($this->router->optimizedRoutes)->toBe($this->compiledRoutes);
});
it('static routes take precedence over dynamic routes', function () {
// This test verifies that static routes are checked first
$context = $this->router->match($this->request);
expect($context->match)->toBeInstanceOf(RouteMatchSuccess::class);
// If this was a dynamic route match, it would be a DynamicRoute
expect($context->match->route)->toBeInstanceOf(StaticRoute::class);
});