From c8770764298cac00d217da11f8439ff1c60cafe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 22 Oct 2024 23:15:03 +0200 Subject: [PATCH] Add and update test handlers for suggested users retrieval Introduced new test files for workflow handlers and adjusted existing `getSuggestedUsers` methods to handle related entity checks and duplicates removal. Also, modified repos to align with test dependencies. --- ...nyingCourseDocumentWorkflowHandlerTest.php | 86 +++++++++++++++++++ ...ompanyingCourseDocumentWorkflowHandler.php | 24 +++++- ...PeriodWorkEvaluationDocumentRepository.php | 4 +- .../AccompanyingPeriodWorkRepository.php | 6 +- ...kEvaluationDocumentWorkflowHandlerTest.php | 82 ++++++++++++++++++ ...eriodWorkEvaluationWorkflowHandlerTest.php | 72 ++++++++++++++++ ...ompanyingPeriodWorkWorkflowHandlerTest.php | 73 ++++++++++++++++ ...dWorkEvaluationDocumentWorkflowHandler.php | 31 +++++-- ...ingPeriodWorkEvaluationWorkflowHandler.php | 30 +++++-- .../AccompanyingPeriodWorkWorkflowHandler.php | 31 +++++-- 10 files changed, 410 insertions(+), 29 deletions(-) create mode 100644 src/Bundle/ChillDocStoreBundle/Tests/Workflow/AccompanyingCourseDocumentWorkflowHandlerTest.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkEvaluationDocumentWorkflowHandlerTest.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkEvaluationWorkflowHandlerTest.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkWorkflowHandlerTest.php diff --git a/src/Bundle/ChillDocStoreBundle/Tests/Workflow/AccompanyingCourseDocumentWorkflowHandlerTest.php b/src/Bundle/ChillDocStoreBundle/Tests/Workflow/AccompanyingCourseDocumentWorkflowHandlerTest.php new file mode 100644 index 000000000..e40b240f4 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Tests/Workflow/AccompanyingCourseDocumentWorkflowHandlerTest.php @@ -0,0 +1,86 @@ +setCourse($accompanyingPeriod)->setUser($user1 = new User()); + $accompanyingPeriod->setUser($user = new User()); + $entityWorkflow = new EntityWorkflow(); + $entityWorkflow->setRelatedEntityId(1); + + $handler = new AccompanyingCourseDocumentWorkflowHandler( + $this->prophesize(TranslatorInterface::class)->reveal(), + $this->prophesize(EntityWorkflowRepository::class)->reveal(), + $this->buildRepository($document, 1), + new WorkflowWithPublicViewDocumentHelper($this->prophesize(Environment::class)->reveal()), + ); + + $users = $handler->getSuggestedUsers($entityWorkflow); + + self::assertCount(2, $users); + self::assertContains($user, $users); + self::assertContains($user1, $users); + } + + public function testGetSuggestedUsersWithDuplicates() + { + $accompanyingPeriod = new AccompanyingPeriod(); + $document = new AccompanyingCourseDocument(); + $document->setCourse($accompanyingPeriod)->setUser($user1 = new User()); + $accompanyingPeriod->setUser($user1); + $entityWorkflow = new EntityWorkflow(); + $entityWorkflow->setRelatedEntityId(1); + + $handler = new AccompanyingCourseDocumentWorkflowHandler( + $this->prophesize(TranslatorInterface::class)->reveal(), + $this->prophesize(EntityWorkflowRepository::class)->reveal(), + $this->buildRepository($document, 1), + new WorkflowWithPublicViewDocumentHelper($this->prophesize(Environment::class)->reveal()), + ); + + $users = $handler->getSuggestedUsers($entityWorkflow); + + self::assertCount(1, $users); + self::assertContains($user1, $users); + } + + private function buildRepository(AccompanyingCourseDocument $document, int $id): AccompanyingCourseDocumentRepository + { + $repository = $this->prophesize(AccompanyingCourseDocumentRepository::class); + $repository->find($id)->willReturn($document); + + return $repository->reveal(); + } +} diff --git a/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php b/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php index 4f4655b94..b98e5d4a9 100644 --- a/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php +++ b/src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php @@ -91,12 +91,28 @@ final readonly class AccompanyingCourseDocumentWorkflowHandler implements Entity public function getSuggestedUsers(EntityWorkflow $entityWorkflow): array { - $suggestedUsers = $entityWorkflow->getUsersInvolved(); + $related = $this->getRelatedEntity($entityWorkflow); - $referrer = $this->getRelatedEntity($entityWorkflow)->getCourse()->getUser(); - $suggestedUsers[spl_object_hash($referrer)] = $referrer; + if (null === $related) { + return []; + } - return $suggestedUsers; + $users = []; + if (null !== $user = $related->getUser()) { + $users[] = $user; + } + if (null !== $user = $related->getCourse()->getUser()) { + $users[] = $user; + } + + return array_values( + // filter objects to remove duplicates + array_filter( + $users, + fn ($o, $k) => array_search($o, $users, true) === $k, + ARRAY_FILTER_USE_BOTH + ) + ); } public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string diff --git a/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkEvaluationDocumentRepository.php b/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkEvaluationDocumentRepository.php index e3a484f0b..6baa0d069 100644 --- a/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkEvaluationDocumentRepository.php +++ b/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkEvaluationDocumentRepository.php @@ -19,9 +19,9 @@ use Doctrine\ORM\EntityRepository; use Doctrine\ORM\NonUniqueResultException; use Doctrine\Persistence\ObjectRepository; -readonly class AccompanyingPeriodWorkEvaluationDocumentRepository implements ObjectRepository, AssociatedEntityToStoredObjectInterface +class AccompanyingPeriodWorkEvaluationDocumentRepository implements ObjectRepository, AssociatedEntityToStoredObjectInterface { - private EntityRepository $repository; + private readonly EntityRepository $repository; public function __construct(EntityManagerInterface $em) { diff --git a/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php b/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php index 95b995e74..0d5bf5eee 100644 --- a/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php +++ b/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php @@ -22,11 +22,11 @@ use Doctrine\ORM\Query\ResultSetMappingBuilder; use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ObjectRepository; -final readonly class AccompanyingPeriodWorkRepository implements ObjectRepository +class AccompanyingPeriodWorkRepository implements ObjectRepository { - private EntityRepository $repository; + private readonly EntityRepository $repository; - public function __construct(private EntityManagerInterface $em) + public function __construct(private readonly EntityManagerInterface $em) { $this->repository = $em->getRepository(AccompanyingPeriodWork::class); } diff --git a/src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkEvaluationDocumentWorkflowHandlerTest.php b/src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkEvaluationDocumentWorkflowHandlerTest.php new file mode 100644 index 000000000..2e7076a4d --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkEvaluationDocumentWorkflowHandlerTest.php @@ -0,0 +1,82 @@ +setUser($referrer = new User()); + $accompanyingCourse->addWork($work = new AccompanyingPeriod\AccompanyingPeriodWork()); + $work->addReferrer($workReferrer1 = new User()); + $work->addReferrer($workReferrer2 = new User()); + $work->addReferrer($referrer); + $work->addAccompanyingPeriodWorkEvaluation($eval = new AccompanyingPeriod\AccompanyingPeriodWorkEvaluation()); + $eval->addDocument($doc = new AccompanyingPeriodWorkEvaluationDocument()); + $entityWorkflow = new EntityWorkflow(); + + // Prophesize each dependency + $workflowRepositoryProphecy = $this->prophesize(EntityWorkflowRepository::class); + $translatableStringHelperProphecy = $this->prophesize(TranslatableStringHelperInterface::class); + $translatorProphecy = $this->prophesize(TranslatorInterface::class); + $twig = $this->prophesize(Environment::class); + + // Create an instance of the class under test using revealed prophecies directly + $handler = new AccompanyingPeriodWorkEvaluationDocumentWorkflowHandler( + $this->buildRepository($doc, 1), + $workflowRepositoryProphecy->reveal(), + $translatableStringHelperProphecy->reveal(), + $translatorProphecy->reveal(), + new WorkflowWithPublicViewDocumentHelper($twig->reveal()), + ); + + $entityWorkflow->setRelatedEntityId(1); + $entityWorkflow->setRelatedEntityClass(AccompanyingPeriodWorkEvaluationDocument::class); + + $users = $handler->getSuggestedUsers($entityWorkflow); + + self::assertContains($referrer, $users); + self::assertContains($workReferrer1, $users); + self::assertContains($workReferrer2, $users); + } + + private function buildRepository(AccompanyingPeriodWorkEvaluationDocument $document, int $id): AccompanyingPeriodWorkEvaluationDocumentRepository + { + $repository = $this->prophesize(AccompanyingPeriodWorkEvaluationDocumentRepository::class); + + $repository->find($id)->willReturn($document); + + return $repository->reveal(); + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkEvaluationWorkflowHandlerTest.php b/src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkEvaluationWorkflowHandlerTest.php new file mode 100644 index 000000000..1f62e5bb3 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkEvaluationWorkflowHandlerTest.php @@ -0,0 +1,72 @@ +setUser($referrer = new User()); + $accompanyingCourse->addWork($work = new AccompanyingPeriod\AccompanyingPeriodWork()); + $work->addReferrer($workReferrer1 = new User()); + $work->addReferrer($workReferrer2 = new User()); + $work->addReferrer($referrer); + $work->addAccompanyingPeriodWorkEvaluation($eval = new AccompanyingPeriod\AccompanyingPeriodWorkEvaluation()); + $entityWorkflow = new EntityWorkflow(); + $entityWorkflow->setRelatedEntityId(1); + + // Prophesize each dependency + $workflowRepositoryProphecy = $this->prophesize(EntityWorkflowRepository::class); + $translatableStringHelperProphecy = $this->prophesize(TranslatableStringHelperInterface::class); + $translatorProphecy = $this->prophesize(TranslatorInterface::class); + + // Create an instance of the class under test using revealed prophecies directly + $handler = new AccompanyingPeriodWorkEvaluationWorkflowHandler( + $this->buildRepository($eval, 1), + $workflowRepositoryProphecy->reveal(), + $translatableStringHelperProphecy->reveal(), + $translatorProphecy->reveal(), + ); + + $users = $handler->getSuggestedUsers($entityWorkflow); + + self::assertContains($referrer, $users); + self::assertContains($workReferrer1, $users); + self::assertContains($workReferrer2, $users); + } + + private function buildRepository(AccompanyingPeriod\AccompanyingPeriodWorkEvaluation $evaluation, int $id): AccompanyingPeriodWorkEvaluationRepository + { + $evaluationRepositoryProphecy = $this->prophesize(AccompanyingPeriodWorkEvaluationRepository::class); + $evaluationRepositoryProphecy->find($id)->willReturn($evaluation); + + return $evaluationRepositoryProphecy->reveal(); + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkWorkflowHandlerTest.php b/src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkWorkflowHandlerTest.php new file mode 100644 index 000000000..1d3702871 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Workflow/AccompanyingPeriodWorkWorkflowHandlerTest.php @@ -0,0 +1,73 @@ +setUser($referrer = new User()); + $accompanyingCourse->addWork($work = new AccompanyingPeriod\AccompanyingPeriodWork()); + $work->addReferrer($workReferrer1 = new User()); + $work->addReferrer($workReferrer2 = new User()); + $work->addReferrer($referrer); + $entityWorkflow = new EntityWorkflow(); + $entityWorkflow->setRelatedEntityId(1); + + // Prophesize each dependency + $workflowRepositoryProphecy = $this->prophesize(EntityWorkflowRepository::class); + $translatableStringHelperProphecy = $this->prophesize(TranslatableStringHelperInterface::class); + $translatorProphecy = $this->prophesize(TranslatorInterface::class); + + // Create an instance of the class under test using revealed prophecies directly + $handler = new AccompanyingPeriodWorkWorkflowHandler( + $this->buildRepository($work, 1), + $workflowRepositoryProphecy->reveal(), + $translatableStringHelperProphecy->reveal(), + $translatorProphecy->reveal(), + ); + + $users = $handler->getSuggestedUsers($entityWorkflow); + + self::assertContains($referrer, $users); + self::assertContains($workReferrer1, $users); + self::assertContains($workReferrer2, $users); + } + + private function buildRepository(AccompanyingPeriod\AccompanyingPeriodWork $work, int $int): AccompanyingPeriodWorkRepository + { + $accompanyingPeriodWorkRepositoryProphecy = $this->prophesize(AccompanyingPeriodWorkRepository::class); + $accompanyingPeriodWorkRepositoryProphecy + ->find($int) + ->willReturn($work); + + return $accompanyingPeriodWorkRepositoryProphecy->reveal(); + } +} diff --git a/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkEvaluationDocumentWorkflowHandler.php b/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkEvaluationDocumentWorkflowHandler.php index e2f8e7666..1168d8f35 100644 --- a/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkEvaluationDocumentWorkflowHandler.php +++ b/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkEvaluationDocumentWorkflowHandler.php @@ -98,17 +98,36 @@ class AccompanyingPeriodWorkEvaluationDocumentWorkflowHandler implements EntityW public function getSuggestedUsers(EntityWorkflow $entityWorkflow): array { - $suggestedUsers = $entityWorkflow->getUsersInvolved(); + $related = $this->getRelatedEntity($entityWorkflow); - $referrer = $this->getRelatedEntity($entityWorkflow) - ->getAccompanyingPeriodWorkEvaluation() + if (null === $related) { + return []; + } + + $users = []; + if (null !== $referrer = $related->getAccompanyingPeriodWorkEvaluation() ->getAccompanyingPeriodWork() ->getAccompanyingPeriod() - ->getUser(); + ->getUser() + ) { + $users[] = $referrer; + } - $suggestedUsers[spl_object_hash($referrer)] = $referrer; + foreach ($related->getAccompanyingPeriodWorkEvaluation() + ->getAccompanyingPeriodWork() + ->getReferrersHistoryCurrent() as $referrerHistory + ) { + $users[] = $referrerHistory->getUser(); + } - return $suggestedUsers; + return array_values( + // filter objects to remove duplicates + array_filter( + $users, + fn ($o, $k) => array_search($o, $users, true) === $k, + ARRAY_FILTER_USE_BOTH + ) + ); } public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string diff --git a/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkEvaluationWorkflowHandler.php b/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkEvaluationWorkflowHandler.php index e619532ff..302bbb0be 100644 --- a/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkEvaluationWorkflowHandler.php +++ b/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkEvaluationWorkflowHandler.php @@ -81,16 +81,34 @@ readonly class AccompanyingPeriodWorkEvaluationWorkflowHandler implements Entity public function getSuggestedUsers(EntityWorkflow $entityWorkflow): array { - $suggestedUsers = $entityWorkflow->getUsersInvolved(); + $related = $this->getRelatedEntity($entityWorkflow); - $referrer = $this->getRelatedEntity($entityWorkflow) - ->getAccompanyingPeriodWork() + if (null === $related) { + return []; + } + + $users = []; + if (null !== $referrer = $related->getAccompanyingPeriodWork() ->getAccompanyingPeriod() - ->getUser(); + ->getUser() + ) { + $users[] = $referrer; + } - $suggestedUsers[spl_object_hash($referrer)] = $referrer; + foreach ($related->getAccompanyingPeriodWork() + ->getReferrersHistoryCurrent() as $referrerHistory + ) { + $users[] = $referrerHistory->getUser(); + } - return $suggestedUsers; + return array_values( + // filter objects to remove duplicates + array_filter( + $users, + fn ($o, $k) => array_search($o, $users, true) === $k, + ARRAY_FILTER_USE_BOTH + ) + ); } public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string diff --git a/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkWorkflowHandler.php b/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkWorkflowHandler.php index 772523ad5..8a7b5ef48 100644 --- a/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkWorkflowHandler.php +++ b/src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkWorkflowHandler.php @@ -87,17 +87,32 @@ readonly class AccompanyingPeriodWorkWorkflowHandler implements EntityWorkflowHa public function getSuggestedUsers(EntityWorkflow $entityWorkflow): array { - $suggestedUsers = $entityWorkflow->getUsersInvolved(); + $related = $this->getRelatedEntity($entityWorkflow); - $referrer = $this->getRelatedEntity($entityWorkflow) - ->getAccompanyingPeriod() - ->getUser(); - - if (null !== $referrer) { - $suggestedUsers[spl_object_hash($referrer)] = $referrer; + if (null === $related) { + return []; } - return $suggestedUsers; + $users = []; + if (null !== $referrer = $related->getAccompanyingPeriod() + ->getUser() + ) { + $users[] = $referrer; + } + + foreach ($related->getReferrersHistoryCurrent() as $referrerHistory + ) { + $users[] = $referrerHistory->getUser(); + } + + return array_values( + // filter objects to remove duplicates + array_filter( + $users, + fn ($o, $k) => array_search($o, $users, true) === $k, + ARRAY_FILTER_USE_BOTH + ) + ); } public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string