diff --git a/src/Bundle/ChillDocStoreBundle/Tests/Security/Authorization/AccompanyingCourseStoredObjectVoterTest.php b/src/Bundle/ChillDocStoreBundle/Tests/Security/Authorization/AccompanyingCourseStoredObjectVoterTest.php new file mode 100644 index 000000000..f7ad25987 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Tests/Security/Authorization/AccompanyingCourseStoredObjectVoterTest.php @@ -0,0 +1,106 @@ +repository = $this->createMock(AccompanyingCourseDocumentRepository::class); + $this->security = $this->createMock(Security::class); + $this->workflowDocumentService = $this->createMock(WorkflowDocumentService::class); + + $this->voter = new AccompanyingCourseStoredObjectVoter( + $this->repository, + $this->security, + $this->workflowDocumentService + ); + } + + private function setupMockObjects(): array + { + $user = $this->createMock(User::class); + $token = $this->createMock(TokenInterface::class); + $subject = $this->createMock(StoredObject::class); + $entity = $this->createMock(AccompanyingCourseDocument::class); + + return [$user, $token, $subject, $entity]; + } + + private function setupMocksForVoteOnAttribute(User $user, TokenInterface $token, bool $isGrantedForAccCourseDocument, AccompanyingCourseDocument $entity, bool $workflowAllowed): void + { + // Set up token to return user + $token->method('getUser')->willReturn($user); + + // Mock the return of an AccompanyingCourseDocument by the repository + $this->repository->method('findAssociatedEntityToStoredObject')->willReturn($entity); + + // Mock attributeToRole to return appropriate role + $this->voter->method('attributeToRole')->willReturn(AccompanyingCourseDocumentVoter::SEE_DETAILS); + + // Mock scenario where user is allowed to see_details of the AccompanyingCourseDocument + $this->security->method('isGranted')->willReturnMap([ + [[AccompanyingCourseDocumentVoter::SEE_DETAILS, $entity], $isGrantedForAccCourseDocument], + ]); + + // Mock case where user is blocked or not by workflow + $this->workflowDocumentService->method('notBlockedByWorkflow')->willReturn($workflowAllowed); + } + + public function testVoteOnAttributeAllowed(): void + { + list($user, $token, $subject, $entity) = $this->setupMockObjects(); + + // Setup mocks for voteOnAttribute method + $this->setupMocksForVoteOnAttribute($user, $token, true, $entity, true); + + // The voteOnAttribute method should return True when workflow is allowed + $attributeSee = StoredObjectRoleEnum::SEE; + $attributeEdit = StoredObjectRoleEnum::EDIT; + $this->assertTrue($this->voter->voteOnAttribute($attributeSee, $subject, $token)); + } + + public function testVoteOnAttributeNotAllowed(): void + { + list($user, $token, $subject, $entity) = $this->setupMockObjects(); + + // Setup mocks for voteOnAttribute method where isGranted() returns false + $this->setupMocksForVoteOnAttribute($user, $token, false, $entity, true); + + // The voteOnAttribute method should return True when workflow is allowed + $attributeSee = StoredObjectRoleEnum::SEE; + $attributeEdit = StoredObjectRoleEnum::EDIT; + $this->assertTrue($this->voter->voteOnAttribute($attributeSee, $subject, $token)); + } + + public function testVoteOnAttributeWhenBlockedByWorkflow(): void + { + list($user, $token, $subject, $entity) = $this->setupMockObjects(); + + // Setup mocks for voteOnAttribute method + $this->setupMocksForVoteOnAttribute($user, $token, $subject, $entity, false); + + // Test voteOnAttribute method + $attribute = StoredObjectRoleEnum::SEE; + $result = $this->voter->voteOnAttribute($attribute, $subject, $token); + + // Assert that access is denied when workflow is not allowed + $this->assertFalse($result); + } +}