RegistrationStatusServiceTest.php.off 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. <?php
  2. namespace App\Tests\Unit\Service\OnlineRegistration;
  3. use App\Entity\Access\Access;
  4. use App\Entity\AccessWish\AccessFamilyWish;
  5. use App\Entity\AccessWish\AccessWish;
  6. use App\Entity\AccessWish\EducationStudentWish;
  7. use App\Enum\OnlineRegistration\RegistrationStatusEnum;
  8. use App\Enum\OnlineRegistration\WishRegistrationEnum;
  9. use App\Service\OnlineRegistration\RegistrationStatusService;
  10. use App\Service\Utils\DatesUtils;
  11. use Doctrine\Common\Collections\ArrayCollection;
  12. use PHPUnit\Framework\TestCase;
  13. use PHPUnit\Framework\MockObject\MockObject;
  14. class TestableRegistrationStatusService extends RegistrationStatusService {
  15. public function getCurrentAccessWish(Access $access): AccessWish | null { return parent::getCurrentAccessWish($access); }
  16. public function getDaysSinceLastUpdate(AccessWish $currentAccessWish): int {
  17. return parent::getDaysSinceLastUpdate($currentAccessWish);
  18. }
  19. public function countEducationsByRegistrationStatus(AccessWish $currentAccessWish): array | null {
  20. return parent::countEducationsByRegistrationStatus($currentAccessWish);
  21. }
  22. }
  23. class RegistrationStatusServiceTest extends TestCase
  24. {
  25. public function tearDown(): void
  26. {
  27. DatesUtils::clearFakeDatetime();
  28. }
  29. private function makeRegistrationStatusServiceMockForMethod(string $methodName): MockObject | TestableRegistrationStatusService {
  30. return $this->getMockBuilder(TestableRegistrationStatusService::class)
  31. ->setMethodsExcept([$methodName])
  32. ->getMock();
  33. }
  34. private function _getStatusWith(int $negotiable, int $accepted, int $pending, int $denied): string | null {
  35. $registrationStatusService = $this->makeRegistrationStatusServiceMockForMethod('getStatus');
  36. $access = $this->getMockBuilder(Access::class)->getMock();
  37. $accessWish = $this->getMockBuilder(AccessWish::class)->getMock();
  38. $accessFamilyWish = $this->getMockBuilder(AccessFamilyWish::class)->getMock();
  39. $accessFamilyWish->method('isRegistrationCompleted')->willReturn(true);
  40. $accessWish->method('getAccessFamilyWish')->willReturn($accessFamilyWish);
  41. $registrationStatusService->method('getCurrentAccessWish')->with($access)->willReturn($accessWish);
  42. $wishesCountByStatus = [
  43. RegistrationStatusEnum::NEGOTIABLE()->getValue() => $negotiable,
  44. RegistrationStatusEnum::ACCEPTED()->getValue() => $accepted,
  45. RegistrationStatusEnum::PENDING()->getValue() => $pending,
  46. RegistrationStatusEnum::DENIED()->getValue() => $denied
  47. ];
  48. $registrationStatusService
  49. ->expects(self::once())
  50. ->method('countEducationsByRegistrationStatus')
  51. ->with($accessWish)
  52. ->willReturn($wishesCountByStatus);
  53. return $registrationStatusService->getStatus($access);
  54. }
  55. public function testGetStatusIsNegotiable(): void {
  56. $this->assertEquals(
  57. $this->_getStatusWith(1, 0, 0, 0),
  58. RegistrationStatusEnum::NEGOTIABLE()->getValue()
  59. );
  60. $this->assertEquals(
  61. RegistrationStatusEnum::NEGOTIABLE()->getValue(),
  62. $this->_getStatusWith(1, 0, 0, 1)
  63. );
  64. }
  65. public function testGetStatusIsPending(): void {
  66. $this->assertEquals(
  67. RegistrationStatusEnum::PENDING()->getValue(),
  68. $this->_getStatusWith(0, 0, 1, 0)
  69. );
  70. $this->assertEquals(
  71. RegistrationStatusEnum::PENDING()->getValue(),
  72. $this->_getStatusWith(1, 0, 1, 0)
  73. );
  74. }
  75. public function testGetStatusIsAccepted(): void {
  76. $this->assertEquals(
  77. RegistrationStatusEnum::ACCEPTED()->getValue(),
  78. $this->_getStatusWith(0, 1, 0, 0)
  79. );
  80. $this->assertEquals(
  81. RegistrationStatusEnum::ACCEPTED()->getValue(),
  82. $this->_getStatusWith(1, 1, 1, 1)
  83. );
  84. }
  85. public function testGetStatusIsDenied(): void {
  86. $this->assertEquals(
  87. RegistrationStatusEnum::DENIED()->getValue(),
  88. $this->_getStatusWith(0, 0, 0, 1)
  89. );
  90. }
  91. public function testGetStatusNoAccessWish(): void {
  92. $registrationStatusService = $this->makeRegistrationStatusServiceMockForMethod('getStatus');
  93. $access = $this->getMockBuilder(Access::class)->getMock();
  94. $registrationStatusService->method('getCurrentAccessWish')->with($access)->willReturn(null);
  95. $this->assertEquals(
  96. null,
  97. $registrationStatusService->getStatus($access)
  98. );
  99. }
  100. public function testGetStatusIncompleteRegistration(): void {
  101. $registrationStatusService = $this->makeRegistrationStatusServiceMockForMethod('getStatus');
  102. $access = $this->getMockBuilder(Access::class)->getMock();
  103. $accessWish = $this->getMockBuilder(AccessWish::class)->getMock();
  104. $accessFamilyWish = $this->getMockBuilder(AccessFamilyWish::class)->getMock();
  105. $accessFamilyWish->method('isRegistrationCompleted')->willReturn(false);
  106. $accessWish->method('getAccessFamilyWish')->willReturn($accessFamilyWish);
  107. $registrationStatusService->method('getCurrentAccessWish')->with($access)->willReturn($accessWish);
  108. $this->assertEquals(
  109. null,
  110. $registrationStatusService->getStatus($access)
  111. );
  112. }
  113. public function testGetStatusNoCountByStatuses(): void {
  114. $registrationStatusService = $this->makeRegistrationStatusServiceMockForMethod('getStatus');
  115. $access = $this->getMockBuilder(Access::class)->getMock();
  116. $accessWish = $this->getMockBuilder(AccessWish::class)->getMock();
  117. $accessFamilyWish = $this->getMockBuilder(AccessFamilyWish::class)->getMock();
  118. $accessFamilyWish->method('isRegistrationCompleted')->willReturn(true);
  119. $accessWish->method('getAccessFamilyWish')->willReturn($accessFamilyWish);
  120. $registrationStatusService->method('getCurrentAccessWish')->with($access)->willReturn($accessWish);
  121. $registrationStatusService
  122. ->method('countEducationsByRegistrationStatus')
  123. ->with($accessWish)
  124. ->willReturn(null);
  125. $this->assertEquals(
  126. null,
  127. $registrationStatusService->getStatus($access)
  128. );
  129. }
  130. public function testGetStatusExpired(): void {
  131. $registrationStatusService = $this->makeRegistrationStatusServiceMockForMethod('getStatus');
  132. $access = $this->getMockBuilder(Access::class)->getMock();
  133. $accessWish = $this->getMockBuilder(AccessWish::class)->getMock();
  134. $accessFamilyWish = $this->getMockBuilder(AccessFamilyWish::class)->getMock();
  135. $accessFamilyWish->method('isRegistrationCompleted')->willReturn(true);
  136. $accessWish->method('getAccessFamilyWish')->willReturn($accessFamilyWish);
  137. $registrationStatusService->method('getCurrentAccessWish')->with($access)->willReturn($accessWish);
  138. $wishesCountByStatus = [
  139. RegistrationStatusEnum::NEGOTIABLE()->getValue() => 0,
  140. RegistrationStatusEnum::ACCEPTED()->getValue() => 1,
  141. RegistrationStatusEnum::PENDING()->getValue() => 0,
  142. RegistrationStatusEnum::DENIED()->getValue() => 0
  143. ];
  144. $registrationStatusService
  145. ->method('countEducationsByRegistrationStatus')
  146. ->with($accessWish)
  147. ->willReturn($wishesCountByStatus);
  148. $registrationStatusService
  149. ->method('getDaysSinceLastUpdate')
  150. ->with($accessWish)
  151. ->willReturn($registrationStatusService::DISPLAYING_TIME + 1);
  152. $this->assertEquals(
  153. null,
  154. $registrationStatusService->getStatus($access)
  155. );
  156. }
  157. public function testGetStatusNoResult(): void {
  158. $this->assertEquals(
  159. null,
  160. $this->_getStatusWith(0, 0, 0, 0)
  161. );
  162. }
  163. public function testGetDaysSinceLastUpdate(): void {
  164. $registrationStatusService = $this->makeRegistrationStatusServiceMockForMethod('getDaysSinceLastUpdate');
  165. DatesUtils::setFakeDatetime('2023-01-11');
  166. $accessWish = $this->getMockBuilder(AccessWish::class)->getMock();
  167. $accessFamilyWish = $this->getMockBuilder(AccessFamilyWish::class)->getMock();
  168. $accessFamilyWish->method('getUpdateDate')->willReturn(new \DateTime('2023-01-01'));
  169. $accessWish->method('getAccessFamilyWish')->willReturn($accessFamilyWish);
  170. $this->assertEquals(
  171. 10,
  172. $registrationStatusService->getDaysSinceLastUpdate($accessWish)
  173. );
  174. }
  175. public function testGetCurrentAccessWish(): void {
  176. $registrationStatusService = $this->makeRegistrationStatusServiceMockForMethod('getCurrentAccessWish');
  177. DatesUtils::setFakeDatetime('2023-01-01');
  178. $access = $this->getMockBuilder(Access::class)->getMock();
  179. $accessWish1 = $this->getMockBuilder(AccessWish::class)->getMock();
  180. $accessWish1->method('getCreateDate')->willReturn(new \DateTime('2021-01-01'));
  181. $accessWish2 = $this->getMockBuilder(AccessWish::class)->getMock();
  182. $accessWish2->method('getCreateDate')->willReturn(new \DateTime('2022-01-01'));
  183. $accessWish3 = $this->getMockBuilder(AccessWish::class)->getMock();
  184. $accessWish3->method('getCreateDate')->willReturn(new \DateTime('2023-01-01'));
  185. $access->method('getAccessWishes')->willReturn(new ArrayCollection([$accessWish1, $accessWish2, $accessWish3]));
  186. $this->assertEquals(
  187. $accessWish3,
  188. $registrationStatusService->getCurrentAccessWish($access)
  189. );
  190. }
  191. public function testGetCurrentAccessWishNoResult(): void {
  192. $registrationStatusService = $this->makeRegistrationStatusServiceMockForMethod('getCurrentAccessWish');
  193. DatesUtils::setFakeDatetime('2023-01-01');
  194. $access = $this->getMockBuilder(Access::class)->getMock();
  195. $accessWish1 = $this->getMockBuilder(AccessWish::class)->getMock();
  196. $accessWish1->method('getCreateDate')->willReturn(new \DateTime('2021-01-01'));
  197. $accessWish2 = $this->getMockBuilder(AccessWish::class)->getMock();
  198. $accessWish2->method('getCreateDate')->willReturn(new \DateTime('2022-01-01'));
  199. $access->method('getAccessWishes')->willReturn(new ArrayCollection([$accessWish1, $accessWish2]));
  200. $this->assertEquals(
  201. null,
  202. $registrationStatusService->getCurrentAccessWish($access)
  203. );
  204. }
  205. public function testCountEducationsByRegistrationStatus(): void {
  206. $registrationStatusService = $this->makeRegistrationStatusServiceMockForMethod('countEducationsByRegistrationStatus');
  207. $accessWish = $this->getMockBuilder(AccessWish::class)->getMock();
  208. $educationStudentWish1 = $this->getMockBuilder(EducationStudentWish::class)->getMock();
  209. $educationStudentWish1->expects(self::once())->method('getRegistrationStatus')->willReturn(RegistrationStatusEnum::NEGOTIABLE()->getValue());
  210. $educationStudentWish2 = $this->getMockBuilder(EducationStudentWish::class)->getMock();
  211. $educationStudentWish2->expects(self::once())->method('getRegistrationStatus')->willReturn(RegistrationStatusEnum::PENDING()->getValue());
  212. $educationStudentWish3 = $this->getMockBuilder(EducationStudentWish::class)->getMock();
  213. $educationStudentWish3->expects(self::once())->method('getRegistrationStatus')->willReturn(RegistrationStatusEnum::ACCEPTED()->getValue());
  214. $accessWish
  215. ->method('getEducationStudentWishes')
  216. ->willReturn(new ArrayCollection([$educationStudentWish1, $educationStudentWish2, $educationStudentWish3]));
  217. $reregistrationWish1 = $this->getMockBuilder(EducationStudentWish::class)->getMock();
  218. $reregistrationWish1->method('getWishRegistration')->willReturn(WishRegistrationEnum::REREGISTER()->getValue());
  219. $reregistrationWish1->expects(self::once())->method('getRegistrationStatus')->willReturn(RegistrationStatusEnum::ACCEPTED()->getValue());
  220. $reregistrationWish2 = $this->getMockBuilder(EducationStudentWish::class)->getMock();
  221. $reregistrationWish2->method('getWishRegistration')->willReturn(WishRegistrationEnum::REREGISTER()->getValue());
  222. $reregistrationWish2->expects(self::once())->method('getRegistrationStatus')->willReturn(RegistrationStatusEnum::DENIED()->getValue());
  223. $reregistrationWish3 = $this->getMockBuilder(EducationStudentWish::class)->getMock();
  224. $reregistrationWish3->method('getWishRegistration')->willReturn(WishRegistrationEnum::NO_INFORMATION()->getValue());
  225. $reregistrationWish3->expects(self::never())->method('getRegistrationStatus');
  226. $accessWish
  227. ->method('getEducationStudentReregistrationsWishes')
  228. ->willReturn(new ArrayCollection([$reregistrationWish1, $reregistrationWish2, $reregistrationWish3]));
  229. $expected = [
  230. RegistrationStatusEnum::NEGOTIABLE()->getValue() => 1,
  231. RegistrationStatusEnum::ACCEPTED()->getValue() => 2,
  232. RegistrationStatusEnum::PENDING()->getValue() => 1,
  233. RegistrationStatusEnum::DENIED()->getValue() => 1
  234. ];
  235. $this->assertEquals(
  236. $expected,
  237. $registrationStatusService->countEducationsByRegistrationStatus($accessWish)
  238. );
  239. }
  240. public function testCountEducationsByRegistrationStatusNoWishes(): void {
  241. $registrationStatusService = $this->makeRegistrationStatusServiceMockForMethod('countEducationsByRegistrationStatus');
  242. $accessWish = $this->getMockBuilder(AccessWish::class)->getMock();
  243. $accessWish
  244. ->method('getEducationStudentWishes')
  245. ->willReturn(new ArrayCollection([]));
  246. $accessWish
  247. ->method('getEducationStudentReregistrationsWishes')
  248. ->willReturn(new ArrayCollection([]));
  249. $this->assertEquals(
  250. null,
  251. $registrationStatusService->countEducationsByRegistrationStatus($accessWish)
  252. );
  253. }
  254. }