From 25242299414afabf221eacf562be968c21a092d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 9 Dec 2021 12:44:41 +0100 Subject: [PATCH] docgen normalization for relation --- .../Relationships/RelationshipRepository.php | 26 +++++++++++++++ .../Normalizer/PersonDocGenNormalizerTest.php | 32 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/Bundle/ChillPersonBundle/Repository/Relationships/RelationshipRepository.php b/src/Bundle/ChillPersonBundle/Repository/Relationships/RelationshipRepository.php index 9549a4564..edb87ae0d 100644 --- a/src/Bundle/ChillPersonBundle/Repository/Relationships/RelationshipRepository.php +++ b/src/Bundle/ChillPersonBundle/Repository/Relationships/RelationshipRepository.php @@ -24,6 +24,8 @@ class RelationshipRepository implements ObjectRepository private EntityRepository $repository; + private EntityManagerInterface $em; + public function __construct(EntityManagerInterface $em) { $this->repository = $em->getRepository(Relationship::class); @@ -64,6 +66,30 @@ class RelationshipRepository implements ObjectRepository ->getResult(); } + public function countByPerson(Person $person): int + { + return $this->buildQueryByPerson($person) + ->select('COUNT(p)') + ->getQuery() + ->getSingleScalarResult(); + } + + private function buildQueryByPerson(Person $person): QueryBuilder + { + $qb = $this->em->createQueryBuilder(); + $qb + ->from(Relationship::class, 'r') + ->where( + $qb->expr()->orX( + $qb->expr()->eq('r.fromPerson', ':person'), + $qb->expr()->eq('r.toPerson', ':person') + ) + ) + ->setParameter('person', $person); + + return $qb; + } + public function findOneBy(array $criteria): ?Relationship { return $this->findOneBy($criteria); diff --git a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php index 6c9d8de5c..63649ab7e 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php @@ -60,6 +60,38 @@ final class PersonDocGenNormalizerTest extends KernelTestCase private NormalizerInterface $normalizer; + private function buildPersonNormalizer( + ?PersonRender $personRender = null, + ?RelationshipRepository $relationshipRepository = null, + ?TranslatorInterface $translator = null, + ?TranslatableStringHelper $translatableStringHelper = null + ): PersonDocGenNormalizer { + $normalizer = new PersonDocGenNormalizer( + $personRender ?? self::$container->get(PersonRender::class), + $relationshipRepository ?? self::$container->get(RelationshipRepository::class), + $translator ??self::$container->get(TranslatorInterface::class), + $translatableStringHelper ?? self::$container->get(TranslatableStringHelperInterface::class) + ); + $normalizerManager = $this->prophesize(NormalizerInterface::class); + $normalizerManager->supportsNormalization(Argument::any(), 'docgen', Argument::any())->willReturn(true); + $normalizerManager->normalize(Argument::type(Person::class), 'docgen', Argument::any()) + ->will(function($args) use ($normalizer) { + return $normalizer->normalize($args[0], $args[1], $args[2]); + }); + $normalizerManager->normalize(Argument::any(), 'docgen', Argument::any())->will( + function ($args) { + if (is_iterable($args[0])) { + $r = []; + foreach ($args[0] as $i) { $r[] = ['fake' => true, 'hash' => spl_object_hash($i)];} + return $r; + } + return ['fake' => true, 'hash' => null !== $args[0] ? spl_object_hash($args[0]) : null]; + }); + $normalizer->setNormalizer($normalizerManager->reveal()); + + return $normalizer; + } + protected function setUp() { self::bootKernel();