roleHierarchy = $this->getMockBuilder(RoleHierarchy::class)->disableOriginalConstructor()->getMock(); $this->optionalsRolesIterator = $this->getMockBuilder(OptionalsRolesIterator::class)->disableOriginalConstructor()->getMock(); $this->accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock(); } public function tearDown(): void { DatesUtils::clearFakeDatetime(); } private function buildAccessUtilsMockForMethod(string $methodName): MockObject | AccessUtils { return $this->getMockBuilder(AccessUtils::class) ->setConstructorArgs([$this->roleHierarchy, $this->accessRepository, $this->optionalsRolesIterator]) ->setMethodsExcept([$methodName]) ->getMock(); } /** * @see Utils::filterAccesses() */ public function testFilterAccesses(): void { $accessUtils = $this->buildAccessUtilsMockForMethod('filterAccesses'); $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->assertEqualsCanonicalizing( [$access1->getId(), $access3->getId()], array_map(static function ($access) { return $access->getId(); }, $result) ); } /** * @see Utils::hasRole() */ public function testHasRole(): void { $accessUtils = $this->buildAccessUtilsMockForMethod('hasRole'); $access = $this->getMockBuilder(Access::class)->disableOriginalConstructor()->getMock(); $accessUtils->method('getAllRoles')->with($access)->willReturn(['ROLE_A']); $this->assertTrue($accessUtils->hasRole($access, 'ROLE_A')); $this->assertFalse($accessUtils->hasRole($access, 'ROLE_B')); } /** * @see Utils::getAllRoles() */ public function testGetAllRoles(): void { $accessUtils = $this->buildAccessUtilsMockForMethod('getAllRoles'); $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'], $accessUtils->getAllRoles($access)); } /** * @see Utils::findAdminFor() */ public function testFindAdminFor(): void { $accessUtils = $this->buildAccessUtilsMockForMethod('findAdminFor'); $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($accessUtils->findAdminFor($organization)); } /** * @see Utils::findAdminFor() */ public function testFindAdminForNotFound(): void { $accessUtils = $this->buildAccessUtilsMockForMethod('findAdminFor'); $organization = $this->getMockBuilder(Organization::class)->disableOriginalConstructor()->getMock(); $this->accessRepository->method('findOneBy')->with(['adminAccess' => true, 'organization' => $organization])->willReturn(null); $this->assertNull($accessUtils->findAdminFor($organization)); } public function testGetActiveFunctions(): void { $accessUtils = $this->buildAccessUtilsMockForMethod('getActiveFunctions'); DatesUtils::setFakeDatetime('2023-01-01 12:00'); $access = $this->getMockBuilder(Access::class)->getMock(); $functionType1 = $this->getMockBuilder(FunctionType::class)->getMock(); $functionType1->method('getMission')->willReturn('Mission1'); $function1 = $this->getMockBuilder(OrganizationFunction::class)->getMock(); $function1->method('getEndDate')->willReturn(null); $function1->method('getFunctionType')->willReturn($functionType1); $functionType2 = $this->getMockBuilder(FunctionType::class)->getMock(); $functionType2->method('getMission')->willReturn('Mission2'); $function2 = $this->getMockBuilder(OrganizationFunction::class)->getMock(); $function2->method('getEndDate')->willReturn(null); $function2->method('getFunctionType')->willReturn($functionType2); $functionType3 = $this->getMockBuilder(FunctionType::class)->getMock(); $functionType3->method('getMission')->willReturn('Mission3'); $function3 = $this->getMockBuilder(OrganizationFunction::class)->getMock(); $function3->method('getEndDate')->willReturn(new \DateTime('2022-01-01')); $function3->method('getFunctionType')->willReturn($functionType3); $functionType4 = $this->getMockBuilder(FunctionType::class)->getMock(); $functionType4->method('getMission')->willReturn('Mission4'); $function4 = $this->getMockBuilder(OrganizationFunction::class)->getMock(); $function4->method('getEndDate')->willReturn(new \DateTime('2023-01-01 18:00')); $function4->method('getFunctionType')->willReturn($functionType4); $functionType5 = $this->getMockBuilder(FunctionType::class)->getMock(); $functionType5->method('getMission')->willReturn('Mission5'); $function5 = $this->getMockBuilder(OrganizationFunction::class)->getMock(); $function5->method('getEndDate')->willReturn(new \DateTime('2023-06-01')); $function5->method('getFunctionType')->willReturn($functionType5); $access->method('getOrganizationFunction')->willReturn( new ArrayCollection([$function1, $function2, $function3, $function4, $function5]) ); $this->assertEquals( ['Mission1', 'Mission2', 'Mission4', 'Mission5'], $accessUtils->getActiveFunctions($access) ); } public function testHasActiveFunctions(): void { $accessUtils = $this->buildAccessUtilsMockForMethod('hasActiveFunction'); $access = $this->getMockBuilder(Access::class)->getMock(); $accessUtils ->method('getActiveFunctions') ->with($access) ->willReturn(['Mission1', 'Mission2']); $this->assertTrue( $accessUtils->hasActiveFunction($access, 'Mission1') ); $this->assertFalse( $accessUtils->hasActiveFunction($access, 'Mission3') ); } }