feat: ajout de la gestion des chapitres de manga, incluant la récupération et la sauvegarde des chapitres en français et en anglais, ainsi que l'optimisation de la logique de sauvegarde pour éviter les doublons

This commit is contained in:
ext.jeremy.guillot@maxicoffee.domains
2025-04-01 16:01:55 +02:00
parent 34dfa57dc0
commit 0111f1b5f1
12 changed files with 254 additions and 78 deletions

View File

@@ -9,12 +9,13 @@ use App\Domain\Scraping\Domain\Model\ValueObject\ImageUrl;
use App\Domain\Scraping\Domain\Model\ValueObject\PageNumber;
use Ramsey\Uuid\Uuid;
use Symfony\Component\Messenger\MessageBusInterface;
use App\Domain\Scraping\Domain\Contract\Repository\ScrapingJobRepositoryInterface;
use App\Domain\Shared\Domain\Contract\JobRepositoryInterface;
use App\Domain\Shared\Domain\Model\JobStatus;
class ScrapingStatusTest extends ApiTestCase
{
private MessageBusInterface $messageBus;
private ScrapingJobRepositoryInterface $repository;
private JobRepositoryInterface $repository;
protected function setUp(): void
{
@@ -23,7 +24,7 @@ class ScrapingStatusTest extends ApiTestCase
self::bootKernel();
$this->messageBus = self::getContainer()->get(MessageBusInterface::class);
$this->repository = self::getContainer()->get(ScrapingJobRepositoryInterface::class);
$this->repository = self::getContainer()->get(JobRepositoryInterface::class);
}
public function testGetScrapingStatus(): void
@@ -32,27 +33,39 @@ class ScrapingStatusTest extends ApiTestCase
$jobId = Uuid::uuid4()->toString();
$job = new ScrapingJob($jobId, 'manga-123', 1, 'source-789');
$job->addPage(new PageNumber(1), new ImageUrl('http://example.com/page1.jpg'));
$job->addPage(new PageNumber(2), new ImageUrl('http://example.com/page2.jpg'));
$job->start();
$this->repository->save($job);
// When
$response = static::createClient()->request('GET', '/api/scraping/jobs/'.$jobId.'/status');
$response = static::createClient()->request('GET', '/api/jobs?status=in_progress');
// Then
$this->assertResponseIsSuccessful();
$this->assertJsonContains([
'jobId' => $jobId,
'status' => ScrapingStatus::IN_PROGRESS->value,
'progress' => 0
]);
$responseData = $response->toArray();
$this->assertArrayHasKey('hydra:member', $responseData);
$this->assertIsArray($responseData['hydra:member']);
$this->assertCount(1, $responseData['hydra:member']);
$jobData = $responseData['hydra:member'][0];
$this->assertEquals('/api/jobs/' . $jobId, $jobData['@id']);
$this->assertEquals('Job', $jobData['@type']);
$this->assertEquals($jobId, $jobData['id']);
$this->assertEquals('scraping_job', $jobData['type']);
$this->assertEquals(JobStatus::IN_PROGRESS->value, $jobData['status']);
$this->assertEquals([
'mangaId' => 'manga-123',
'chapterNumber' => 1,
'sourceId' => 'source-789'
], $jobData['context']);
}
public function testGetScrapingStatusForNonExistentJob(): void
{
// When
$response = static::createClient()->request('GET', '/api/scraping/jobs/non-existent-id/status', [
$response = static::createClient()->request('GET', '/api/jobs/non-existent-id?status=in_progress', [
'headers' => ['Accept' => 'application/json']
]);