fix(monitoring): corriger le scheduler qui ne détectait plus les nouveaux chapitres
- 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.
This commit is contained in:
parent
214f470e77
commit
3f08e1c899
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
namespace App\Tests\Domain\Scraping\Infrastructure\EventListener;
|
||||
|
||||
use App\Domain\Manga\Domain\Event\ChapterReadyForScraping;
|
||||
use App\Domain\Manga\Domain\Model\ValueObject\ChapterId;
|
||||
use App\Domain\Scraping\Application\CommandHandler\ScrapeChapterHandler;
|
||||
use App\Domain\Scraping\Domain\Model\Chapter;
|
||||
use App\Domain\Scraping\Domain\Model\Manga;
|
||||
use App\Domain\Scraping\Domain\Model\ScrapingJob;
|
||||
use App\Domain\Scraping\Infrastructure\EventListener\AutoScrapingListener;
|
||||
use App\Domain\Shared\Domain\Event\ChapterScraped;
|
||||
use App\Domain\Shared\Domain\Model\JobStatus;
|
||||
use App\Tests\Domain\Scraping\Adapter\InMemoryChapterRepository;
|
||||
use App\Tests\Domain\Scraping\Adapter\InMemoryEventBus;
|
||||
use App\Tests\Domain\Scraping\Adapter\InMemoryImageDownloader;
|
||||
use App\Tests\Domain\Scraping\Adapter\InMemoryImageStorage;
|
||||
use App\Tests\Domain\Scraping\Adapter\InMemoryMangaRepository;
|
||||
use App\Tests\Domain\Scraping\Adapter\InMemoryScraperFactory;
|
||||
use App\Tests\Domain\Scraping\Adapter\InMemorySourceRepository;
|
||||
use App\Tests\Domain\Shared\Adapter\InMemoryJobRepository;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class AutoScrapingListenerTest extends TestCase
|
||||
{
|
||||
private InMemoryChapterRepository $chapterRepository;
|
||||
private InMemoryMangaRepository $mangaRepository;
|
||||
private InMemoryJobRepository $jobRepository;
|
||||
private InMemoryEventBus $eventBus;
|
||||
private AutoScrapingListener $listener;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->chapterRepository = new InMemoryChapterRepository();
|
||||
$this->mangaRepository = new InMemoryMangaRepository();
|
||||
$this->mangaRepository->clear();
|
||||
$this->jobRepository = new InMemoryJobRepository();
|
||||
$this->eventBus = new InMemoryEventBus();
|
||||
|
||||
$handler = new ScrapeChapterHandler(
|
||||
new InMemoryScraperFactory(),
|
||||
new InMemoryImageDownloader(),
|
||||
new InMemoryImageStorage(),
|
||||
$this->jobRepository,
|
||||
$this->chapterRepository,
|
||||
$this->mangaRepository,
|
||||
new InMemorySourceRepository(),
|
||||
$this->eventBus,
|
||||
);
|
||||
|
||||
$this->listener = new AutoScrapingListener(
|
||||
$handler,
|
||||
$this->chapterRepository,
|
||||
$this->mangaRepository,
|
||||
$this->jobRepository,
|
||||
);
|
||||
}
|
||||
|
||||
public function testCreatesJobAndScrapesWhenMangaIsMonitored(): void
|
||||
{
|
||||
$chapterId = 'chapter-uuid-1';
|
||||
$mangaId = 'manga-monitored';
|
||||
|
||||
$this->chapterRepository->save(new Chapter($chapterId, $mangaId, 1177.0, null));
|
||||
$this->mangaRepository->save(new Manga(
|
||||
$mangaId, 'One Piece', 'one-piece', 'Desc', 'Oda', '1997', true
|
||||
));
|
||||
|
||||
$this->listener->onChapterReadyForScraping(
|
||||
new ChapterReadyForScraping(new ChapterId($chapterId))
|
||||
);
|
||||
|
||||
$jobs = $this->jobRepository->findByType('scraping_job');
|
||||
$this->assertCount(1, $jobs);
|
||||
|
||||
$job = array_values($jobs)[0];
|
||||
$this->assertSame($chapterId, $job->context['chapterId']);
|
||||
$this->assertInstanceOf(ScrapingJob::class, $job);
|
||||
|
||||
$hasChapterScraped = count(array_filter(
|
||||
$this->eventBus->getDispatchedMessages(),
|
||||
fn ($m) => $m instanceof ChapterScraped
|
||||
)) > 0;
|
||||
$this->assertTrue($hasChapterScraped);
|
||||
}
|
||||
|
||||
public function testDoesNothingWhenMangaIsNotMonitored(): void
|
||||
{
|
||||
$chapterId = 'chapter-uuid-2';
|
||||
$mangaId = 'manga-not-monitored';
|
||||
|
||||
$this->chapterRepository->save(new Chapter($chapterId, $mangaId, 1176.0, null));
|
||||
$this->mangaRepository->save(new Manga(
|
||||
$mangaId, 'One Piece', 'one-piece', 'Desc', 'Oda', '1997', false
|
||||
));
|
||||
|
||||
$this->listener->onChapterReadyForScraping(
|
||||
new ChapterReadyForScraping(new ChapterId($chapterId))
|
||||
);
|
||||
|
||||
$this->assertEmpty($this->jobRepository->findByType('scraping_job'));
|
||||
$this->assertEmpty($this->eventBus->getDispatchedMessages());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user