feat: ajout de la fonctionnalité de monitoring des mangas, incluant l'activation et la désactivation du suivi, la synchronisation des chapitres, et la mise à jour de l'API pour gérer ces nouvelles actions. Création de nouveaux composants Vue pour le rafraîchissement des chapitres et l'affichage des notifications. Intégration de tests unitaires pour valider le bon fonctionnement de ces fonctionnalités.
This commit is contained in:
parent
d9e78b5229
commit
00d63dffeb
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Tests\Domain\Manga\Adapter;
|
||||
|
||||
use App\Domain\Manga\Application\Query\MonitoringCriteria;
|
||||
use App\Domain\Manga\Domain\Contract\Repository\MangaRepositoryInterface;
|
||||
use App\Domain\Manga\Domain\Model\Chapter;
|
||||
use App\Domain\Manga\Domain\Model\Manga;
|
||||
@@ -190,4 +191,27 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
|
||||
fn (Chapter $chapter) => in_array($chapter->getNumber(), $chapterNumbers)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public function findByMonitoringCriteria(MonitoringCriteria $criteria): array
|
||||
{
|
||||
return array_filter(
|
||||
array_values($this->mangas),
|
||||
function (Manga $manga) use ($criteria) {
|
||||
// Vérifier si le monitoring est activé selon le critère
|
||||
if ($manga->getMonitoringStatus()->isEnabled() !== $criteria->enabled) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Vérifier la date de dernière vérification si spécifiée
|
||||
if ($criteria->lastCheckBefore !== null) {
|
||||
$lastCheck = $manga->getLastMonitoringCheck();
|
||||
if ($lastCheck === null || $lastCheck >= $criteria->lastCheckBefore) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Tests\Domain\Manga\Application\Command;
|
||||
|
||||
use App\Domain\Manga\Application\Command\ToggleMangaMonitoring;
|
||||
use App\Domain\Manga\Domain\Model\ValueObject\MangaId;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ToggleMangaMonitoringTest extends TestCase
|
||||
{
|
||||
public function testCreateCommandWithValidData(): void
|
||||
{
|
||||
// Arrange & Act
|
||||
$mangaId = new MangaId('manga-123');
|
||||
$enabled = true;
|
||||
|
||||
$command = new ToggleMangaMonitoring($mangaId, $enabled);
|
||||
|
||||
// Assert
|
||||
$this->assertEquals($mangaId, $command->mangaId);
|
||||
$this->assertTrue($command->enabled);
|
||||
}
|
||||
|
||||
public function testCreateCommandWithDisabled(): void
|
||||
{
|
||||
// Arrange & Act
|
||||
$mangaId = new MangaId('manga-456');
|
||||
$enabled = false;
|
||||
|
||||
$command = new ToggleMangaMonitoring($mangaId, $enabled);
|
||||
|
||||
// Assert
|
||||
$this->assertEquals($mangaId, $command->mangaId);
|
||||
$this->assertFalse($command->enabled);
|
||||
}
|
||||
|
||||
public function testCommandIsReadonly(): void
|
||||
{
|
||||
// Arrange
|
||||
$command = new ToggleMangaMonitoring(new MangaId('manga-123'), true);
|
||||
|
||||
// Act & Assert - Tenter de modifier les propriétés devrait être impossible
|
||||
$reflection = new \ReflectionClass($command);
|
||||
$this->assertTrue($reflection->isReadOnly());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
<?php
|
||||
|
||||
namespace App\Tests\Domain\Manga\Application\CommandHandler;
|
||||
|
||||
use App\Domain\Manga\Application\Command\ToggleMangaMonitoring;
|
||||
use App\Domain\Manga\Application\CommandHandler\ToggleMangaMonitoringHandler;
|
||||
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\Domain\Manga\Domain\Model\ValueObject\MonitoringStatus;
|
||||
use App\Tests\Domain\Manga\Adapter\InMemoryMangaRepository;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ToggleMangaMonitoringHandlerTest extends TestCase
|
||||
{
|
||||
private InMemoryMangaRepository $mangaRepository;
|
||||
private ToggleMangaMonitoringHandler $handler;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->mangaRepository = new InMemoryMangaRepository();
|
||||
$this->handler = new ToggleMangaMonitoringHandler($this->mangaRepository);
|
||||
}
|
||||
|
||||
public function testEnableMonitoringForManga(): void
|
||||
{
|
||||
// Arrange
|
||||
$mangaId = 'manga-123';
|
||||
$manga = new Manga(
|
||||
new MangaId($mangaId),
|
||||
new MangaTitle('Test Manga'),
|
||||
new MangaSlug('test-manga'),
|
||||
'Description',
|
||||
'Author',
|
||||
2024,
|
||||
[],
|
||||
'ongoing',
|
||||
new ExternalId('external-123')
|
||||
);
|
||||
|
||||
$this->mangaRepository->save($manga);
|
||||
|
||||
// Act
|
||||
$command = new ToggleMangaMonitoring(new MangaId($mangaId), true);
|
||||
$this->handler->handle($command);
|
||||
|
||||
// Assert
|
||||
$updatedManga = $this->mangaRepository->findById($mangaId);
|
||||
$this->assertNotNull($updatedManga);
|
||||
$this->assertTrue($updatedManga->getMonitoringStatus()->isEnabled());
|
||||
$this->assertNotNull($updatedManga->getLastMonitoringCheck());
|
||||
}
|
||||
|
||||
public function testDisableMonitoringForManga(): void
|
||||
{
|
||||
// Arrange
|
||||
$mangaId = 'manga-123';
|
||||
$manga = new Manga(
|
||||
new MangaId($mangaId),
|
||||
new MangaTitle('Test Manga'),
|
||||
new MangaSlug('test-manga'),
|
||||
'Description',
|
||||
'Author',
|
||||
2024,
|
||||
[],
|
||||
'ongoing',
|
||||
new ExternalId('external-123')
|
||||
);
|
||||
|
||||
// Activer d'abord le monitoring
|
||||
$manga->enableMonitoring();
|
||||
$this->mangaRepository->save($manga);
|
||||
|
||||
// Act
|
||||
$command = new ToggleMangaMonitoring(new MangaId($mangaId), false);
|
||||
$this->handler->handle($command);
|
||||
|
||||
// Assert
|
||||
$updatedManga = $this->mangaRepository->findById($mangaId);
|
||||
$this->assertNotNull($updatedManga);
|
||||
$this->assertFalse($updatedManga->getMonitoringStatus()->isEnabled());
|
||||
}
|
||||
|
||||
public function testToggleMonitoringWithNonExistingManga(): void
|
||||
{
|
||||
// Arrange
|
||||
$nonExistingMangaId = 'non-existing-manga';
|
||||
|
||||
// Act & Assert
|
||||
$this->expectException(\App\Domain\Manga\Domain\Exception\MangaNotFoundException::class);
|
||||
$this->expectExceptionMessage($nonExistingMangaId);
|
||||
|
||||
$command = new ToggleMangaMonitoring(new MangaId($nonExistingMangaId), true);
|
||||
$this->handler->handle($command);
|
||||
}
|
||||
|
||||
public function testEnableMonitoringWhenAlreadyEnabled(): void
|
||||
{
|
||||
// Arrange
|
||||
$mangaId = 'manga-123';
|
||||
$manga = new Manga(
|
||||
new MangaId($mangaId),
|
||||
new MangaTitle('Test Manga'),
|
||||
new MangaSlug('test-manga'),
|
||||
'Description',
|
||||
'Author',
|
||||
2024,
|
||||
[],
|
||||
'ongoing',
|
||||
new ExternalId('external-123')
|
||||
);
|
||||
|
||||
$manga->enableMonitoring();
|
||||
$firstActivationTime = $manga->getLastMonitoringCheck();
|
||||
$this->mangaRepository->save($manga);
|
||||
|
||||
// Wait a bit to ensure time difference
|
||||
sleep(1);
|
||||
|
||||
// Act
|
||||
$command = new ToggleMangaMonitoring(new MangaId($mangaId), true);
|
||||
$this->handler->handle($command);
|
||||
|
||||
// Assert
|
||||
$updatedManga = $this->mangaRepository->findById($mangaId);
|
||||
$this->assertNotNull($updatedManga);
|
||||
$this->assertTrue($updatedManga->getMonitoringStatus()->isEnabled());
|
||||
|
||||
// Le timestamp devrait être mis à jour même si déjà activé
|
||||
$this->assertGreaterThan(
|
||||
$firstActivationTime->getTimestamp(),
|
||||
$updatedManga->getLastMonitoringCheck()->getTimestamp()
|
||||
);
|
||||
}
|
||||
|
||||
public function testDisableMonitoringWhenAlreadyDisabled(): void
|
||||
{
|
||||
// Arrange
|
||||
$mangaId = 'manga-123';
|
||||
$manga = new Manga(
|
||||
new MangaId($mangaId),
|
||||
new MangaTitle('Test Manga'),
|
||||
new MangaSlug('test-manga'),
|
||||
'Description',
|
||||
'Author',
|
||||
2024,
|
||||
[],
|
||||
'ongoing',
|
||||
new ExternalId('external-123')
|
||||
);
|
||||
|
||||
$this->mangaRepository->save($manga);
|
||||
|
||||
// Act
|
||||
$command = new ToggleMangaMonitoring(new MangaId($mangaId), false);
|
||||
$this->handler->handle($command);
|
||||
|
||||
// Assert
|
||||
$updatedManga = $this->mangaRepository->findById($mangaId);
|
||||
$this->assertNotNull($updatedManga);
|
||||
$this->assertFalse($updatedManga->getMonitoringStatus()->isEnabled());
|
||||
$this->assertNull($updatedManga->getLastMonitoringCheck());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user