HealthActionTest.php 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <?php
  2. declare(strict_types=1);
  3. namespace ShlinkioTest\Shlink\Rest\Action;
  4. use Doctrine\DBAL\Connection;
  5. use Exception;
  6. use Laminas\Diactoros\Response\JsonResponse;
  7. use Laminas\Diactoros\ServerRequest;
  8. use PHPUnit\Framework\TestCase;
  9. use Prophecy\Prophecy\ObjectProphecy;
  10. use Shlinkio\Shlink\Core\Options\AppOptions;
  11. use Shlinkio\Shlink\Rest\Action\HealthAction;
  12. class HealthActionTest extends TestCase
  13. {
  14. private HealthAction $action;
  15. private ObjectProphecy $conn;
  16. public function setUp(): void
  17. {
  18. $this->conn = $this->prophesize(Connection::class);
  19. $this->action = new HealthAction($this->conn->reveal(), new AppOptions(['version' => '1.2.3']));
  20. }
  21. /** @test */
  22. public function passResponseIsReturnedWhenConnectionSucceeds(): void
  23. {
  24. $ping = $this->conn->ping()->willReturn(true);
  25. /** @var JsonResponse $resp */
  26. $resp = $this->action->handle(new ServerRequest());
  27. $payload = $resp->getPayload();
  28. $this->assertEquals(200, $resp->getStatusCode());
  29. $this->assertEquals('pass', $payload['status']);
  30. $this->assertEquals('1.2.3', $payload['version']);
  31. $this->assertEquals([
  32. 'about' => 'https://shlink.io',
  33. 'project' => 'https://github.com/shlinkio/shlink',
  34. ], $payload['links']);
  35. $this->assertEquals('application/health+json', $resp->getHeaderLine('Content-type'));
  36. $ping->shouldHaveBeenCalledOnce();
  37. }
  38. /** @test */
  39. public function failResponseIsReturnedWhenConnectionFails(): void
  40. {
  41. $ping = $this->conn->ping()->willReturn(false);
  42. /** @var JsonResponse $resp */
  43. $resp = $this->action->handle(new ServerRequest());
  44. $payload = $resp->getPayload();
  45. $this->assertEquals(503, $resp->getStatusCode());
  46. $this->assertEquals('fail', $payload['status']);
  47. $this->assertEquals('1.2.3', $payload['version']);
  48. $this->assertEquals([
  49. 'about' => 'https://shlink.io',
  50. 'project' => 'https://github.com/shlinkio/shlink',
  51. ], $payload['links']);
  52. $this->assertEquals('application/health+json', $resp->getHeaderLine('Content-type'));
  53. $ping->shouldHaveBeenCalledOnce();
  54. }
  55. /** @test */
  56. public function failResponseIsReturnedWhenConnectionThrowsException(): void
  57. {
  58. $ping = $this->conn->ping()->willThrow(Exception::class);
  59. /** @var JsonResponse $resp */
  60. $resp = $this->action->handle(new ServerRequest());
  61. $payload = $resp->getPayload();
  62. $this->assertEquals(503, $resp->getStatusCode());
  63. $this->assertEquals('fail', $payload['status']);
  64. $this->assertEquals('1.2.3', $payload['version']);
  65. $this->assertEquals([
  66. 'about' => 'https://shlink.io',
  67. 'project' => 'https://github.com/shlinkio/shlink',
  68. ], $payload['links']);
  69. $this->assertEquals('application/health+json', $resp->getHeaderLine('Content-type'));
  70. $ping->shouldHaveBeenCalledOnce();
  71. }
  72. }