110 lines
3.8 KiB
PHP
110 lines
3.8 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Auth;
|
|
|
|
use App\Auth\Middleware\AdminMiddleware;
|
|
use App\Auth\Middleware\AuthMiddleware;
|
|
use App\Auth\Middleware\EditorMiddleware;
|
|
use App\Shared\Http\SessionManagerInterface;
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Psr\Http\Message\ResponseInterface;
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
use Psr\Http\Server\RequestHandlerInterface;
|
|
use Slim\Psr7\Factory\ServerRequestFactory;
|
|
use Slim\Psr7\Response;
|
|
|
|
final class MiddlewareTest extends TestCase
|
|
{
|
|
/** @var SessionManagerInterface&MockObject */
|
|
private SessionManagerInterface $sessionManager;
|
|
|
|
private ServerRequestInterface $request;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->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);
|
|
}
|
|
};
|
|
}
|
|
}
|