'One Piece', 'slug' => 'one-piece', ]); // Create chapters for volume 1 ChapterFactory::createMany(3, [ 'manga' => $manga, 'volume' => 1, 'visible' => true, 'pagesDirectory' => __DIR__.'/../../Shared/Files/test-pages', ]); $mangaId = $manga->getId(); // Act static::createClient()->request('GET', "/api/mangas/{$mangaId}/volumes/1/download"); // Assert $this->assertResponseIsSuccessful(); $this->assertResponseHeaderSame('Content-Type', 'application/x-cbz'); $contentDisposition = static::getClient()->getResponse()->headers->get('Content-Disposition'); $this->assertStringContainsString('attachment; filename=', $contentDisposition); $this->assertStringContainsString('one-piece_vol1.cbz', $contentDisposition); } public function testItReturns404WhenMangaNotFound(): void { // Act static::createClient()->request('GET', '/api/mangas/999999/volumes/1/download'); // Assert $this->assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } public function testItReturns404WhenVolumeNotFound(): void { // Arrange $manga = MangaFactory::createOne([ 'title' => 'One Piece', 'slug' => 'one-piece', ]); $mangaId = $manga->getId(); // Act static::createClient()->request('GET', "/api/mangas/{$mangaId}/volumes/999/download"); // Assert $this->assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } public function testItReturns404WhenNoAvailableChaptersInVolume(): void { // Arrange $manga = MangaFactory::createOne([ 'title' => 'One Piece', 'slug' => 'one-piece', ]); // Create chapters for volume 1 but all without CBZ files ChapterFactory::createMany(3, [ 'manga' => $manga, 'volume' => 1, 'visible' => true, 'cbzPath' => null, // No CBZ files ]); $mangaId = $manga->getId(); // Act static::createClient()->request('GET', "/api/mangas/{$mangaId}/volumes/1/download"); // Assert $this->assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND); } public function testItOnlyIncludesVisibleChaptersWithCbz(): void { // Arrange $manga = MangaFactory::createOne([ 'title' => 'One Piece', 'slug' => 'one-piece', ]); // Create a mix of chapters ChapterFactory::createOne([ 'manga' => $manga, 'volume' => 1, 'number' => 1.0, 'visible' => true, 'pagesDirectory' => __DIR__.'/../../Shared/Files/test-pages', ]); ChapterFactory::createOne([ 'manga' => $manga, 'volume' => 1, 'number' => 2.0, 'visible' => false, // Soft deleted 'pagesDirectory' => __DIR__.'/../../Shared/Files/test-pages', ]); ChapterFactory::createOne([ 'manga' => $manga, 'volume' => 1, 'number' => 3.0, 'visible' => true, 'cbzPath' => null, // No CBZ ]); ChapterFactory::createOne([ 'manga' => $manga, 'volume' => 1, 'number' => 4.0, 'visible' => true, 'pagesDirectory' => __DIR__.'/../../Shared/Files/test-pages', ]); $mangaId = $manga->getId(); // Act static::createClient()->request('GET', "/api/mangas/{$mangaId}/volumes/1/download"); // Assert - Should succeed with only 2 chapters (1 and 4) $this->assertResponseIsSuccessful(); } }