ActivityYearConstraintTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. <?php
  2. namespace App\Tests\Unit\Service\Constraint;
  3. use App\Entity\Access\Access;
  4. use App\Entity\Organization\Organization;
  5. use App\Repository\Access\AccessRepository;
  6. use App\Service\Constraint\ActivityYearConstraint;
  7. use App\Service\Organization\Utils as OrganizationUtils;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use PHPUnit\Framework\TestCase;
  10. class TestableActivityYearConstraint extends ActivityYearConstraint
  11. {
  12. public function hasCustomPeriods($historical): bool
  13. {
  14. return parent::hasCustomPeriods($historical);
  15. }
  16. public function addConstraint(array $contraints, array $newContraint): array
  17. {
  18. return parent::addConstraint($contraints, $newContraint);
  19. }
  20. public function cleanConstraints(array $constraints): array
  21. {
  22. return parent::cleanConstraints($constraints);
  23. }
  24. public function getRangeYear(Access $access, string $dateStart, string $dateEnd): array
  25. {
  26. return parent::getRangeYear($access, $dateStart, $dateEnd);
  27. }
  28. public function presentConstraint(int $year): array
  29. {
  30. return parent::presentConstraint($year);
  31. }
  32. public function pastConstraint($year): array
  33. {
  34. return parent::pastConstraint($year);
  35. }
  36. public function futureConstraint($year): array
  37. {
  38. return parent::futureConstraint($year);
  39. }
  40. public function customConstraint($years): array
  41. {
  42. return parent::customConstraint($years);
  43. }
  44. }
  45. class ActivityYearConstraintTest extends TestCase
  46. {
  47. private EntityManagerInterface $entityManager;
  48. private OrganizationUtils $organizationUtils;
  49. public function setUp(): void
  50. {
  51. $this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
  52. $this->organizationUtils = $this->getMockBuilder(OrganizationUtils::class)->disableOriginalConstructor()->getMock();
  53. }
  54. /**
  55. * @see ActivityYearConstraint::invoke()
  56. */
  57. public function testInvokePresentNoCustomPeriods(): void
  58. {
  59. $activityYearConstraint = $this->getMockBuilder(TestableActivityYearConstraint::class)
  60. ->setConstructorArgs([$this->entityManager, $this->organizationUtils])
  61. ->setMethodsExcept(['invoke'])
  62. ->getMock();
  63. $access = $this->getMockBuilder(Access::class)->getMock();
  64. $accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
  65. $accessRepository->method('find')->with(123)->willReturn($access);
  66. $this->entityManager->method('getRepository')->with(Access::class)->willReturn($accessRepository);
  67. $historical = ['future' => false, 'past' => false, 'present' => true, 'dateStart' => null, 'dateEnd' => null];
  68. $access->method('getHistorical')->willReturn($historical);
  69. $access->method('getActivityYear')->willReturn(2020);
  70. $activityYearConstraint->method('hasCustomPeriods')->with($historical)->willReturn(false);
  71. $constraint = ['foo'];
  72. $activityYearConstraint->method('presentConstraint')->willReturn($constraint);
  73. $activityYearConstraint
  74. ->expects(self::once())
  75. ->method('addConstraint')
  76. ->with(['start' => [], 'end' => []], $constraint)
  77. ->willReturn(['bar']);
  78. $activityYearConstraint
  79. ->expects(self::once())
  80. ->method('cleanConstraints')
  81. ->with(['bar']);
  82. $activityYearConstraint->invoke(123);
  83. }
  84. /**
  85. * @see ActivityYearConstraint::invoke()
  86. */
  87. public function testInvokePastNoCustomPeriods(): void
  88. {
  89. $activityYearConstraint = $this->getMockBuilder(TestableActivityYearConstraint::class)
  90. ->setConstructorArgs([$this->entityManager, $this->organizationUtils])
  91. ->setMethodsExcept(['invoke'])
  92. ->getMock();
  93. $access = $this->getMockBuilder(Access::class)->getMock();
  94. $accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
  95. $accessRepository->method('find')->with(123)->willReturn($access);
  96. $this->entityManager->method('getRepository')->with(Access::class)->willReturn($accessRepository);
  97. $historical = ['future' => false, 'past' => true, 'present' => false, 'dateStart' => null, 'dateEnd' => null];
  98. $access->method('getHistorical')->willReturn($historical);
  99. $access->method('getActivityYear')->willReturn(2020);
  100. $activityYearConstraint->method('hasCustomPeriods')->with($historical)->willReturn(false);
  101. $constraint = ['foo'];
  102. $activityYearConstraint->method('pastConstraint')->willReturn($constraint);
  103. $activityYearConstraint
  104. ->expects(self::once())
  105. ->method('addConstraint')
  106. ->with(['start' => [], 'end' => []], $constraint)
  107. ->willReturn(['bar']);
  108. $activityYearConstraint
  109. ->expects(self::once())
  110. ->method('cleanConstraints')
  111. ->with(['bar']);
  112. $activityYearConstraint->invoke(123);
  113. }
  114. /**
  115. * @see ActivityYearConstraint::invoke()
  116. */
  117. public function testInvokeFutureNoCustomPeriods(): void
  118. {
  119. $activityYearConstraint = $this->getMockBuilder(TestableActivityYearConstraint::class)
  120. ->setConstructorArgs([$this->entityManager, $this->organizationUtils])
  121. ->setMethodsExcept(['invoke'])
  122. ->getMock();
  123. $access = $this->getMockBuilder(Access::class)->getMock();
  124. $accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
  125. $accessRepository->method('find')->with(123)->willReturn($access);
  126. $this->entityManager->method('getRepository')->with(Access::class)->willReturn($accessRepository);
  127. $historical = ['future' => true, 'past' => false, 'present' => false, 'dateStart' => null, 'dateEnd' => null];
  128. $access->method('getHistorical')->willReturn($historical);
  129. $access->method('getActivityYear')->willReturn(2020);
  130. $activityYearConstraint->method('hasCustomPeriods')->with($historical)->willReturn(false);
  131. $constraint = ['foo'];
  132. $activityYearConstraint->method('futureConstraint')->willReturn($constraint);
  133. $activityYearConstraint
  134. ->expects(self::once())
  135. ->method('addConstraint')
  136. ->with(['start' => [], 'end' => []], $constraint)
  137. ->willReturn(['bar']);
  138. $activityYearConstraint
  139. ->expects(self::once())
  140. ->method('cleanConstraints')
  141. ->with(['bar']);
  142. $activityYearConstraint->invoke(123);
  143. }
  144. /**
  145. * @see ActivityYearConstraint::invoke()
  146. */
  147. public function testInvokeMultiplePeriodsNoCustom(): void
  148. {
  149. $activityYearConstraint = $this->getMockBuilder(TestableActivityYearConstraint::class)
  150. ->setConstructorArgs([$this->entityManager, $this->organizationUtils])
  151. ->setMethodsExcept(['invoke'])
  152. ->getMock();
  153. $access = $this->getMockBuilder(Access::class)->getMock();
  154. $accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
  155. $accessRepository->method('find')->with(123)->willReturn($access);
  156. $this->entityManager->method('getRepository')->with(Access::class)->willReturn($accessRepository);
  157. $historical = ['future' => true, 'past' => true, 'present' => true, 'dateStart' => null, 'dateEnd' => null];
  158. $access->method('getHistorical')->willReturn($historical);
  159. $access->method('getActivityYear')->willReturn(2020);
  160. $activityYearConstraint->method('hasCustomPeriods')->with($historical)->willReturn(false);
  161. $activityYearConstraint->method('pastConstraint')->willReturn(['pastConstraint']);
  162. $activityYearConstraint->method('presentConstraint')->willReturn(['presentConstraint']);
  163. $activityYearConstraint->method('futureConstraint')->willReturn(['futureConstraint']);
  164. $activityYearConstraint
  165. ->expects(self::exactly(3))
  166. ->method('addConstraint')
  167. ->withConsecutive(
  168. [['start' => [], 'end' => []], ['presentConstraint']],
  169. [['start' => [], 'end' => []], ['pastConstraint']],
  170. [['start' => [], 'end' => []], ['futureConstraint']]
  171. )->willReturn(['start' => [], 'end' => []]);
  172. $activityYearConstraint
  173. ->expects(self::once())
  174. ->method('cleanConstraints')
  175. ->with(['start' => [], 'end' => []]);
  176. $activityYearConstraint->invoke(123);
  177. }
  178. /**
  179. * @see ActivityYearConstraint::invoke()
  180. */
  181. public function testInvokeWithCustom(): void
  182. {
  183. $activityYearConstraint = $this->getMockBuilder(TestableActivityYearConstraint::class)
  184. ->setConstructorArgs([$this->entityManager, $this->organizationUtils])
  185. ->setMethodsExcept(['invoke'])
  186. ->getMock();
  187. $access = $this->getMockBuilder(Access::class)->getMock();
  188. $accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
  189. $accessRepository->method('find')->with(123)->willReturn($access);
  190. $this->entityManager->method('getRepository')->with(Access::class)->willReturn($accessRepository);
  191. $historical = ['future' => false, 'past' => false, 'present' => true, 'dateStart' => '2020-01-01', 'dateEnd' => '2020-02-01'];
  192. $access->method('getHistorical')->willReturn($historical);
  193. $access->method('getActivityYear')->willReturn(2020);
  194. $activityYearConstraint->method('hasCustomPeriods')->with($historical)->willReturn(true);
  195. $activityYearConstraint->expects(self::never())->method('pastConstraint');
  196. $activityYearConstraint->expects(self::never())->method('presentConstraint');
  197. $activityYearConstraint->expects(self::never())->method('futureConstraint');
  198. $activityYearConstraint
  199. ->method('getRangeYear')
  200. ->with($access, '2020-01-01', '2020-02-01')
  201. ->willReturn(['dateStart' => 2020, 'dateEnd' => 2020]);
  202. $activityYearConstraint->method('customConstraint')->with(['dateStart' => 2020, 'dateEnd' => 2020])->willReturn(['bar']);
  203. $activityYearConstraint
  204. ->expects(self::once())
  205. ->method('addConstraint')
  206. ->with(['start' => [], 'end' => []], ['bar'])
  207. ->willReturn(['start' => [], 'end' => []]);
  208. $activityYearConstraint
  209. ->expects(self::once())
  210. ->method('cleanConstraints')
  211. ->with(['start' => [], 'end' => []]);
  212. $activityYearConstraint->invoke(123);
  213. }
  214. /**
  215. * @see ActivityYearConstraint::getRangeYear()
  216. */
  217. public function testGetRangeYear(): void
  218. {
  219. $activityYearConstraint = $this->getMockBuilder(TestableActivityYearConstraint::class)
  220. ->setConstructorArgs([$this->entityManager, $this->organizationUtils])
  221. ->setMethodsExcept(['getRangeYear'])
  222. ->getMock();
  223. $organization = $this->getMockBuilder(Organization::class)->getMock();
  224. $access = $this->getMockBuilder(Access::class)->getMock();
  225. $access->method('getOrganization')->willReturn($organization);
  226. $this->organizationUtils
  227. ->method('getActivityYearSwitchDate')
  228. ->with($organization, self::isInstanceOf(\DateTime::class))
  229. ->willReturnOnConsecutiveCalls(
  230. 2020, 2020, 2020, 2022
  231. );
  232. $this->assertEquals(
  233. ['dateStart' => 2020, 'dateEnd' => 2020],
  234. $activityYearConstraint->getRangeYear($access, '2020-01-01', '2020-12-31')
  235. );
  236. $this->assertEquals(
  237. ['dateStart' => 2020, 'dateEnd' => 2022],
  238. $activityYearConstraint->getRangeYear($access, '2020-01-01', '2022-12-31')
  239. );
  240. }
  241. /**
  242. * @see ActivityYearConstraint::presentConstraint()
  243. */
  244. public function testPresentConstraint(): void
  245. {
  246. $activityYearConstraint = $this->getMockBuilder(TestableActivityYearConstraint::class)
  247. ->setConstructorArgs([$this->entityManager, $this->organizationUtils])
  248. ->setMethodsExcept(['presentConstraint'])
  249. ->getMock();
  250. $this->assertEquals(
  251. ['start' => [2020 => 3]],
  252. $activityYearConstraint->presentConstraint(2020)
  253. );
  254. }
  255. /**
  256. * @see ActivityYearConstraint::pastConstraint()
  257. */
  258. public function testPastConstraint(): void
  259. {
  260. $activityYearConstraint = $this->getMockBuilder(TestableActivityYearConstraint::class)
  261. ->setConstructorArgs([$this->entityManager, $this->organizationUtils])
  262. ->setMethodsExcept(['pastConstraint'])
  263. ->getMock();
  264. $this->assertEquals(
  265. ['end' => [2020 => 1]],
  266. $activityYearConstraint->pastConstraint(2020)
  267. );
  268. }
  269. /**
  270. * @see ActivityYearConstraint::futureConstraint()
  271. */
  272. public function testFutureConstraint(): void
  273. {
  274. $activityYearConstraint = $this->getMockBuilder(TestableActivityYearConstraint::class)
  275. ->setConstructorArgs([$this->entityManager, $this->organizationUtils])
  276. ->setMethodsExcept(['futureConstraint'])
  277. ->getMock();
  278. $this->assertEquals(
  279. ['start' => [2020 => 5]],
  280. $activityYearConstraint->futureConstraint(2020)
  281. );
  282. }
  283. /**
  284. * @see ActivityYearConstraint::customConstraint()
  285. */
  286. public function testCustomConstraint(): void
  287. {
  288. $activityYearConstraint = $this->getMockBuilder(TestableActivityYearConstraint::class)
  289. ->setConstructorArgs([$this->entityManager, $this->organizationUtils])
  290. ->setMethodsExcept(['customConstraint'])
  291. ->getMock();
  292. $this->assertEquals(
  293. ['start' => [2020 => 8, 2022 => 4]],
  294. $activityYearConstraint->customConstraint(['dateStart' => 2020, 'dateEnd' => 2022])
  295. );
  296. }
  297. }