1
0

InternalTokenMiddlewareTest.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Tests\Unit\Http;
  4. use App\Infrastructure\Http\Middleware\InternalTokenMiddleware;
  5. use PHPUnit\Framework\TestCase;
  6. use Psr\Http\Message\ResponseInterface;
  7. use Psr\Http\Message\ServerRequestInterface;
  8. use Psr\Http\Server\RequestHandlerInterface;
  9. use Slim\Psr7\Factory\ResponseFactory;
  10. use Slim\Psr7\Factory\ServerRequestFactory;
  11. /**
  12. * Token gate uses `hash_equals`, refuses an empty configured token, and
  13. * lets correct tokens through.
  14. */
  15. final class InternalTokenMiddlewareTest extends TestCase
  16. {
  17. public function testValidTokenPassesThrough(): void
  18. {
  19. $middleware = new InternalTokenMiddleware(new ResponseFactory(), 'shhh');
  20. [$handler, $response] = $this->dispatch($middleware, 'Bearer shhh');
  21. self::assertSame(204, $response->getStatusCode());
  22. self::assertTrue($handler->reached);
  23. }
  24. public function testWrongTokenIs401(): void
  25. {
  26. $middleware = new InternalTokenMiddleware(new ResponseFactory(), 'shhh');
  27. [$handler, $response] = $this->dispatch($middleware, 'Bearer wrong');
  28. self::assertSame(401, $response->getStatusCode());
  29. self::assertFalse($handler->reached);
  30. }
  31. public function testMissingHeaderIs401(): void
  32. {
  33. $middleware = new InternalTokenMiddleware(new ResponseFactory(), 'shhh');
  34. [$handler, $response] = $this->dispatch($middleware, null);
  35. self::assertSame(401, $response->getStatusCode());
  36. self::assertFalse($handler->reached);
  37. }
  38. public function testNonBearerSchemeIs401(): void
  39. {
  40. $middleware = new InternalTokenMiddleware(new ResponseFactory(), 'shhh');
  41. [$handler, $response] = $this->dispatch($middleware, 'Basic shhh');
  42. self::assertSame(401, $response->getStatusCode());
  43. self::assertFalse($handler->reached);
  44. }
  45. public function testEmptyConfiguredTokenFailsClosed(): void
  46. {
  47. $middleware = new InternalTokenMiddleware(new ResponseFactory(), '');
  48. [$handler, $response] = $this->dispatch($middleware, 'Bearer anything');
  49. self::assertSame(401, $response->getStatusCode());
  50. self::assertFalse($handler->reached);
  51. }
  52. /**
  53. * @return array{0: object, 1: ResponseInterface}
  54. */
  55. private function dispatch(InternalTokenMiddleware $middleware, ?string $auth): array
  56. {
  57. $request = (new ServerRequestFactory())->createServerRequest('POST', '/internal/jobs/tick');
  58. if ($auth !== null) {
  59. $request = $request->withHeader('Authorization', $auth);
  60. }
  61. $handler = new class () implements RequestHandlerInterface {
  62. public bool $reached = false;
  63. public function handle(ServerRequestInterface $request): ResponseInterface
  64. {
  65. $this->reached = true;
  66. return (new ResponseFactory())->createResponse(204);
  67. }
  68. };
  69. return [$handler, $middleware->process($request, $handler)];
  70. }
  71. }