request('POST', '/api/mangas/create', [ 'json' => [ 'title' => 'One Piece', 'slug' => 'one-piece', 'description' => 'Original description', 'author' => 'Eiichiro Oda', 'publicationYear' => 1997, 'genres' => ['action', 'adventure'], 'status' => 'ongoing', 'externalId' => 'external-123', 'imageUrl' => 'http://example.com/image.jpg', 'rating' => 4.5, ], ]); $this->assertResponseIsSuccessful(); // Get the created manga ID from database $entityManager = static::getContainer()->get('doctrine')->getManager(); $createdManga = $entityManager->getRepository(\App\Entity\Manga::class)->findOneBy(['slug' => 'one-piece']); $this->assertNotNull($createdManga); $mangaId = $createdManga->getId(); // When - Edit the manga $response = $client->request('PUT', '/api/mangas/'.$mangaId.'/edit', [ 'json' => [ 'title' => 'One Piece Updated', 'description' => 'Updated description', 'author' => 'Eiichiro Oda Updated', 'publicationYear' => 1998, 'genres' => ['action', 'adventure', 'comedy'], 'status' => 'completed', 'rating' => 4.8, 'alternativeSlugs' => ['onepiece', 'op'], ], ]); // Then $this->assertResponseIsSuccessful(); // Verify the manga was updated in database $entityManager = static::getContainer()->get('doctrine')->getManager(); $manga = $entityManager->getRepository(\App\Entity\Manga::class)->find($mangaId); $this->assertNotNull($manga); $this->assertEquals('One Piece Updated', $manga->getTitle()); $this->assertEquals('Updated description', $manga->getDescription()); $this->assertEquals('Eiichiro Oda Updated', $manga->getAuthor()); $this->assertEquals(1998, $manga->getPublicationYear()); $this->assertEquals(['action', 'adventure', 'comedy'], $manga->getGenres()); $this->assertEquals('completed', $manga->getStatus()); $this->assertEquals(4.8, $manga->getRating()); $this->assertEquals(['onepiece', 'op'], $manga->getAlternativeSlugs()); } public function testEditMangaWithInvalidData(): void { // Given - Create a manga first $client = static::createClient(); $response = $client->request('POST', '/api/mangas/create', [ 'json' => [ 'title' => 'One Piece 2', 'slug' => 'one-piece-2', 'description' => 'Original description', 'author' => 'Eiichiro Oda', 'publicationYear' => 1997, 'genres' => ['action', 'adventure'], 'status' => 'ongoing', ], ]); $this->assertResponseIsSuccessful(); // Get the created manga ID from database $entityManager = static::getContainer()->get('doctrine')->getManager(); $createdManga = $entityManager->getRepository(\App\Entity\Manga::class)->findOneBy(['slug' => 'one-piece-2']); $this->assertNotNull($createdManga); $mangaId = $createdManga->getId(); // When - Try to edit with invalid data $client->request('PUT', '/api/mangas/'.$mangaId.'/edit', [ 'json' => [ 'title' => '', // Invalid: empty title 'publicationYear' => 2200, // Invalid: year > 2100 'genres' => [], // Invalid: empty genres 'status' => 'invalid-status', // Invalid status 'rating' => 6.0, // Invalid: rating > 5 ], ]); // Then $this->assertResponseStatusCodeSame(422); } public function testEditMangaNotFound(): void { // When - Try to edit non-existent manga $client = static::createClient(); $client->request('PUT', '/api/mangas/9999999/edit', [ 'json' => [ 'title' => 'Updated Title', ], ]); // Then $this->assertResponseStatusCodeSame(404); } public function testEditMangaPartialUpdate(): void { // Given - Create a manga first $client = static::createClient(); $response = $client->request('POST', '/api/mangas/create', [ 'json' => [ 'title' => 'One Piece 3', 'slug' => 'one-piece-3', 'description' => 'Original description', 'author' => 'Eiichiro Oda', 'publicationYear' => 1997, 'genres' => ['action', 'adventure'], 'status' => 'ongoing', 'rating' => 4.5, ], ]); $this->assertResponseIsSuccessful(); // Get the created manga ID from database $entityManager = static::getContainer()->get('doctrine')->getManager(); $createdManga = $entityManager->getRepository(\App\Entity\Manga::class)->findOneBy(['slug' => 'one-piece-3']); $this->assertNotNull($createdManga); $mangaId = $createdManga->getId(); // When - Edit only title and rating $client->request('PUT', '/api/mangas/'.$mangaId.'/edit', [ 'json' => [ 'title' => 'One Piece - Updated Title Only', 'rating' => 4.9, ], ]); // Then $this->assertResponseIsSuccessful(); // Verify only specified fields were updated $entityManager = static::getContainer()->get('doctrine')->getManager(); $manga = $entityManager->getRepository(\App\Entity\Manga::class)->find($mangaId); $this->assertNotNull($manga); $this->assertEquals('One Piece - Updated Title Only', $manga->getTitle()); $this->assertEquals(4.9, $manga->getRating()); // Original values should remain unchanged $this->assertEquals('Original description', $manga->getDescription()); $this->assertEquals('Eiichiro Oda', $manga->getAuthor()); $this->assertEquals(1997, $manga->getPublicationYear()); $this->assertEquals(['action', 'adventure'], $manga->getGenres()); $this->assertEquals('ongoing', $manga->getStatus()); } }