RefreshHelloassoTokensTest.php 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <?php
  2. namespace App\Tests\Unit\Service\Cron\Job;
  3. use App\Entity\HelloAsso\HelloAsso;
  4. use App\Entity\Organization\Organization;
  5. use App\Repository\HelloAsso\HelloAssoRepository;
  6. use App\Service\Cron\Job\RefreshHelloassoTokens;
  7. use App\Service\Cron\UI\CronUIInterface;
  8. use App\Service\HelloAsso\HelloAssoService;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use PHPUnit\Framework\MockObject\MockObject;
  11. use PHPUnit\Framework\TestCase;
  12. use Psr\Log\LoggerInterface;
  13. class TestableRefreshHelloassoTokens extends RefreshHelloassoTokens
  14. {
  15. public function getHelloassoAccounts(): array
  16. {
  17. return parent::getHelloassoAccounts();
  18. }
  19. }
  20. class RefreshHelloassoTokensTest extends TestCase
  21. {
  22. private CronUIInterface|MockObject $ui;
  23. private MockObject|LoggerInterface $logger;
  24. private EntityManagerInterface|MockObject $entityManager;
  25. private HelloAssoService|MockObject $helloAssoService;
  26. public function setUp(): void
  27. {
  28. $this->ui = $this->getMockBuilder(CronUIInterface::class)->disableOriginalConstructor()->getMock();
  29. $this->logger = $this->getMockBuilder(LoggerInterface::class)->disableOriginalConstructor()->getMock();
  30. $this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
  31. $this->helloAssoService = $this->getMockBuilder(HelloAssoService::class)->disableOriginalConstructor()->getMock();
  32. }
  33. private function getRefreshHelloassoTokensMockFor(string $methodName): TestableRefreshHelloassoTokens|MockObject
  34. {
  35. $refreshHelloassoTokens = $this->getMockBuilder(TestableRefreshHelloassoTokens::class)
  36. ->setConstructorArgs([$this->entityManager, $this->helloAssoService])
  37. ->setMethodsExcept([$methodName, 'setUI', 'setLoggerInterface'])
  38. ->getMock();
  39. $refreshHelloassoTokens->setUI($this->ui);
  40. $refreshHelloassoTokens->setLoggerInterface($this->logger);
  41. return $refreshHelloassoTokens;
  42. }
  43. /**
  44. * @see RefreshHelloassoTokens::preview()
  45. */
  46. public function testPreview(): void
  47. {
  48. $refreshHelloassoTokens = $this->getRefreshHelloassoTokensMockFor('preview');
  49. $organization1 = $this->getMockBuilder(Organization::class)->getMock();
  50. $organization1->method('getId')->willReturn(1);
  51. $organization2 = $this->getMockBuilder(Organization::class)->getMock();
  52. $organization2->method('getId')->willReturn(2);
  53. $helloAsso1 = $this->getMockBuilder(HelloAsso::class)->getMock();
  54. $helloAsso1->method('getOrganization')->willReturn($organization1);
  55. $helloAsso1->method('getRefreshTokenCreatedAt')->willReturn(new \DateTime('2023-01-01 10:00:00'));
  56. $helloAsso2 = $this->getMockBuilder(HelloAsso::class)->getMock();
  57. $helloAsso2->method('getOrganization')->willReturn($organization2);
  58. $helloAsso2->method('getRefreshTokenCreatedAt')->willReturn(new \DateTime('2023-01-02 15:30:00'));
  59. $helloAssoEntities = [$helloAsso1, $helloAsso2];
  60. $refreshHelloassoTokens->expects(self::once())
  61. ->method('getHelloassoAccounts')
  62. ->willReturn($helloAssoEntities);
  63. $this->ui->expects(self::exactly(3))
  64. ->method('print')
  65. ->withConsecutive(
  66. ['Tokens to refresh :'],
  67. [' * Organization 1 : 2023-01-01 10:00:00'],
  68. [' * Organization 2 : 2023-01-02 15:30:00']
  69. );
  70. $refreshHelloassoTokens->preview();
  71. }
  72. /**
  73. * @see RefreshHelloassoTokens::preview()
  74. */
  75. public function testPreviewWhenNoTokens(): void
  76. {
  77. $refreshHelloassoTokens = $this->getRefreshHelloassoTokensMockFor('preview');
  78. $refreshHelloassoTokens->expects(self::once())
  79. ->method('getHelloassoAccounts')
  80. ->willReturn([]);
  81. $this->ui->expects(self::once())
  82. ->method('print')
  83. ->with('No tokens to refresh');
  84. $refreshHelloassoTokens->preview();
  85. }
  86. /**
  87. * @see RefreshHelloassoTokens::execute()
  88. */
  89. public function testExecute(): void
  90. {
  91. $refreshHelloassoTokens = $this->getRefreshHelloassoTokensMockFor('execute');
  92. $organization1 = $this->getMockBuilder(Organization::class)->getMock();
  93. $organization1->method('getId')->willReturn(1);
  94. $organization2 = $this->getMockBuilder(Organization::class)->getMock();
  95. $organization2->method('getId')->willReturn(2);
  96. $helloAsso1 = $this->getMockBuilder(HelloAsso::class)->getMock();
  97. $helloAsso1->method('getOrganization')->willReturn($organization1);
  98. $helloAsso1->method('getRefreshTokenCreatedAt')->willReturn(new \DateTime('2023-01-01 10:00:00'));
  99. $helloAsso2 = $this->getMockBuilder(HelloAsso::class)->getMock();
  100. $helloAsso2->method('getOrganization')->willReturn($organization2);
  101. $helloAsso2->method('getRefreshTokenCreatedAt')->willReturn(new \DateTime('2023-01-02 15:30:00'));
  102. $helloAssoEntities = [$helloAsso1, $helloAsso2];
  103. $refreshHelloassoTokens->expects(self::once())
  104. ->method('getHelloassoAccounts')
  105. ->willReturn($helloAssoEntities);
  106. $this->helloAssoService->expects(self::exactly(2))
  107. ->method('refreshTokens')
  108. ->withConsecutive(
  109. [$helloAsso1],
  110. [$helloAsso2]
  111. );
  112. $this->logger->expects(self::exactly(4))
  113. ->method('info')
  114. ->withConsecutive(
  115. ['2 tokens to refresh'],
  116. [' * Refresh token for organization 1 : 2023-01-01 10:00:00'],
  117. [' * Refresh token for organization 2 : 2023-01-02 15:30:00'],
  118. ['Tokens refreshed']
  119. );
  120. $refreshHelloassoTokens->execute();
  121. }
  122. /**
  123. * @see RefreshHelloassoTokens::execute()
  124. */
  125. public function testExecuteWhenNoTokens(): void
  126. {
  127. $refreshHelloassoTokens = $this->getRefreshHelloassoTokensMockFor('execute');
  128. $refreshHelloassoTokens->expects(self::once())
  129. ->method('getHelloassoAccounts')
  130. ->willReturn([]);
  131. $this->logger->expects(self::once())
  132. ->method('info')
  133. ->with('No tokens to refresh');
  134. $this->helloAssoService->expects(self::never())
  135. ->method('refreshTokens');
  136. $refreshHelloassoTokens->execute();
  137. }
  138. /**
  139. * @see RefreshHelloassoTokens::execute()
  140. */
  141. public function testExecuteWithCallsLimit(): void
  142. {
  143. $refreshHelloassoTokens = $this->getRefreshHelloassoTokensMockFor('execute');
  144. $helloAssoEntities = [];
  145. // Create 15 entities to test the API calls limit (limit is 10)
  146. for ($i = 1; $i <= 15; $i++) {
  147. $organization = $this->getMockBuilder(Organization::class)->getMock();
  148. $organization->method('getId')->willReturn($i);
  149. $helloAsso = $this->getMockBuilder(HelloAsso::class)->getMock();
  150. $helloAsso->method('getOrganization')->willReturn($organization);
  151. $helloAsso->method('getRefreshTokenCreatedAt')->willReturn(new \DateTime("2023-01-" . str_pad($i, 2, '0', STR_PAD_LEFT) . " 10:00:00"));
  152. $helloAssoEntities[] = $helloAsso;
  153. }
  154. $refreshHelloassoTokens->expects(self::once())
  155. ->method('getHelloassoAccounts')
  156. ->willReturn($helloAssoEntities);
  157. // Should only process the first 10 due to API limit
  158. $this->helloAssoService->expects(self::exactly(10))
  159. ->method('refreshTokens');
  160. $this->logger->expects(self::exactly(11))
  161. ->method('info');
  162. $this->logger->expects(self::once())
  163. ->method('warning')
  164. ->with('API calls limit reached, aborting');
  165. $refreshHelloassoTokens->execute();
  166. }
  167. /**
  168. * @see RefreshHelloassoTokens::execute()
  169. */
  170. public function testExecuteWithExactCallsLimit(): void
  171. {
  172. $refreshHelloassoTokens = $this->getRefreshHelloassoTokensMockFor('execute');
  173. $helloAssoEntities = [];
  174. // Create exactly 10 entities (the limit)
  175. for ($i = 1; $i <= 10; $i++) {
  176. $organization = $this->getMockBuilder(Organization::class)->getMock();
  177. $organization->method('getId')->willReturn($i);
  178. $helloAsso = $this->getMockBuilder(HelloAsso::class)->getMock();
  179. $helloAsso->method('getOrganization')->willReturn($organization);
  180. $helloAsso->method('getRefreshTokenCreatedAt')->willReturn(new \DateTime("2023-01-" . str_pad($i, 2, '0', STR_PAD_LEFT) . " 10:00:00"));
  181. $helloAssoEntities[] = $helloAsso;
  182. }
  183. $refreshHelloassoTokens->expects(self::once())
  184. ->method('getHelloassoAccounts')
  185. ->willReturn($helloAssoEntities);
  186. $this->helloAssoService->expects(self::exactly(10))
  187. ->method('refreshTokens');
  188. $this->logger->expects(self::exactly(11))
  189. ->method('info');
  190. $this->logger->expects(self::never())
  191. ->method('warning');
  192. $refreshHelloassoTokens->execute();
  193. }
  194. /**
  195. * @see RefreshHelloassoTokens::getHelloassoAccounts()
  196. */
  197. public function testGetHelloassoAccounts(): void
  198. {
  199. $refreshHelloassoTokens = $this->getRefreshHelloassoTokensMockFor('getHelloassoAccounts');
  200. $helloAssoRepository = $this->getMockBuilder(HelloAssoRepository::class)
  201. ->disableOriginalConstructor()
  202. ->getMock();
  203. $helloAsso1 = $this->getMockBuilder(HelloAsso::class)->getMock();
  204. $helloAsso2 = $this->getMockBuilder(HelloAsso::class)->getMock();
  205. $expectedResult = [$helloAsso1, $helloAsso2];
  206. $this->entityManager->expects(self::once())
  207. ->method('getRepository')
  208. ->with(HelloAsso::class)
  209. ->willReturn($helloAssoRepository);
  210. $helloAssoRepository->expects(self::once())
  211. ->method('findOldRefreshTokens')
  212. ->with(24)
  213. ->willReturn($expectedResult);
  214. $result = $refreshHelloassoTokens->getHelloassoAccounts();
  215. $this->assertEquals($expectedResult, $result);
  216. }
  217. }