createTestCbrFile(); // When - Envoyer la requête avec VichUploader et la syntaxe correcte $client = static::createClient(); $uploadedFile = new UploadedFile( $tempCbrFile, 'test-manga.cbr', 'application/x-cbr', // Type MIME attendu par la validation null, true ); $client->request('POST', '/api/conversions/convert', [ 'headers' => ['Content-Type' => 'multipart/form-data'], 'extra' => [ 'files' => [ 'file' => $uploadedFile, ], ], ]); // Then - Vérifier la réponse $this->assertResponseIsSuccessful(); $this->assertResponseHeaderSame('Content-Type', 'application/x-cbz'); $this->assertResponseHeaderSame('Content-Disposition', 'attachment; filename=test-manga.cbz'); // Vérifier que la réponse contient le fichier converti $content = $client->getResponse()->getContent(); $this->assertNotEmpty($content); // Nettoyer le fichier temporaire if (file_exists($tempCbrFile)) { unlink($tempCbrFile); } } public function testConvertWithoutFileReturnsError(): void { // When - Envoyer une requête sans fichier $client = static::createClient(); $client->request('POST', '/api/conversions/convert', [ 'headers' => ['Content-Type' => 'multipart/form-data'], ]); // Then - Vérifier l'erreur de validation $this->assertResponseStatusCodeSame(422); } public function testConvertWithInvalidFileFormatReturnsError(): void { // Given - Créer un fichier non-CBR pour le test $tempFile = tempnam(sys_get_temp_dir(), 'test_invalid_'); file_put_contents($tempFile, 'invalid content'); $uploadedFile = new UploadedFile( $tempFile, 'test.txt', 'text/plain', null, true ); // When - Envoyer la requête avec un fichier invalide $client = static::createClient(); $client->request('POST', '/api/conversions/convert', [ 'headers' => ['Content-Type' => 'multipart/form-data'], 'extra' => [ 'files' => [ 'file' => $uploadedFile, ], ], ]); // Then - Vérifier l'erreur de validation $this->assertResponseStatusCodeSame(422); // Nettoyer le fichier temporaire if (file_exists($tempFile)) { unlink($tempFile); } } public function testConvertWithFileTooLargeReturnsError(): void { // Given - Créer un fichier trop volumineux (simulation) $tempLargeFile = tempnam(sys_get_temp_dir(), 'test_large_'); // Créer un fichier de plus de 150MB (pour déclencher l'erreur de taille) // On simule juste en créant un fichier et en modifiant sa taille déclarée file_put_contents($tempLargeFile, str_repeat('x', 1024 * 1024)); // 1MB de contenu // Mock de l'UploadedFile avec une taille déclarée trop importante $uploadedFile = new UploadedFile( $tempLargeFile, 'large-file.cbr', 'application/x-cbr', // Type MIME attendu par la validation 150 * 1024 * 1024 + 1 // 150MB + 1 byte ); // When - Envoyer la requête avec un fichier trop volumineux $client = static::createClient(); $client->request('POST', '/api/conversions/convert', [ 'headers' => ['Content-Type' => 'multipart/form-data'], 'extra' => [ 'files' => [ 'file' => $uploadedFile, ], ], ]); // Then - Vérifier l'erreur de validation $this->assertResponseStatusCodeSame(422); // Nettoyer le fichier temporaire if (file_exists($tempLargeFile)) { unlink($tempLargeFile); } } private function createTestCbrFile(): string { // Créer un fichier CBR temporaire pour les tests $tempFile = tempnam(sys_get_temp_dir(), 'test_cbr_'); // Pour les tests, on peut simplement créer un fichier avec une extension .cbr // En production, ce serait un vrai fichier RAR $newPath = $tempFile.'.cbr'; rename($tempFile, $newPath); // Utiliser un fichier CBZ existant comme base et le renommer en CBR pour les tests $existingCbzFile = __DIR__.'/../../Fixtures/chapter.cbz'; if (file_exists($existingCbzFile)) { copy($existingCbzFile, $newPath); } else { // Fallback: créer un fichier ZIP simple avec extension CBR // Un fichier CBR est essentiellement un fichier RAR, mais pour les tests on peut simuler avec un ZIP $zip = new \ZipArchive(); if (true === $zip->open($newPath, \ZipArchive::CREATE)) { $zip->addFromString('test.txt', 'Test content for CBR simulation'); $zip->close(); } } return $newPath; } }