UtilsTest.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <?php
  2. namespace App\Tests\Unit\Service\Access;
  3. use App\Entity\Access\Access;
  4. use App\Entity\Access\FunctionType;
  5. use App\Entity\Access\OrganizationFunction;
  6. use App\Entity\Organization\Organization;
  7. use App\Repository\Access\AccessRepository;
  8. use App\Service\Access\Utils as AccessUtils;
  9. use App\Service\ServiceIterator\OptionalsRolesIterator;
  10. use App\Service\Utils\DatesUtils;
  11. use Doctrine\Common\Collections\ArrayCollection;
  12. use Hoa\Iterator\Mock;
  13. use PHPUnit\Framework\MockObject\MockObject;
  14. use PHPUnit\Framework\TestCase;
  15. use Symfony\Component\Security\Core\Role\RoleHierarchy;
  16. class UtilsTest extends TestCase
  17. {
  18. private MockObject | RoleHierarchy $roleHierarchy;
  19. private MockObject | OptionalsRolesIterator $optionalsRolesIterator;
  20. private MockObject | AccessRepository $accessRepository;
  21. public function setUp():void
  22. {
  23. $this->roleHierarchy = $this->getMockBuilder(RoleHierarchy::class)->disableOriginalConstructor()->getMock();
  24. $this->optionalsRolesIterator = $this->getMockBuilder(OptionalsRolesIterator::class)->disableOriginalConstructor()->getMock();
  25. $this->accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
  26. }
  27. public function tearDown(): void
  28. {
  29. DatesUtils::clearFakeDatetime();
  30. }
  31. private function buildAccessUtilsMockForMethod(string $methodName): MockObject | AccessUtils {
  32. return $this->getMockBuilder(AccessUtils::class)
  33. ->setConstructorArgs([$this->roleHierarchy, $this->accessRepository, $this->optionalsRolesIterator])
  34. ->setMethodsExcept([$methodName])
  35. ->getMock();
  36. }
  37. /**
  38. * @see Utils::filterAccesses()
  39. */
  40. public function testFilterAccesses(): void
  41. {
  42. $accessUtils = $this->buildAccessUtilsMockForMethod('filterAccesses');
  43. $access1 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  44. $access1->method('getId')->willReturn(1);
  45. $access2 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  46. $access2->method('getId')->willReturn(2);
  47. $access3 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  48. $access3->method('getId')->willReturn(3);
  49. $accesses = [$access1, $access2, $access3];
  50. $result = $accessUtils->filterAccesses($accesses, $access2);
  51. $this->assertEqualsCanonicalizing(
  52. [$access1->getId(), $access3->getId()],
  53. array_map(static function ($access) { return $access->getId(); }, $result)
  54. );
  55. }
  56. /**
  57. * @see Utils::hasRole()
  58. */
  59. public function testHasRole(): void
  60. {
  61. $accessUtils = $this->buildAccessUtilsMockForMethod('hasRole');
  62. $access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  63. $accessUtils->method('getAllRoles')->with($access)->willReturn(['ROLE_A']);
  64. $this->assertTrue($accessUtils->hasRole($access, 'ROLE_A'));
  65. $this->assertFalse($accessUtils->hasRole($access, 'ROLE_B'));
  66. }
  67. /**
  68. * @see Utils::getAllRoles()
  69. */
  70. public function testGetAllRoles(): void
  71. {
  72. $accessUtils = $this->buildAccessUtilsMockForMethod('getAllRoles');
  73. $access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  74. $access->method('getRoles')->willReturn(['ROLE_A']);
  75. $this->roleHierarchy->method('getReachableRoleNames')->willReturn(["ROLE_A", "ROLE_B"]);
  76. $this->optionalsRolesIterator->method('getOptionalsRoles')->willReturn(["ROLE_OPT"]);
  77. $this->assertEquals(['ROLE_A', 'ROLE_B'], $accessUtils->getAllRoles($access));
  78. }
  79. /**
  80. * @see Utils::findAdminFor()
  81. */
  82. public function testFindAdminFor(): void
  83. {
  84. $accessUtils = $this->buildAccessUtilsMockForMethod('findAdminFor');
  85. $access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
  86. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  87. $this->accessRepository->method('findOneBy')->with(['adminAccess' => true, 'organization' => $organization])->willReturn($access);
  88. $this->assertNotEmpty($accessUtils->findAdminFor($organization));
  89. }
  90. /**
  91. * @see Utils::findAdminFor()
  92. */
  93. public function testFindAdminForNotFound(): void
  94. {
  95. $accessUtils = $this->buildAccessUtilsMockForMethod('findAdminFor');
  96. $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
  97. $this->accessRepository->method('findOneBy')->with(['adminAccess' => true, 'organization' => $organization])->willReturn(null);
  98. $this->assertNull($accessUtils->findAdminFor($organization));
  99. }
  100. public function testGetActiveFunctions(): void {
  101. $accessUtils = $this->buildAccessUtilsMockForMethod('getActiveFunctions');
  102. DatesUtils::setFakeDatetime('2023-01-01 12:00');
  103. $access = $this->getMockBuilder(Access::class)->getMock();
  104. $functionType1 = $this->getMockBuilder(FunctionType::class)->getMock();
  105. $functionType1->method('getMission')->willReturn('Mission1');
  106. $function1 = $this->getMockBuilder(OrganizationFunction::class)->getMock();
  107. $function1->method('getEndDate')->willReturn(null);
  108. $function1->method('getFunctionType')->willReturn($functionType1);
  109. $functionType2 = $this->getMockBuilder(FunctionType::class)->getMock();
  110. $functionType2->method('getMission')->willReturn('Mission2');
  111. $function2 = $this->getMockBuilder(OrganizationFunction::class)->getMock();
  112. $function2->method('getEndDate')->willReturn(null);
  113. $function2->method('getFunctionType')->willReturn($functionType2);
  114. $functionType3 = $this->getMockBuilder(FunctionType::class)->getMock();
  115. $functionType3->method('getMission')->willReturn('Mission3');
  116. $function3 = $this->getMockBuilder(OrganizationFunction::class)->getMock();
  117. $function3->method('getEndDate')->willReturn(new \DateTime('2022-01-01'));
  118. $function3->method('getFunctionType')->willReturn($functionType3);
  119. $functionType4 = $this->getMockBuilder(FunctionType::class)->getMock();
  120. $functionType4->method('getMission')->willReturn('Mission4');
  121. $function4 = $this->getMockBuilder(OrganizationFunction::class)->getMock();
  122. $function4->method('getEndDate')->willReturn(new \DateTime('2023-01-01 18:00'));
  123. $function4->method('getFunctionType')->willReturn($functionType4);
  124. $functionType5 = $this->getMockBuilder(FunctionType::class)->getMock();
  125. $functionType5->method('getMission')->willReturn('Mission5');
  126. $function5 = $this->getMockBuilder(OrganizationFunction::class)->getMock();
  127. $function5->method('getEndDate')->willReturn(new \DateTime('2023-06-01'));
  128. $function5->method('getFunctionType')->willReturn($functionType5);
  129. $access->method('getOrganizationFunction')->willReturn(
  130. new ArrayCollection([$function1, $function2, $function3, $function4, $function5])
  131. );
  132. $this->assertEquals(
  133. ['Mission1', 'Mission2', 'Mission4', 'Mission5'],
  134. $accessUtils->getActiveFunctions($access)
  135. );
  136. }
  137. public function testHasActiveFunctions(): void {
  138. $accessUtils = $this->buildAccessUtilsMockForMethod('hasActiveFunction');
  139. $access = $this->getMockBuilder(Access::class)->getMock();
  140. $accessUtils
  141. ->method('getActiveFunctions')
  142. ->with($access)
  143. ->willReturn(['Mission1', 'Mission2']);
  144. $this->assertTrue(
  145. $accessUtils->hasActiveFunction($access, 'Mission1')
  146. );
  147. $this->assertFalse(
  148. $accessUtils->hasActiveFunction($access, 'Mission3')
  149. );
  150. }
  151. }