179 lines
5.8 KiB
PHP
179 lines
5.8 KiB
PHP
<?php
|
|
|
|
namespace App\Tests\Monitor;
|
|
|
|
use App\Base\Service\MediaFiles;
|
|
use App\Monitor\Action\Command\MonitorTvShowCommand;
|
|
use App\Monitor\Action\Handler\MonitorTvEpisodeHandler;
|
|
use App\Monitor\Action\Handler\MonitorTvShowHandler;
|
|
use App\Monitor\Action\Result\MonitorTvShowResult;
|
|
use App\Monitor\Framework\Entity\Monitor;
|
|
use App\Monitor\Framework\Repository\MonitorRepository;
|
|
use App\Tmdb\Tmdb;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
class MonitorTvShowHandlerTest extends TestCase
|
|
{
|
|
private MonitorTvShowHandler $handler;
|
|
private MonitorRepository $monitorRepository;
|
|
private EntityManagerInterface $entityManager;
|
|
private MonitorTvEpisodeHandler $episodeHandler;
|
|
private MediaFiles $mediaFiles;
|
|
private LoggerInterface $logger;
|
|
private Tmdb $tmdb;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->monitorRepository = $this->createMock(MonitorRepository::class);
|
|
$this->entityManager = $this->createMock(EntityManagerInterface::class);
|
|
$this->episodeHandler = $this->createMock(MonitorTvEpisodeHandler::class);
|
|
$this->mediaFiles = $this->createMock(MediaFiles::class);
|
|
$this->logger = $this->createMock(LoggerInterface::class);
|
|
$this->tmdb = $this->createMock(Tmdb::class);
|
|
|
|
$this->handler = new MonitorTvShowHandler(
|
|
$this->monitorRepository,
|
|
$this->entityManager,
|
|
$this->episodeHandler,
|
|
$this->mediaFiles,
|
|
$this->logger,
|
|
$this->tmdb
|
|
);
|
|
}
|
|
|
|
public function testEpisodeExists(): void
|
|
{
|
|
// Arrange
|
|
$monitor = $this->createMock(Monitor::class);
|
|
$monitor->method('getId')->willReturn(1);
|
|
$monitor->method('getTmdbId')->willReturn('63770');
|
|
$monitor->method('getSeason')->willReturn(10);
|
|
$monitor->method('getTitle')->willReturn('The Late Show with Stephen Colbert');
|
|
|
|
$this->monitorRepository->expects($this->once())
|
|
->method('find')
|
|
->with(1)
|
|
->willReturn($monitor);
|
|
|
|
$this->tmdb->expects($this->once())
|
|
->method('seasonDetails')
|
|
->with(63770, 10)
|
|
->willReturn((object)['episodes' => [$this->getTmdbEpisode()]]);
|
|
|
|
$this->mediaFiles->expects($this->once())
|
|
->method('findEpisodes')
|
|
->willReturn($this->getDownloadedEpisodes());
|
|
|
|
// Act
|
|
$command = new MonitorTvShowCommand(1);
|
|
$result = $this->handler->handle($command);
|
|
|
|
// Assert
|
|
$this->assertInstanceOf(MonitorTvShowResult::class, $result);
|
|
$this->assertEquals('OK', $result->status);
|
|
$this->assertTrue(isset($result->result['monitor']));
|
|
$this->assertSame($monitor, $result->result['monitor']);
|
|
}
|
|
|
|
public function testEpisodeDoesNotExist(): void
|
|
{
|
|
// Arrange
|
|
$monitor = $this->createMock(Monitor::class);
|
|
$monitor->method('getId')->willReturn(1);
|
|
$monitor->method('getTmdbId')->willReturn(63770);
|
|
$monitor->method('getSeason')->willReturn(10);
|
|
$monitor->method('getTitle')->willReturn('The Late Show with Stephen Colbert');
|
|
|
|
$this->monitorRepository->expects($this->once())
|
|
->method('find')
|
|
->with(1)
|
|
->willReturn($monitor);
|
|
|
|
$this->tmdb->expects($this->once())
|
|
->method('seasonDetails')
|
|
->with(63770, 10)
|
|
->willReturn((object)['episodes' => []]);
|
|
|
|
$this->mediaFiles->expects($this->once())
|
|
->method('findEpisodes')
|
|
->willReturn([]);
|
|
|
|
// Act
|
|
$command = new MonitorTvShowCommand(1);
|
|
$result = $this->handler->handle($command);
|
|
|
|
// Assert
|
|
$this->assertInstanceOf(MonitorTvShowResult::class, $result);
|
|
$this->assertEquals('OK', $result->status);
|
|
$this->assertTrue(isset($result->result['monitor']));
|
|
$this->assertSame($monitor, $result->result['monitor']);
|
|
}
|
|
|
|
public function testHandleWithInvalidMonitorId(): void
|
|
{
|
|
// Arrange
|
|
$this->monitorRepository->expects($this->once())
|
|
->method('find')
|
|
->with(999)
|
|
->willReturn(null);
|
|
|
|
// Act & Assert
|
|
$this->expectException(\RuntimeException::class);
|
|
$this->expectExceptionMessage('Monitor not found');
|
|
|
|
$command = new MonitorTvShowCommand(999);
|
|
$this->handler->handle($command);
|
|
}
|
|
|
|
private function getTmdbEpisode(): array
|
|
{
|
|
return [
|
|
"air_date" => "2016-05-13",
|
|
"episode_number" => 142,
|
|
"episode_type" => "standard",
|
|
"id" => 1192242,
|
|
"name" => "Matt Bomer, Zach Woods, Nick Griffin",
|
|
"overview" => "",
|
|
"production_code" => "",
|
|
"runtime" => 45,
|
|
"season_number" => 1,
|
|
"show_id" => 63770,
|
|
"still_path" => null,
|
|
"vote_average" => 0.0,
|
|
"vote_count" => 0,
|
|
"crew" => [],
|
|
"guest_stars" => [],
|
|
"poster" => null,
|
|
];
|
|
}
|
|
|
|
private function getDownloadedEpisodes(): array
|
|
{
|
|
$episode1 = (object)[
|
|
"season" => 10,
|
|
"episode" => 142,
|
|
"resolution" => "1080p",
|
|
"codec" => "h264",
|
|
"group" => "jebaited.mkv",
|
|
"container" => "mkv",
|
|
"title" => "42 stephen colbert 2025 07 21 sandra oh",
|
|
"episodeName" => "E1 web",
|
|
];
|
|
|
|
$episode2 = (object)[
|
|
'season' => 10,
|
|
'episode' => 142,
|
|
'resolution' => '1080p',
|
|
'codec' => 'x265',
|
|
'group' => 'MeGusta[EZTVx.to].mkv',
|
|
'container' => 'mkv',
|
|
'title' => '42 Stephen Colbert 2025 07 21 Sandra Oh',
|
|
'episodeName' => 'E1 HEVC'
|
|
];
|
|
|
|
return [$episode1, $episode2];
|
|
}
|
|
}
|