request('GET', '/api/mangas'); // Then $this->assertResponseIsSuccessful(); $this->assertJsonContains([ 'total' => 0, 'page' => 1, 'limit' => 20, 'hasNextPage' => false, 'hasPreviousPage' => false, 'items' => [], ]); } public function testGetMangaListWithPagination(): void { // Given $this->createMangas(25); // When $client = static::createClient(); $response = $client->request('GET', '/api/mangas', [ 'query' => [ 'page' => 2, 'limit' => 10, ], ]); // Then $this->assertResponseIsSuccessful(); $data = $response->toArray(); $this->assertCount(10, $data['items']); $this->assertEquals(25, $data['total']); $this->assertEquals(2, $data['page']); $this->assertEquals(10, $data['limit']); $this->assertTrue($data['hasNextPage']); $this->assertTrue($data['hasPreviousPage']); } public function testGetMangaListWithSorting(): void { // Given $this->createManga('Manga B'); $this->createManga('Manga A'); $this->createManga('Manga C'); // When $client = static::createClient(); $response = $client->request('GET', '/api/mangas', [ 'query' => [ 'sortBy' => 'title', 'sortOrder' => 'asc', ], ]); // Then $this->assertResponseIsSuccessful(); $data = $response->toArray(); $this->assertCount(3, $data['items']); $this->assertEquals('Manga A', $data['items'][0]['title']); $this->assertEquals('Manga B', $data['items'][1]['title']); $this->assertEquals('Manga C', $data['items'][2]['title']); } public function testGetMangaListWithChapters(): void { // Given — manga with chapters triggers Doctrine EAGER loading of chapters collection // (regression: colonne pages_directory doit exister sinon 500) $manga = MangaFactory::createOne([ 'title' => 'One Piece', 'slug' => 'one-piece', 'imageUrl' => 'https://example.com/image.jpg', 'thumbnailUrl' => 'https://example.com/thumb.jpg', ]); ChapterFactory::createOne([ 'manga' => $manga, 'number' => 1.0, 'title' => 'Romance Dawn', 'volume' => 1, 'visible' => true, ]); // When $client = static::createClient(); $client->request('GET', '/api/mangas'); // Then — doit retourner 200 même avec des chapitres (eager loading OK) $this->assertResponseIsSuccessful(); $data = $client->getResponse()->toArray(); $this->assertEquals(1, $data['total']); } private function createMangas(int $count): void { for ($i = 1; $i <= $count; ++$i) { $this->createManga("Manga $i"); } } private function createManga(string $title): void { $manga = new Manga(); $manga->setTitle($title) ->setSlug(strtolower(str_replace(' ', '-', $title))) ->setDescription('Description test') ->setAuthor('Author test') ->setPublicationYear(2020) ->setGenres(['action']) ->setStatus('ongoing') ->setRating(4.5) ->setMonitored(false) ->setImageUrl('https://via.placeholder.com/150') ->setThumbnailUrl('https://via.placeholder.com/150') ->setCreatedAt(new \DateTimeImmutable('2020-01-01')); $this->entityManager->persist($manga); $this->entityManager->flush(); } }