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
This commit is contained in:
122
tests/Framework/Router/HttpRouterTest.php
Normal file
122
tests/Framework/Router/HttpRouterTest.php
Normal file
@@ -0,0 +1,122 @@
|
||||
<?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);
|
||||
});
|
||||
86
tests/Framework/Router/ParameterProcessorDebugTest.php
Normal file
86
tests/Framework/Router/ParameterProcessorDebugTest.php
Normal file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use App\Framework\DI\DefaultContainer;
|
||||
use App\Framework\Http\ControllerRequestFactory;
|
||||
use App\Framework\Logging\DefaultLogger;
|
||||
use App\Framework\Reflection\ReflectionProvider;
|
||||
use App\Framework\Router\ParameterProcessor;
|
||||
|
||||
describe('ParameterProcessor Debug', function () {
|
||||
test('debug parameter processing for filename parameter', function () {
|
||||
// Mock dependencies
|
||||
$container = $this->createMock(DefaultContainer::class);
|
||||
$requestFactory = $this->createMock(ControllerRequestFactory::class);
|
||||
$logger = $this->createMock(DefaultLogger::class);
|
||||
$reflectionProvider = $this->createMock(ReflectionProvider::class);
|
||||
|
||||
$processor = new ParameterProcessor($container, $requestFactory, $logger, $reflectionProvider);
|
||||
|
||||
// Simulate the parameter data that would come from UnifiedRouteVisitor
|
||||
$params = [
|
||||
[
|
||||
'name' => 'filename',
|
||||
'type' => 'string',
|
||||
'isBuiltin' => true,
|
||||
'hasDefault' => false,
|
||||
'default' => null,
|
||||
'isOptional' => false,
|
||||
'attributes' => [],
|
||||
],
|
||||
];
|
||||
|
||||
// Simulate the query params that would come from DynamicRoute->paramValues
|
||||
$queryParams = [
|
||||
'filename' => 'test-image.jpg',
|
||||
];
|
||||
|
||||
// Erwartung: filename sollte 'test-image.jpg' sein, nicht null
|
||||
$result = $processor->prepareParameters($params, $queryParams);
|
||||
|
||||
expect($result)->toHaveCount(1);
|
||||
expect($result[0])->toBe('test-image.jpg');
|
||||
expect($result[0])->not->toBeNull();
|
||||
});
|
||||
|
||||
test('debug parameter processing when parameter name missing from queryParams', function () {
|
||||
$container = $this->createMock(DefaultContainer::class);
|
||||
$requestFactory = $this->createMock(ControllerRequestFactory::class);
|
||||
$logger = $this->createMock(DefaultLogger::class);
|
||||
$reflectionProvider = $this->createMock(ReflectionProvider::class);
|
||||
|
||||
$processor = new ParameterProcessor($container, $requestFactory, $logger, $reflectionProvider);
|
||||
|
||||
$params = [
|
||||
[
|
||||
'name' => 'filename',
|
||||
'type' => 'string',
|
||||
'isBuiltin' => true,
|
||||
'hasDefault' => false,
|
||||
'default' => null,
|
||||
'isOptional' => false,
|
||||
'attributes' => [],
|
||||
],
|
||||
];
|
||||
|
||||
// Empty queryParams - das ist wahrscheinlich unser Problem
|
||||
$queryParams = [];
|
||||
|
||||
// Das wird null zurückgeben - das ist der Bug!
|
||||
$result = $processor->prepareParameters($params, $queryParams);
|
||||
|
||||
expect($result)->toHaveCount(1);
|
||||
expect($result[0])->toBeNull(); // Das ist der aktuelle Bug
|
||||
|
||||
// Debug: Show what's happening
|
||||
error_log('Parameter processing with empty queryParams - result: ' . json_encode($result));
|
||||
});
|
||||
|
||||
test('debug how DynamicRoute paramValues should be populated', function () {
|
||||
// Test wie paramValues in DynamicRoute gesetzt werden sollten
|
||||
// Das sollte von HttpRouter oder RouteDispatcher gemacht werden
|
||||
|
||||
expect(true)->toBeTrue(); // Placeholder test
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user