From 67571e8b338d0b76f83a4707ea047e5b94e109c6 Mon Sep 17 00:00:00 2001 From: thibaud-leclere Date: Wed, 1 Apr 2026 22:58:52 +0200 Subject: [PATCH] feat: add AwardTypeRepository::findWithMinActors() Co-Authored-By: Claude Sonnet 4.6 --- .env.test | 1 + config/packages/doctrine.yaml | 5 ++ src/Repository/AwardTypeRepository.php | 13 ++++ tests/Repository/AwardTypeRepositoryTest.php | 68 ++++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 tests/Repository/AwardTypeRepositoryTest.php diff --git a/.env.test b/.env.test index 64bd111..040431c 100644 --- a/.env.test +++ b/.env.test @@ -1,3 +1,4 @@ # define your env variables for the test env here KERNEL_CLASS='App\Kernel' APP_SECRET='$ecretf0rt3st' +POSTGRES_DB=app_test diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index fbc30d7..9137730 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -33,6 +33,11 @@ doctrine: numeric_functions: Random: App\Doctrine\Extension\Random +when@test: + doctrine: + dbal: + dbname: app_test + when@prod: doctrine: orm: diff --git a/src/Repository/AwardTypeRepository.php b/src/Repository/AwardTypeRepository.php index f5beb63..5f3bea1 100644 --- a/src/Repository/AwardTypeRepository.php +++ b/src/Repository/AwardTypeRepository.php @@ -21,4 +21,17 @@ class AwardTypeRepository extends ServiceEntityRepository { return parent::findAll(); } + + /** @return list */ + public function findWithMinActors(int $minActors): array + { + return $this->createQueryBuilder('at') + ->join('at.awards', 'a') + ->groupBy('at.id') + ->having('COUNT(DISTINCT a.actor) >= :minActors') + ->setParameter('minActors', $minActors) + ->orderBy('at.name', 'ASC') + ->getQuery() + ->getResult(); + } } diff --git a/tests/Repository/AwardTypeRepositoryTest.php b/tests/Repository/AwardTypeRepositoryTest.php new file mode 100644 index 0000000..bcf472f --- /dev/null +++ b/tests/Repository/AwardTypeRepositoryTest.php @@ -0,0 +1,68 @@ +em = self::getContainer()->get(EntityManagerInterface::class); + $this->repo = self::getContainer()->get(AwardTypeRepository::class); + + // Clean slate + $this->em->createQuery('DELETE FROM App\Entity\Award')->execute(); + $this->em->createQuery('DELETE FROM App\Entity\AwardType')->execute(); + $this->em->createQuery('DELETE FROM App\Entity\Actor')->execute(); + } + + public function testFindWithMinActorsFiltersCorrectly(): void + { + $smallType = new AwardType(); + $smallType->setName('Small Award')->setPattern('small'); + $this->em->persist($smallType); + + $bigType = new AwardType(); + $bigType->setName('Big Award')->setPattern('big'); + $this->em->persist($bigType); + + for ($i = 0; $i < 6; $i++) { + $actor = new Actor(); + $actor->setName("Actor $i"); + $this->em->persist($actor); + + $award = new Award(); + $award->setName("Big Award $i"); + $award->setActor($actor); + $award->setAwardType($bigType); + $this->em->persist($award); + + if ($i < 3) { + $awardSmall = new Award(); + $awardSmall->setName("Small Award $i"); + $awardSmall->setActor($actor); + $awardSmall->setAwardType($smallType); + $this->em->persist($awardSmall); + } + } + + $this->em->flush(); + + $result = $this->repo->findWithMinActors(5); + + $this->assertCount(1, $result); + $this->assertSame('Big Award', $result[0]->getName()); + } +}