Browse Source

revise tests for Service/Access/*

Olivier Massot 3 years ago
parent
commit
4cef93dc08

+ 1 - 3
src/Service/Access/Utils.php

@@ -17,8 +17,6 @@ use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
  */
 class Utils
 {
-    // TODO: Renommer en AccessUtils
-
     public function __construct(
         private RoleHierarchyInterface $roleHierarchy,
         private AccessRepository $accessRepository,
@@ -49,7 +47,7 @@ class Utils
      * @see UtilsTest::testHasRoles()
      */
     public function hasRoles(Access $access, string $roleToHave): bool{
-        return in_array($roleToHave, $this->getAllRoles($access));
+        return in_array($roleToHave, $this->getAllRoles($access), true);
     }
 
     /**

+ 52 - 32
tests/Service/Access/AdminAccessUtilsTest.php

@@ -8,80 +8,100 @@ use App\Entity\Core\ContactPoint;
 use App\Entity\Organization\Organization;
 use App\Entity\Person\Person;
 use App\Service\Access\AdminAccessUtils;
-use App\Service\Access\Utils;
+use App\Service\Access\Utils as AccessUtils;
 use App\Service\Core\ContactPointUtils;
+use PHPUnit\Framework\MockObject\MockObject;
 use PHPUnit\Framework\TestCase;
 
 class AdminAccessUtilsTest extends TestCase
 {
-    private Organization $organization;
-    private AdminAccessUtils  $adminAccessUtils;
-    private ContactPointUtils $contactPointUtilsMock;
-    private Utils $accessUtilsMock;
+    private MockObject | Organization $organization;
+    private MockObject | Access $access;
+    private MockObject | ContactPointUtils $contactPointUtils;
+    private MockObject | AccessUtils $accessUtils;
 
     public function setUp():void
     {
-        $this->organization = new Organization();
-
-        $this->accessUtilsMock = $this->getMockBuilder(Utils::class)->disableOriginalConstructor()->getMock();
-        $this->contactPointUtilsMock = $this->getMockBuilder(ContactPointUtils::class)->disableOriginalConstructor()->getMock();
-
-        $this->adminAccessUtils = new AdminAccessUtils(
-            $this->accessUtilsMock,
-            $this->contactPointUtilsMock
-        );
+        $this->organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
+        $this->access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
+        $this->accessUtils = $this->getMockBuilder(AccessUtils::class)->disableOriginalConstructor()->getMock();
+        $this->contactPointUtils = $this->getMockBuilder(ContactPointUtils::class)->disableOriginalConstructor()->getMock();
     }
 
     /**
      * @see AdminAccessUtils::getAdminAccess()
      */
-    public function testGetAdminAccessWithoutAdministrator(){
-        $this->accessUtilsMock
+    public function testGetAdminAccessWithoutAdministrator(): void
+    {
+        $adminAccessUtils = $this->getMockBuilder(AdminAccessUtils::class)
+            ->setConstructorArgs([$this->accessUtils, $this->contactPointUtils])
+            ->setMethodsExcept(['getAdminAccess'])
+            ->getMock();
+
+        $this->accessUtils
             ->method('findAdminFor')
             ->with($this->organization)
             ->willReturn(null);
 
-        $this->assertNull($this->adminAccessUtils->getAdminAccess($this->organization));
+        $returned = $adminAccessUtils->getAdminAccess($this->organization);
+
+        $this->assertNull($returned);
     }
 
     /**
      * @see AdminAccessUtils::getAdminAccess()
      */
     public function testGetAdminAccessWithoutContactPoint(){
-        $administrator = new Access();
+        $adminAccessUtils = $this->getMockBuilder(AdminAccessUtils::class)
+            ->setConstructorArgs([$this->accessUtils, $this->contactPointUtils])
+            ->setMethodsExcept(['getAdminAccess'])
+            ->getMock();
 
-        $this->accessUtilsMock
+        $this->accessUtils
             ->method('findAdminFor')
             ->with($this->organization)
-            ->willReturn($administrator);
+            ->willReturn($this->access);
 
-        $this->contactPointUtilsMock
+        $this->contactPointUtils
             ->method('getPersonContactPointPrincipal')
-            ->with($administrator)
+            ->with($this->access)
             ->willReturn(null);
 
-        $this->assertNull($this->adminAccessUtils->getAdminAccess($this->organization));
+        $returned = $adminAccessUtils->getAdminAccess($this->organization);
+
+        $this->assertNull($returned);
     }
 
     /**
      * @see AdminAccessUtils::getAdminAccess()
      */
     public function testGetAdminAccess(){
-        $person = new Person();
-        $administrator = new Access();
-        $administrator->setPerson($person);
-        $contactPoint = new ContactPoint();
+        $adminAccessUtils = $this->getMockBuilder(AdminAccessUtils::class)
+            ->setConstructorArgs([$this->accessUtils, $this->contactPointUtils])
+            ->setMethodsExcept(['getAdminAccess'])
+            ->getMock();
+
+        $person = $this->getMockBuilder(Person::class)->disableOriginalConstructor()->getMock();
+        $person->method('getUsername')->willReturn('foo');
+
+        $this->access->method('getId')->willReturn(1);
+        $this->access->method('getPerson')->willReturn($person);
 
-        $this->accessUtilsMock
+        $contactPoint = $this->getMockBuilder(ContactPoint::class)->disableOriginalConstructor()->getMock();
+        $contactPoint->method('getEmail')->willReturn('foo@bar.net');
+
+        $this->accessUtils
             ->method('findAdminFor')
             ->with($this->organization)
-            ->willReturn($administrator);
+            ->willReturn($this->access);
 
-        $this->contactPointUtilsMock
+        $this->contactPointUtils
             ->method('getPersonContactPointPrincipal')
-            ->with($administrator)
+            ->with($this->access)
             ->willReturn($contactPoint);
 
-        $this->assertInstanceOf(AdminAccess::class, $this->adminAccessUtils->getAdminAccess($this->organization));
+        $returned = $adminAccessUtils->getAdminAccess($this->organization);
+
+        $this->assertInstanceOf(AdminAccess::class, $returned);
     }
 }

+ 78 - 69
tests/Service/Access/UtilsTest.php

@@ -5,114 +5,123 @@ namespace App\Test\Service\Access;
 use App\Entity\Access\Access;
 use App\Entity\Organization\Organization;
 use App\Repository\Access\AccessRepository;
-use App\Service\Access\HandleOptionalsRoles;
-use App\Service\Access\Utils;
+use App\Service\Access\Utils as AccessUtils;
 use App\Service\ServiceIterator\OptionalsRolesIterator;
+use PHPUnit\Framework\MockObject\MockObject;
 use PHPUnit\Framework\TestCase;
 use Symfony\Component\Security\Core\Role\RoleHierarchy;
 
 class UtilsTest extends TestCase
 {
-    private Utils $utils;
-    private AccessRepository $accessRepositoryMock;
+    private MockObject | RoleHierarchy $roleHierarchy;
+    private MockObject | OptionalsRolesIterator $optionalsRolesIterator;
+    private MockObject | AccessRepository $accessRepository;
 
     public function setUp():void
     {
-        $roleHierarchyMock = $this->getMockBuilder(RoleHierarchy::class)->disableOriginalConstructor()->getMock();
-        $roleHierarchyMock
-            ->method('getReachableRoleNames')
-            ->willReturn(["ROLE_A", "ROLE_B"]);
-
-
-        $optionalsRolesIteratorMock = $this->getMockBuilder(OptionalsRolesIterator::class)->disableOriginalConstructor()->getMock();
-        $optionalsRolesIteratorMock
-            ->method('getOptionalsRoles')
-            ->willReturn(["ROLE_OPT"]);
-
-        $this->accessRepositoryMock = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
-
-        $this->utils = new Utils($roleHierarchyMock,  $this->accessRepositoryMock, $optionalsRolesIteratorMock);
+        $this->roleHierarchy = $this->getMockBuilder(RoleHierarchy::class)->disableOriginalConstructor()->getMock();
+        $this->optionalsRolesIterator = $this->getMockBuilder(OptionalsRolesIterator::class)->disableOriginalConstructor()->getMock();
+        $this->accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
     }
 
     /**
      * @see Utils::filterAccesses()
      */
-    public function testFilterAccesses(){
-        $accessMock1 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
-        $accessMock1
-            ->method('getId')
-            ->willReturn(1);
-        $accessesMock[] = $accessMock1;
-        $accessMock2 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
-        $accessMock2
-            ->method('getId')
-            ->willReturn(2);
-        $accessesMock[] = $accessMock2;
-        $accessMock3 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
-        $accessMock3
-            ->method('getId')
-            ->willReturn(3);
-        $accessesMock[] = $accessMock3;
-
-        $this->assertCount(2, $this->utils->filterAccesses($accessesMock, $accessMock2));
-    }
+    public function testFilterAccesses(): void
+    {
+        $accessUtils = $this->getMockBuilder(AccessUtils::class)
+            ->setConstructorArgs([$this->roleHierarchy,  $this->accessRepository, $this->optionalsRolesIterator])
+            ->setMethodsExcept(['filterAccesses'])
+            ->getMock();
 
-    /**
-     * @see Utils::hasRoles()
-     */
-    public function testHasRoles(){
-        $accessMock1 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
-        $accessMock1
-            ->method('getRoles')
-            ->willReturn(['ROLE_A']);
+        $access1 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
+        $access1->method('getId')->willReturn(1);
+
+        $access2 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
+        $access2->method('getId')->willReturn(2);
+
+        $access3 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
+        $access3->method('getId')->willReturn(3);
+
+        $accesses = [$access1, $access2, $access3];
+
+        $result = $accessUtils->filterAccesses($accesses, $access2);
 
-        $this->assertTrue($this->utils->hasRoles($accessMock1, 'ROLE_A'));
+        $this->assertEqualsCanonicalizing(
+            [$access1->getId(), $access3->getId()],
+            array_map(static function ($access) { return $access->getId(); }, $result)
+        );
     }
 
     /**
      * @see Utils::hasRoles()
      */
-    public function testHasNotRoles(){
-        $accessMock1 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
-        $accessMock1
-            ->method('getRoles')
-            ->willReturn(['ROLE_A']);
+    public function testHasRoles(): void
+    {
+        $accessUtils = $this->getMockBuilder(AccessUtils::class)
+            ->setConstructorArgs([$this->roleHierarchy,  $this->accessRepository, $this->optionalsRolesIterator])
+            ->setMethodsExcept(['hasRoles'])
+            ->getMock();
 
-        $this->assertFalse($this->utils->hasRoles($accessMock1, 'ROLE_X'));
-    }
+        $access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
 
+        $accessUtils->method('getAllRoles')->with($access)->willReturn(['ROLE_A']);
+
+        $this->assertTrue($accessUtils->hasRoles($access, 'ROLE_A'));
+        $this->assertFalse($accessUtils->hasRoles($access, 'ROLE_B'));
+    }
 
     /**
      * @see Utils::getAllRoles()
      */
-    public function testGetAllRoles(){
-        $accessMock1 = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
-        $accessMock1
-            ->method('getRoles')
-            ->willReturn(['ROLE_A']);
+    public function testGetAllRoles(): void
+    {
+        $accessUtils = $this->getMockBuilder(AccessUtils::class)
+            ->setConstructorArgs([$this->roleHierarchy,  $this->accessRepository, $this->optionalsRolesIterator])
+            ->setMethodsExcept(['getAllRoles'])
+            ->getMock();
+
+        $access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
+        $access->method('getRoles')->willReturn(['ROLE_A']);
+
+        $this->roleHierarchy->method('getReachableRoleNames')->willReturn(["ROLE_A", "ROLE_B"]);
+        $this->optionalsRolesIterator->method('getOptionalsRoles')->willReturn(["ROLE_OPT"]);
 
-        $this->assertEquals(['ROLE_A', 'ROLE_B'], $this->utils->getAllRoles($accessMock1));
+        $this->assertEquals(['ROLE_A', 'ROLE_B'], $accessUtils->getAllRoles($access));
     }
 
     /**
      * @see Utils::findAdminFor()
      */
-    public function testFindAdminFor(){
-        $this->accessRepositoryMock
-            ->method('findOneBy')
-            ->willReturn(new Access());
+    public function testFindAdminFor(): void
+    {
+        $accessUtils = $this->getMockBuilder(AccessUtils::class)
+            ->setConstructorArgs([$this->roleHierarchy,  $this->accessRepository, $this->optionalsRolesIterator])
+            ->setMethodsExcept(['findAdminFor'])
+            ->getMock();
+
+        $access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock();
+        $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
+
+        $this->accessRepository->method('findOneBy')->with(['adminAccess' => true, 'organization' => $organization])->willReturn($access);
 
-        $this->assertNotEmpty($this->utils->findAdminFor(new Organization()));
+        $this->assertNotEmpty($accessUtils->findAdminFor($organization));
     }
 
     /**
      * @see Utils::findAdminFor()
      */
-    public function testFindAdminForNotFound(){
-        $this->accessRepositoryMock
-            ->method('findOneBy')
-            ->willReturn(null);
+    public function testFindAdminForNotFound(): void
+    {
+        $accessUtils = $this->getMockBuilder(AccessUtils::class)
+            ->setConstructorArgs([$this->roleHierarchy,  $this->accessRepository, $this->optionalsRolesIterator])
+            ->setMethodsExcept(['findAdminFor'])
+            ->getMock();
+
+        $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock();
+
+        $this->accessRepository->method('findOneBy')->with(['adminAccess' => true, 'organization' => $organization])->willReturn(null);
 
-        $this->assertNull($this->utils->findAdminFor(new Organization()));
+        $this->assertNull($accessUtils->findAdminFor($organization));
     }
 }