feat: ajout de la fonctionnalité de conversion de fichiers de bande dessinée, permettant la conversion de fichiers CBR en CBZ. Intégration d'un service de conversion, d'une API pour gérer les téléchargements, et mise en place de validations pour les fichiers uploadés. Tests unitaires ajoutés pour garantir le bon fonctionnement de cette nouvelle fonctionnalité.

This commit is contained in:
ext.jeremy.guillot@maxicoffee.domains
2025-07-14 16:44:18 +02:00
parent b4bfa48d00
commit 7a05934116
16 changed files with 640 additions and 3 deletions

View File

@@ -0,0 +1,162 @@
<?php
namespace App\Tests\Feature\Conversion;
use App\Tests\Feature\AbstractApiTestCase;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Zenstruck\Foundry\Test\ResetDatabase;
class ConvertFileTest extends AbstractApiTestCase
{
use ResetDatabase;
public function testConvertCbrToCbzSuccess(): void
{
// Given - Créer un fichier CBR temporaire pour le test
$tempCbrFile = $this->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 ($zip->open($newPath, \ZipArchive::CREATE) === TRUE) {
$zip->addFromString('test.txt', 'Test content for CBR simulation');
$zip->close();
}
}
return $newPath;
}
}