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()); } }