1
0

ServiceTokenBootstrapTest.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Tests\Integration\Auth;
  4. use App\Domain\Auth\TokenIssuer;
  5. use App\Domain\Auth\TokenKind;
  6. use App\Infrastructure\Auth\ServiceTokenBootstrap;
  7. use App\Tests\Integration\Support\AppTestCase;
  8. final class ServiceTokenBootstrapTest extends AppTestCase
  9. {
  10. public function testBootstrapInsertsServiceTokenRow(): void
  11. {
  12. /** @var ServiceTokenBootstrap $boot */
  13. $boot = $this->container->get(ServiceTokenBootstrap::class);
  14. /** @var TokenIssuer $issuer */
  15. $issuer = $this->container->get(TokenIssuer::class);
  16. $raw = $issuer->issue(TokenKind::Service);
  17. $boot->bootstrap($raw);
  18. $count = (int) $this->db->fetchOne(
  19. "SELECT COUNT(*) FROM api_tokens WHERE kind = 'service'"
  20. );
  21. self::assertSame(1, $count);
  22. }
  23. public function testBootstrapIsIdempotent(): void
  24. {
  25. /** @var ServiceTokenBootstrap $boot */
  26. $boot = $this->container->get(ServiceTokenBootstrap::class);
  27. /** @var TokenIssuer $issuer */
  28. $issuer = $this->container->get(TokenIssuer::class);
  29. $raw = $issuer->issue(TokenKind::Service);
  30. $boot->bootstrap($raw);
  31. $boot->bootstrap($raw);
  32. $boot->bootstrap($raw);
  33. self::assertSame(
  34. 1,
  35. (int) $this->db->fetchOne("SELECT COUNT(*) FROM api_tokens WHERE kind = 'service'")
  36. );
  37. }
  38. public function testBootstrapWithEmptyTokenIsNoOp(): void
  39. {
  40. /** @var ServiceTokenBootstrap $boot */
  41. $boot = $this->container->get(ServiceTokenBootstrap::class);
  42. $boot->bootstrap('');
  43. self::assertSame(
  44. 0,
  45. (int) $this->db->fetchOne("SELECT COUNT(*) FROM api_tokens WHERE kind = 'service'")
  46. );
  47. }
  48. public function testBootstrapWithMalformedTokenIsNoOp(): void
  49. {
  50. /** @var ServiceTokenBootstrap $boot */
  51. $boot = $this->container->get(ServiceTokenBootstrap::class);
  52. $boot->bootstrap('not-a-token');
  53. self::assertSame(
  54. 0,
  55. (int) $this->db->fetchOne("SELECT COUNT(*) FROM api_tokens WHERE kind = 'service'")
  56. );
  57. }
  58. public function testBootstrapWithDifferentTokenInsertsNewRow(): void
  59. {
  60. /** @var ServiceTokenBootstrap $boot */
  61. $boot = $this->container->get(ServiceTokenBootstrap::class);
  62. /** @var TokenIssuer $issuer */
  63. $issuer = $this->container->get(TokenIssuer::class);
  64. $first = $issuer->issue(TokenKind::Service);
  65. $second = $issuer->issue(TokenKind::Service);
  66. $boot->bootstrap($first);
  67. $boot->bootstrap($second);
  68. // Both rows should now exist; operator must revoke the old one manually.
  69. self::assertSame(
  70. 2,
  71. (int) $this->db->fetchOne("SELECT COUNT(*) FROM api_tokens WHERE kind = 'service'")
  72. );
  73. }
  74. }