createValidCbzFile(); $client->request( 'POST', self::API_ENDPOINT, [ 'mangaId' => 'non-existent-manga-id', 'volumeNumber' => '1' ], ['file' => $file], ['CONTENT_TYPE' => 'multipart/form-data'] ); $this->assertResponseStatusCodeSame(404); $response = json_decode($client->getResponse()->getContent(), true); $this->assertEquals('Manga not found', $response['error']); } public function test_it_returns_422_when_manga_id_is_missing(): void { $client = static::createClient(); $file = $this->createValidCbzFile(); $client->request( 'POST', self::API_ENDPOINT, [ 'volumeNumber' => '1' ], ['file' => $file], ['CONTENT_TYPE' => 'multipart/form-data'] ); $this->assertResponseStatusCodeSame(422); $response = json_decode($client->getResponse()->getContent(), true); $this->assertStringContainsString('mangaId is required', $response[0]['message']); } public function test_it_returns_422_when_volume_number_is_missing(): void { $client = static::createClient(); $file = $this->createValidCbzFile(); $client->request( 'POST', self::API_ENDPOINT, [ 'mangaId' => 'some-manga-id' ], ['file' => $file], ['CONTENT_TYPE' => 'multipart/form-data'] ); $this->assertResponseStatusCodeSame(422); $response = json_decode($client->getResponse()->getContent(), true); $this->assertStringContainsString('volumeNumber is required', $response[0]['message']); } public function test_it_returns_422_when_file_is_missing(): void { $client = static::createClient(); $client->request( 'POST', self::API_ENDPOINT, [ 'mangaId' => 'some-manga-id', 'volumeNumber' => '1' ], [], ['CONTENT_TYPE' => 'multipart/form-data'] ); $this->assertResponseStatusCodeSame(422); $response = json_decode($client->getResponse()->getContent(), true); $this->assertStringContainsString('Please upload a file', $response[0]['message']); } public function test_it_returns_422_when_file_is_not_cbz(): void { $client = static::createClient(); $tempFile = tempnam(sys_get_temp_dir(), 'test_'); file_put_contents($tempFile, 'This is not a CBZ file'); $file = new UploadedFile($tempFile, 'test.txt', 'text/plain', null, true); $client->request( 'POST', self::API_ENDPOINT, [ 'mangaId' => 'some-manga-id', 'volumeNumber' => '1' ], ['file' => $file], ['CONTENT_TYPE' => 'multipart/form-data'] ); $this->assertResponseStatusCodeSame(422); $response = json_decode($client->getResponse()->getContent(), true); $this->assertStringContainsString('valid CBZ file', $response[0]['message']); } private function createValidCbzFile(): UploadedFile { $tmpFile = tempnam(sys_get_temp_dir(), 'cbz_'); unlink($tmpFile); $zip = new \ZipArchive(); if ($zip->open($tmpFile, \ZipArchive::CREATE | \ZipArchive::OVERWRITE) !== true) { throw new \RuntimeException('Cannot create test CBZ file'); } $zip->addFromString('image1.jpg', 'fake-image-data'); $zip->close(); return new UploadedFile($tmpFile, 'test-volume.cbz', 'application/x-cbz', null, true); } }