client = $this->createMock(MangadexClientInterface::class); $this->provider = new MangadexProvider( $this->client, new AsciiSlugger() ); } public function testSearchWithNoResults(): void { $this->client->method('searchManga') ->willReturn(['data' => []]); $result = $this->provider->search('test'); $this->assertCount(0, $result->getItems()); } public function testSearchWithResults(): void { $this->client->method('searchManga') ->willReturn([ 'data' => [ [ 'id' => '123', 'attributes' => [ 'title' => ['en' => 'Test Manga'], 'description' => ['en' => 'Test description'], 'year' => 2020, 'status' => 'ongoing', 'tags' => [ ['attributes' => ['name' => ['en' => 'Action']]], ], ], 'relationships' => [ [ 'type' => 'author', 'attributes' => ['name' => 'Test Author'], ], [ 'type' => 'cover_art', 'attributes' => ['fileName' => 'cover.jpg'], ], ], ], ], ]); $this->client->method('getMangaRatings') ->willReturn([ 'statistics' => [ '123' => [ 'rating' => ['average' => 4.5], ], ], ]); $result = $this->provider->search('test'); $mangas = $result->getItems(); $this->assertCount(1, $mangas); $manga = $mangas[0]; $this->assertEquals('Test Manga', $manga->getTitle()->getValue()); $this->assertEquals('test-manga', $manga->getSlug()->getValue()); $this->assertEquals('Test description', $manga->getDescription()); $this->assertEquals('Test Author', $manga->getAuthor()); $this->assertEquals(2020, $manga->getPublicationYear()); $this->assertEquals(['Action'], $manga->getGenres()); $this->assertEquals('ongoing', $manga->getStatus()); $this->assertEquals('123', $manga->getExternalId()->getValue()); $this->assertEquals(4.5, $manga->getRating()); } public function testSearchWithInvalidData(): void { $this->client->method('searchManga') ->willReturn([ 'data' => [ [ 'id' => '123', 'attributes' => [ // Missing required 'title' field 'description' => ['en' => 'Test description'], ], 'relationships' => [], ], ], ]); $result = $this->provider->search('test'); $this->assertCount(0, $result->getItems()); } }