first commit
This commit is contained in:
109
tests/Auth/MiddlewareTest.php
Normal file
109
tests/Auth/MiddlewareTest.php
Normal file
@@ -0,0 +1,109 @@
|
||||
<?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);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user