sessionManager = $this->createMock(SessionManagerInterface::class); $this->request = (new ServerRequestFactory())->createServerRequest('GET', '/admin'); } public function testAuthMiddlewareRedirectsGuests(): void { $this->sessionManager->method('isAuthenticated')->willReturn(false); $middleware = new AuthMiddleware($this->sessionManager); $response = $middleware->process($this->request, $this->makeHandler()); self::assertSame(302, $response->getStatusCode()); self::assertSame('/auth/login', $response->getHeaderLine('Location')); } public function testAuthMiddlewareDelegatesWhenAuthenticated(): void { $this->sessionManager->method('isAuthenticated')->willReturn(true); $middleware = new AuthMiddleware($this->sessionManager); $response = $middleware->process($this->request, $this->makeHandler(204)); self::assertSame(204, $response->getStatusCode()); } public function testAdminMiddlewareRedirectsNonAdmins(): void { $this->sessionManager->method('isAdmin')->willReturn(false); $middleware = new AdminMiddleware($this->sessionManager); $response = $middleware->process($this->request, $this->makeHandler()); self::assertSame(302, $response->getStatusCode()); self::assertSame('/admin/posts', $response->getHeaderLine('Location')); } public function testAdminMiddlewareDelegatesForAdmins(): void { $this->sessionManager->method('isAdmin')->willReturn(true); $middleware = new AdminMiddleware($this->sessionManager); $response = $middleware->process($this->request, $this->makeHandler(204)); self::assertSame(204, $response->getStatusCode()); } public function testEditorMiddlewareRedirectsWhenNeitherAdminNorEditor(): void { $this->sessionManager->method('isAdmin')->willReturn(false); $this->sessionManager->method('isEditor')->willReturn(false); $middleware = new EditorMiddleware($this->sessionManager); $response = $middleware->process($this->request, $this->makeHandler()); self::assertSame(302, $response->getStatusCode()); self::assertSame('/admin/posts', $response->getHeaderLine('Location')); } public function testEditorMiddlewareDelegatesForEditors(): void { $this->sessionManager->method('isAdmin')->willReturn(false); $this->sessionManager->method('isEditor')->willReturn(true); $middleware = new EditorMiddleware($this->sessionManager); $response = $middleware->process($this->request, $this->makeHandler(204)); self::assertSame(204, $response->getStatusCode()); } private function makeHandler(int $status = 200): RequestHandlerInterface { return new class ($status) implements RequestHandlerInterface { public function __construct(private readonly int $status) { } public function handle(ServerRequestInterface $request): ResponseInterface { return new Response($this->status); } }; } }