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:
parent
b4bfa48d00
commit
7a05934116
162
tests/Feature/Conversion/ConvertFileTest.php
Normal file
162
tests/Feature/Conversion/ConvertFileTest.php
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user