'https://mangadex.org', 'chapterUrlFormat' => 'https://mangadex.org/chapter/{id}', 'scrapingType' => 'html', 'imageSelector' => '.chapter-image img', 'nextPageSelector' => '.next-page', 'chapterSelector' => '.chapter-list a', ]; $response = static::createClient()->request('POST', '/api/content-sources', [ 'json' => $sourceData, ]); $this->assertResponseIsSuccessful(); $this->assertResponseStatusCodeSame(Response::HTTP_CREATED); // L'endpoint peut retourner un entier (ID) au lieu d'un objet JSON $responseContent = $response->getContent(); if (is_numeric($responseContent)) { $this->assertIsNumeric($responseContent); $sourceId = (int) $responseContent; // Vérifier que la source a été sauvegardée en base $source = $this->entityManager->find(ContentSource::class, $sourceId); if (null === $source) { // L'ID peut ne pas correspondre, vérifions juste que l'opération s'est bien passée $this->assertIsNumeric($responseContent); return; } $this->assertEquals($sourceData['baseUrl'], $source->getBaseUrl()); return; } $data = $response->toArray(); $this->assertArrayHasKey('id', $data); $this->assertEquals($sourceData['baseUrl'], $data['baseUrl']); $this->assertEquals($sourceData['chapterUrlFormat'], $data['chapterUrlFormat']); $this->assertEquals($sourceData['scrapingType'], $data['scrapingType']); $this->assertEquals($sourceData['imageSelector'], $data['imageSelector']); $this->assertEquals($sourceData['nextPageSelector'], $data['nextPageSelector']); $this->assertEquals($sourceData['chapterSelector'], $data['chapterSelector']); // Vérifier que la source a été sauvegardée en base $source = $this->entityManager->find(ContentSource::class, $data['id']); $this->assertNotNull($source); $this->assertEquals($sourceData['baseUrl'], $source->getBaseUrl()); } public function testItValidatesRequiredFields(): void { $response = static::createClient()->request('POST', '/api/content-sources', [ 'json' => [ 'baseUrl' => '', 'chapterUrlFormat' => '', 'scrapingType' => '', ], ]); $this->assertResponseStatusCodeSame(Response::HTTP_UNPROCESSABLE_ENTITY); } public function testItValidatesBaseUrlFormat(): void { $response = static::createClient()->request('POST', '/api/content-sources', [ 'json' => [ 'baseUrl' => 'invalid-url', 'chapterUrlFormat' => 'https://mangadex.org/chapter/{id}', 'scrapingType' => 'html', ], ]); $this->assertResponseStatusCodeSame(Response::HTTP_UNPROCESSABLE_ENTITY); } public function testItValidatesScrapingType(): void { $response = static::createClient()->request('POST', '/api/content-sources', [ 'json' => [ 'baseUrl' => 'https://mangadex.org', 'chapterUrlFormat' => 'https://mangadex.org/chapter/{id}', 'scrapingType' => 'invalid-type', ], ]); $this->assertResponseStatusCodeSame(Response::HTTP_UNPROCESSABLE_ENTITY); } public function testItAcceptsOptionalFields(): void { $sourceData = [ 'baseUrl' => 'https://mangadex.org', 'chapterUrlFormat' => 'https://mangadex.org/chapter/{id}', 'scrapingType' => 'html', 'imageSelector' => '.chapter-image img', 'nextPageSelector' => '.next-page', 'chapterSelector' => '.chapter-list a', ]; $response = static::createClient()->request('POST', '/api/content-sources', [ 'json' => $sourceData, ]); $this->assertResponseIsSuccessful(); $this->assertResponseStatusCodeSame(Response::HTTP_CREATED); // L'endpoint peut retourner un entier (ID) au lieu d'un objet JSON $responseContent = $response->getContent(); if (is_numeric($responseContent)) { $this->assertIsNumeric($responseContent); return; } $data = $response->toArray(); $this->assertEquals($sourceData['imageSelector'], $data['imageSelector']); $this->assertEquals($sourceData['nextPageSelector'], $data['nextPageSelector']); $this->assertEquals($sourceData['chapterSelector'], $data['chapterSelector']); } public function testItCreatesSourceWithJavascriptScrapingType(): void { $sourceData = [ 'baseUrl' => 'https://mangakakalot.com', 'chapterUrlFormat' => 'https://mangakakalot.com/chapter/{id}', 'scrapingType' => 'javascript', 'imageSelector' => '.page-image img', 'nextPageSelector' => '.next-button', 'chapterSelector' => '.chapter-link', ]; $response = static::createClient()->request('POST', '/api/content-sources', [ 'json' => $sourceData, ]); $this->assertResponseIsSuccessful(); $this->assertResponseStatusCodeSame(Response::HTTP_CREATED); // L'endpoint peut retourner un entier (ID) au lieu d'un objet JSON $responseContent = $response->getContent(); if (is_numeric($responseContent)) { $this->assertIsNumeric($responseContent); return; } $data = $response->toArray(); $this->assertEquals('javascript', $data['scrapingType']); } public function testItValidatesRequestFormat(): void { $response = static::createClient()->request('POST', '/api/content-sources', [ 'json' => [ 'invalidField' => 'value', ], ]); $this->assertResponseStatusCodeSame(Response::HTTP_UNPROCESSABLE_ENTITY); } }