DateTimeConstraintTest.php 16 KB

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