diff --git a/src/Repository/ActorRepository.php b/src/Repository/ActorRepository.php index 672b4ed..793c9c7 100644 --- a/src/Repository/ActorRepository.php +++ b/src/Repository/ActorRepository.php @@ -3,6 +3,8 @@ namespace App\Repository; use App\Entity\Actor; +use App\Entity\User; +use App\Entity\UserMovie; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; @@ -38,4 +40,29 @@ class ActorRepository extends ServiceEntityRepository ->getOneOrNullResult() ; } + + public function findOneRandomInWatchedFilms(User $user, ?float $popularity = null, ?string $char = null): ?Actor + { + $qb = $this->createQueryBuilder('a') + ->join('a.movieRoles', 'mr') + ->join('mr.movie', 'm') + ->join(UserMovie::class, 'um', 'WITH', 'um.movie = m AND um.user = :user') + ->setParameter('user', $user); + + if (!empty($popularity)) { + $qb->andWhere('a.popularity >= :popularity') + ->setParameter('popularity', $popularity); + } + + if (!empty($char)) { + $qb->andWhere('LOWER(a.name) LIKE LOWER(:name)') + ->setParameter('name', '%' . $char . '%'); + } + + return $qb + ->orderBy('RANDOM()') + ->setMaxResults(1) + ->getQuery() + ->getOneOrNullResult(); + } } diff --git a/tests/Repository/ActorRepositoryTest.php b/tests/Repository/ActorRepositoryTest.php new file mode 100644 index 0000000..937a221 --- /dev/null +++ b/tests/Repository/ActorRepositoryTest.php @@ -0,0 +1,82 @@ +em = self::getContainer()->get(EntityManagerInterface::class); + $this->repo = self::getContainer()->get(ActorRepository::class); + } + + public function testFindOneRandomInWatchedFilmsReturnsOnlyWatchedActors(): void + { + $user = new User(); + $user->setEmail('test-watched-' . uniqid() . '@example.com'); + $user->setPassword('test'); + $this->em->persist($user); + + $watchedActor = new Actor(); + $watchedActor->setName('Watched Actor'); + $watchedActor->setPopularity(10.0); + $this->em->persist($watchedActor); + + $movie = new Movie(); + $movie->setTmdbId(99990); + $movie->setLtbxdRef('watched-test'); + $movie->setTitle('Watched Film'); + $this->em->persist($movie); + + $role = new MovieRole(); + $role->setActor($watchedActor); + $role->setMovie($movie); + $role->setCharacter('Hero'); + $this->em->persist($role); + + $userMovie = new UserMovie(); + $userMovie->setUser($user); + $userMovie->setMovie($movie); + $this->em->persist($userMovie); + + $unwatchedActor = new Actor(); + $unwatchedActor->setName('Unwatched Actor'); + $unwatchedActor->setPopularity(10.0); + $this->em->persist($unwatchedActor); + + $movie2 = new Movie(); + $movie2->setTmdbId(99991); + $movie2->setLtbxdRef('unwatched-test'); + $movie2->setTitle('Unwatched Film'); + $this->em->persist($movie2); + + $role2 = new MovieRole(); + $role2->setActor($unwatchedActor); + $role2->setMovie($movie2); + $role2->setCharacter('Villain'); + $this->em->persist($role2); + + $this->em->flush(); + + for ($i = 0; $i < 10; $i++) { + $result = $this->repo->findOneRandomInWatchedFilms($user, 0, 'w'); + $this->assertNotNull($result); + $this->assertSame($watchedActor->getId(), $result->getId()); + } + } +}