DateTimeConstraintTest.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. <?php
  2. namespace App\Tests\Service\Utils;
  3. use App\Entity\Access\Access;
  4. use App\Entity\Organization\Organization;
  5. use App\Service\Utils\DateTimeConstraint;
  6. use App\Tests\TestToolsTrait;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use PHPUnit\Framework\TestCase;
  9. class DateTimeConstraintTest extends TestCase
  10. {
  11. use TestToolsTrait;
  12. private DateTimeConstraint $dateTimeConstraint;
  13. private array $periods;
  14. public function setUp(): void
  15. {
  16. $em = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
  17. $this->dateTimeConstraint = new DateTimeConstraint($em);
  18. $this->periods = [
  19. 'dateStart' => '2021-12-20',
  20. 'dateEnd' => '2022-08-31'
  21. ];
  22. }
  23. /**
  24. * @see DateTimeConstraint::presentConstraint()
  25. */
  26. public function testPresentConstrain(){
  27. $constraintExpected = [
  28. 'start' => [
  29. '2022-08-31' => 4
  30. ],
  31. 'end' => [
  32. '2021-12-20' => 8,
  33. 'NULL' => 0
  34. ]
  35. ];
  36. $this->assertEquals($constraintExpected, $this->invokeMethod($this->dateTimeConstraint, 'presentConstraint', [$this->periods]));
  37. }
  38. /**
  39. * @see DateTimeConstraint::pastConstraint()
  40. */
  41. public function testPastConstrain(){
  42. $constraintExpected = [
  43. 'end' => [
  44. '2021-12-20' => 1
  45. ]
  46. ];
  47. $this->assertEquals($constraintExpected, $this->invokeMethod($this->dateTimeConstraint, 'pastConstraint', [$this->periods]));
  48. }
  49. /**
  50. * @see DateTimeConstraint::futurConstraint()
  51. */
  52. public function testFuturConstrain(){
  53. $constraintExpected = [
  54. 'start' => [
  55. '2022-08-31' => 5
  56. ]
  57. ];
  58. $this->assertEquals($constraintExpected, $this->invokeMethod($this->dateTimeConstraint, 'futurConstraint', [$this->periods]));
  59. }
  60. /**
  61. * @see DateTimeConstraint::clearNull()
  62. */
  63. public function testClearNull(){
  64. $originalEndConstraint= [
  65. 'end' => [
  66. 'NULL' => 0
  67. ]
  68. ];
  69. $endConstraintExpected = [];
  70. $this->assertEquals($endConstraintExpected, $this->invokeMethod($this->dateTimeConstraint, 'clearNull', [$originalEndConstraint, 'end']));
  71. }
  72. /**
  73. * @see DateTimeConstraint::filterConstraint()
  74. */
  75. public function testFilterConstraint(){
  76. $originalStartConstraint= [
  77. 'start' => [
  78. '2021-12-20' => [8, 1],
  79. '2022-01-01' => [5]
  80. ]
  81. ];
  82. $startConstraintExpected = [
  83. '2022-01-01' => [5]
  84. ];
  85. $this->assertEquals($startConstraintExpected, $this->invokeMethod($this->dateTimeConstraint, 'filterConstraint', [$originalStartConstraint, 'start']));
  86. }
  87. /**
  88. * @see DateTimeConstraint::cleanConstraints()
  89. */
  90. public function testCleanConstraints(){
  91. $originalConstraint= [
  92. 'start' => [
  93. '2022-08-31' => [5]
  94. ],
  95. 'end' => [
  96. '2021-12-20' => [8, 1],
  97. 'NULL' => [0]
  98. ]
  99. ];
  100. $constraintExpected= [
  101. 'start' => [
  102. '2022-08-31' => [5]
  103. ],
  104. 'end' => []
  105. ];
  106. $this->assertEquals($constraintExpected, $this->invokeMethod($this->dateTimeConstraint, 'cleanConstraints', [$originalConstraint]));
  107. }
  108. /**
  109. * @see DateTimeConstraint::addConstraint()
  110. */
  111. public function testAddConstraint(){
  112. $originalConstraint = [
  113. 'start' => [],
  114. 'end' => []
  115. ];
  116. $presentConstraint = [
  117. 'start' => [
  118. '2022-08-31' => 4
  119. ],
  120. 'end' => [
  121. '2021-12-20' => 8,
  122. 'NULL' => 0
  123. ]
  124. ];
  125. $pastConstraint = [
  126. 'end' => [
  127. '2021-12-20' => 1
  128. ]
  129. ];
  130. $constraintAfterStartExpected = [
  131. 'start' => [
  132. '2022-08-31' => [4]
  133. ],
  134. 'end' => [
  135. '2021-12-20' => [8],
  136. 'NULL' => [0]
  137. ]
  138. ];
  139. $constraintAfterEndExpected = [
  140. 'start' => [
  141. '2022-08-31' => [4]
  142. ],
  143. 'end' => [
  144. '2021-12-20' => [8, 1],
  145. 'NULL' => [0]
  146. ]
  147. ];
  148. $this->assertEquals($constraintAfterStartExpected, $this->invokeMethod($this->dateTimeConstraint, 'addConstraint', [$originalConstraint, $presentConstraint]));
  149. $this->assertEquals($constraintAfterEndExpected, $this->invokeMethod($this->dateTimeConstraint, 'addConstraint', [$constraintAfterStartExpected, $pastConstraint]));
  150. }
  151. /**
  152. * @throws \ReflectionException
  153. * @see DateTimeConstraint::getPeriods()
  154. */
  155. public function testGetPeriodsToday(){
  156. $today = new \DateTime('now');
  157. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  158. $access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  159. $access->method('getOrganization')->willReturn($organization);
  160. $access->method('getActivityYear')->willReturn(intval($today->format('Y')));
  161. $periodExpected = ['dateStart' => $today->format('Y-m-d'), 'dateEnd' => '2022-08-31'];
  162. $this->assertEquals($periodExpected, $this->invokeMethod($this->dateTimeConstraint, 'getPeriods', [$access]));
  163. }
  164. /**
  165. * @throws \ReflectionException
  166. * @see DateTimeConstraint::getPeriods()
  167. */
  168. public function testGetPeriodsNotToday(){
  169. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  170. $access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  171. $access->method('getOrganization')->willReturn($organization);
  172. $access->method('getActivityYear')->willReturn(2020);
  173. $periodExpected = ['dateStart' => '2020-09-01', 'dateEnd' => '2021-08-31'];
  174. $this->assertEquals($periodExpected, $this->invokeMethod($this->dateTimeConstraint, 'getPeriods', [$access]));
  175. }
  176. /**
  177. * @throws \ReflectionException
  178. * @see DateTimeConstraint::hasCustomPeriods()
  179. */
  180. public function testHasCustomPeriods(){
  181. $historical = ['dateStart' => '2020-09-01', 'dateEnd' => '2021-08-31'];
  182. $this->assertTrue($this->invokeMethod($this->dateTimeConstraint, 'hasCustomPeriods', [$historical]));
  183. }
  184. /**
  185. * @throws \ReflectionException
  186. * @see DateTimeConstraint::hasCustomPeriods()
  187. */
  188. public function testHasNotCustomPeriods(){
  189. $historical = ['dateStart' => null, 'dateEnd' => null];
  190. $this->assertFalse($this->invokeMethod($this->dateTimeConstraint, 'hasCustomPeriods', [$historical]));
  191. }
  192. }