pathProvider = new PathProvider(__DIR__ . '/../../../../'); $this->container = new DefaultContainer(); $this->templateRenderer = Mockery::mock(TemplateRenderer::class); $this->requestId = new RequestId('test-secret-for-integration-tests'); }); it('detects admin routes correctly using reflection', function () { $request = new HttpRequest( method: Method::GET, path: '/admin/dashboard', id: $this->requestId ); $responder = new RouteResponder( $this->pathProvider, $this->container, $this->templateRenderer, $request ); // Use reflection to test private method $reflection = new ReflectionClass($responder); $method = $reflection->getMethod('isAdminRoute'); $method->setAccessible(true); expect($method->invoke($responder, '/admin/dashboard'))->toBeTrue(); expect($method->invoke($responder, '/admin'))->toBeTrue(); expect($method->invoke($responder, '/admin/users'))->toBeTrue(); expect($method->invoke($responder, '/'))->toBeFalse(); expect($method->invoke($responder, '/api/users'))->toBeFalse(); expect($method->invoke($responder, '/admin-api/users'))->toBeFalse(); }); it('does not enrich non-admin routes', function () { $request = new HttpRequest( method: Method::GET, path: '/home', id: $this->requestId ); $responder = new RouteResponder( $this->pathProvider, $this->container, $this->templateRenderer, $request ); $viewResult = new ViewResult( template: 'home', metaData: new MetaData('Home'), data: ['title' => 'Home'] ); $context = $responder->getContext($viewResult); expect($context)->toBeInstanceOf(RenderContext::class); expect($context->data)->not->toHaveKey('navigation_menu'); expect($context->data)->not->toHaveKey('breadcrumbs'); expect($context->data['title'])->toBe('Home'); }); it('handles missing AdminLayoutProcessor gracefully for admin routes', function () { $request = new HttpRequest( method: Method::GET, path: '/admin/dashboard', id: $this->requestId ); // Container doesn't have AdminLayoutProcessor registered // (it's a fresh container without it) $responder = new RouteResponder( $this->pathProvider, $this->container, $this->templateRenderer, $request ); $viewResult = new ViewResult( template: 'dashboard', metaData: new MetaData('Dashboard'), data: ['title' => 'Dashboard'] ); // Should not throw, but return original data $context = $responder->getContext($viewResult); expect($context)->toBeInstanceOf(RenderContext::class); expect($context->data['title'])->toBe('Dashboard'); }); });