feat: add AwardTypeRepository::findWithMinActors()

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
thibaud-leclere
2026-04-01 22:58:52 +02:00
parent 5fbac8359f
commit 67571e8b33
4 changed files with 87 additions and 0 deletions

View File

@@ -1,3 +1,4 @@
# define your env variables for the test env here # define your env variables for the test env here
KERNEL_CLASS='App\Kernel' KERNEL_CLASS='App\Kernel'
APP_SECRET='$ecretf0rt3st' APP_SECRET='$ecretf0rt3st'
POSTGRES_DB=app_test

View File

@@ -33,6 +33,11 @@ doctrine:
numeric_functions: numeric_functions:
Random: App\Doctrine\Extension\Random Random: App\Doctrine\Extension\Random
when@test:
doctrine:
dbal:
dbname: app_test
when@prod: when@prod:
doctrine: doctrine:
orm: orm:

View File

@@ -21,4 +21,17 @@ class AwardTypeRepository extends ServiceEntityRepository
{ {
return parent::findAll(); return parent::findAll();
} }
/** @return list<AwardType> */
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();
}
} }

View File

@@ -0,0 +1,68 @@
<?php
declare(strict_types=1);
namespace App\Tests\Repository;
use App\Entity\Actor;
use App\Entity\Award;
use App\Entity\AwardType;
use App\Repository\AwardTypeRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
class AwardTypeRepositoryTest extends KernelTestCase
{
private EntityManagerInterface $em;
private AwardTypeRepository $repo;
protected function setUp(): void
{
self::bootKernel();
$this->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());
}
}