ltbxd-actorle/tests/Import/ActorSyncerTest.php

74 lines
2.5 KiB
PHP
Raw Permalink Normal View History

<?php
declare(strict_types=1);
namespace App\Tests\Import;
use App\Context\TMDB\MovieCreditsContext;
use App\Entity\Actor;
use App\Entity\Movie;
use App\Entity\MovieRole;
use App\Gateway\TMDBGateway;
use App\Import\ActorSyncer;
use App\Model\TMDB\TMDBMovieCredit;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use PHPUnit\Framework\TestCase;
class ActorSyncerTest extends TestCase
{
public function testSyncActorsForMovieKeepsMovieActorCollectionInMemory(): void
{
$movie = (new Movie())
->setTmdbId(123)
->setTitle('Inception')
->setLtbxdRef('film/inception');
$tmdbGateway = $this->createMock(TMDBGateway::class);
$tmdbGateway->method('getMovieCredits')->with(123)->willReturn(
new MovieCreditsContext([
new TMDBMovieCredit(
id: 42,
name: 'Leonardo DiCaprio',
popularity: 99.0,
character: 'Cobb',
),
]),
);
$actorRepository = $this->createMock(EntityRepository::class);
$actorRepository->method('findOneBy')->willReturn(null);
$movieRoleRepository = $this->createMock(EntityRepository::class);
$movieRoleRepository->method('count')->willReturn(0);
$persisted = [];
$em = $this->createMock(EntityManagerInterface::class);
$em->method('getRepository')->willReturnCallback(
static fn (string $class): EntityRepository => match ($class) {
Actor::class => $actorRepository,
MovieRole::class => $movieRoleRepository,
default => throw new \InvalidArgumentException("Unexpected repository for {$class}"),
},
);
$em->method('persist')->willReturnCallback(function (object $entity) use (&$persisted): void {
$persisted[] = $entity;
});
$syncer = new ActorSyncer($tmdbGateway, $em);
$syncer->syncActorsForMovie($movie);
self::assertCount(2, $persisted);
self::assertInstanceOf(Actor::class, $persisted[0]);
self::assertInstanceOf(MovieRole::class, $persisted[1]);
self::assertCount(1, $movie->getActors());
$role = $movie->getActors()->first();
self::assertInstanceOf(MovieRole::class, $role);
self::assertSame($movie, $role->getMovie());
self::assertSame($persisted[0], $role->getActor());
self::assertCount(1, $persisted[0]->getMovieRoles());
}
}