- MonitoringSchedule : supprimer la date passée au message (était évaluée une
seule fois au démarrage du container, rendant la requête caduque après le
premier cycle)
- CheckMonitoredMangasHandler : calculer `since` dynamiquement à l'exécution
(`new \DateTimeImmutable('-2 hours')`) plutôt que de dépendre du message
- AutoScrapingListener : corriger le TypeError silencieux — créer un ScrapingJob
avant d'appeler ScrapeChapterHandler (paramètre jobId manquant)
Ajoute les tests unitaires CheckMonitoredMangasHandlerTest et AutoScrapingListenerTest.
111 lines
4.0 KiB
PHP
111 lines
4.0 KiB
PHP
<?php
|
|
|
|
namespace App\Tests\Domain\Manga\Application\CommandHandler;
|
|
|
|
use App\Domain\Manga\Application\Command\CheckMonitoredMangas;
|
|
use App\Domain\Manga\Application\Command\RefreshMangaChapters;
|
|
use App\Domain\Manga\Application\CommandHandler\CheckMonitoredMangasHandler;
|
|
use App\Domain\Manga\Domain\Model\Manga;
|
|
use App\Domain\Manga\Domain\Model\ValueObject\ExternalId;
|
|
use App\Domain\Manga\Domain\Model\ValueObject\MangaId;
|
|
use App\Domain\Manga\Domain\Model\ValueObject\MangaSlug;
|
|
use App\Domain\Manga\Domain\Model\ValueObject\MangaTitle;
|
|
use App\Tests\Domain\Manga\Adapter\InMemoryMangaRepository;
|
|
use App\Tests\Shared\Adapter\InMemoryMessageBus;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
class CheckMonitoredMangasHandlerTest extends TestCase
|
|
{
|
|
private InMemoryMangaRepository $mangaRepository;
|
|
private InMemoryMessageBus $commandBus;
|
|
private CheckMonitoredMangasHandler $handler;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->mangaRepository = new InMemoryMangaRepository();
|
|
$this->commandBus = new InMemoryMessageBus();
|
|
$this->commandBus->clear();
|
|
$this->handler = new CheckMonitoredMangasHandler($this->mangaRepository, $this->commandBus);
|
|
}
|
|
|
|
private function createManga(string $id): Manga
|
|
{
|
|
return new Manga(
|
|
new MangaId($id),
|
|
new MangaTitle('Manga ' . $id),
|
|
new MangaSlug('manga-' . $id),
|
|
'Description',
|
|
'Author',
|
|
2024,
|
|
[],
|
|
'ongoing',
|
|
new ExternalId('ext-' . $id)
|
|
);
|
|
}
|
|
|
|
public function testDispatchesRefreshForMonitoredMangaWithOldCheck(): void
|
|
{
|
|
$manga = $this->createManga('manga-1');
|
|
$manga->enableMonitoring();
|
|
$manga->updateLastMonitoringCheck(new \DateTimeImmutable('-3 hours'));
|
|
$this->mangaRepository->save($manga);
|
|
|
|
$this->handler->handle(new CheckMonitoredMangas());
|
|
|
|
$this->assertTrue($this->commandBus->hasMessageOfType(RefreshMangaChapters::class));
|
|
$dispatched = array_filter(
|
|
$this->commandBus->getDispatchedMessages(),
|
|
fn ($m) => $m instanceof RefreshMangaChapters
|
|
);
|
|
$this->assertCount(1, $dispatched);
|
|
$this->assertSame('manga-1', array_values($dispatched)[0]->mangaId->getValue());
|
|
}
|
|
|
|
public function testDoesNotDispatchForNonMonitoredManga(): void
|
|
{
|
|
$manga = $this->createManga('manga-2');
|
|
$this->mangaRepository->save($manga);
|
|
|
|
$this->handler->handle(new CheckMonitoredMangas());
|
|
|
|
$this->assertFalse($this->commandBus->hasMessageOfType(RefreshMangaChapters::class));
|
|
}
|
|
|
|
public function testDoesNotDispatchForMangaWithRecentCheck(): void
|
|
{
|
|
$manga = $this->createManga('manga-3');
|
|
$manga->enableMonitoring();
|
|
$manga->updateLastMonitoringCheck(new \DateTimeImmutable('-30 minutes'));
|
|
$this->mangaRepository->save($manga);
|
|
|
|
$this->handler->handle(new CheckMonitoredMangas());
|
|
|
|
$this->assertFalse($this->commandBus->hasMessageOfType(RefreshMangaChapters::class));
|
|
}
|
|
|
|
public function testDispatchesOnlyMangasWithOldCheck(): void
|
|
{
|
|
$mangaOld = $this->createManga('manga-old');
|
|
$mangaOld->enableMonitoring();
|
|
$mangaOld->updateLastMonitoringCheck(new \DateTimeImmutable('-3 hours'));
|
|
$this->mangaRepository->save($mangaOld);
|
|
|
|
$mangaRecent = $this->createManga('manga-recent');
|
|
$mangaRecent->enableMonitoring();
|
|
$mangaRecent->updateLastMonitoringCheck(new \DateTimeImmutable('-30 minutes'));
|
|
$this->mangaRepository->save($mangaRecent);
|
|
|
|
$mangaDisabled = $this->createManga('manga-disabled');
|
|
$this->mangaRepository->save($mangaDisabled);
|
|
|
|
$this->handler->handle(new CheckMonitoredMangas());
|
|
|
|
$dispatched = array_filter(
|
|
$this->commandBus->getDispatchedMessages(),
|
|
fn ($m) => $m instanceof RefreshMangaChapters
|
|
);
|
|
$this->assertCount(1, $dispatched);
|
|
$this->assertSame('manga-old', array_values($dispatched)[0]->mangaId->getValue());
|
|
}
|
|
}
|