jikan-rest/tests/Integration/TopControllerTest.php

331 lines
11 KiB
PHP
Raw Normal View History

<?php /** @noinspection PhpIllegalPsrClassPathInspection */
2023-02-12 15:14:11 +00:00
namespace Tests\Integration;
use App\Anime;
use App\Character;
use App\Manga;
use App\Person;
use App\Testing\ScoutFlush;
use App\Testing\SyntheticMongoDbTransaction;
use Illuminate\Database\Eloquent\Factories\Sequence;
2024-07-26 15:49:27 +01:00
use Jikan\Exception\BadResponseException;
use Jikan\Exception\ParserException;
use Jikan\Model\Reviews\Reviews;
use Jikan\MyAnimeList\MalClient;
use Jikan\Parser\Reviews\ReviewsParser;
use Tests\TestCase;
2019-05-13 13:09:34 +05:00
class TopControllerTest extends TestCase
{
use SyntheticMongoDbTransaction;
use ScoutFlush;
2024-07-26 14:14:13 +01:00
public function topReviewTypeParametersProvider(): array
{
return [
"empty query string" => [[]],
"query string = `?type=anime`" => [["type" => "anime"]],
"query string = `?type=manga`" => [["type" => "manga"]],
];
}
2019-05-13 13:09:34 +05:00
public function testTopAnime()
{
Anime::factory(3)->state(new Sequence(
["rank" => 54],
["rank" => 22],
["rank" => 12]
))->create();
2021-01-16 10:24:14 +05:00
$this->get('/v4/top/anime')
2019-05-13 13:09:34 +05:00
->seeStatusCode(200)
->seeJsonStructure([
2022-06-07 15:52:18 +02:00
'data' => [
2019-05-13 13:09:34 +05:00
[
'mal_id',
'url',
2022-06-07 15:52:18 +02:00
'images' => [
'jpg' => [
'image_url',
'small_image_url',
'large_image_url'
],
'webp' => [
'image_url',
'small_image_url',
'large_image_url'
],
],
'trailer' => [
'youtube_id',
'url',
'embed_url',
'images' => [
'image_url',
'small_image_url',
'medium_image_url',
'large_image_url',
'maximum_image_url',
]
],
'title',
'title_english',
'title_japanese',
'title_synonyms',
2019-05-13 13:09:34 +05:00
'type',
2022-06-07 15:52:18 +02:00
'source',
'episodes',
'status',
'airing',
'aired' => [
'from',
'to',
'prop' => [
'from' => [
'day',
'month',
'year'
],
'to' => [
'day',
'month',
'year'
]
],
'string'
],
'duration',
'rating',
2019-05-13 13:09:34 +05:00
'score',
2022-06-07 15:52:18 +02:00
'scored_by',
'rank',
'popularity',
'members',
'favorites',
'synopsis',
'background',
'season',
'year',
'broadcast' => [
'day',
'time',
'timezone',
'string'
],
'producers' => [
[
'mal_id',
'type',
'name',
'url'
]
],
'licensors' => [
[
'mal_id',
'type',
'name',
'url'
]
],
'studios' => [
[
'mal_id',
'type',
'name',
'url'
]
],
'genres' => [
[
'mal_id',
'type',
'name',
'url'
]
],
2019-05-13 13:09:34 +05:00
]
]
]);
}
public function testTopManga()
{
Manga::factory(3)->state(new Sequence(
["rank" => 54],
["rank" => 22],
["rank" => 12]
))->create();
2021-01-16 10:24:14 +05:00
$this->get('/v4/top/manga')
2019-05-13 13:09:34 +05:00
->seeStatusCode(200)
->seeJsonStructure([
2022-06-07 15:52:18 +02:00
'data' => [
2019-05-13 13:09:34 +05:00
[
'mal_id',
'url',
2022-06-07 15:52:18 +02:00
'images' => [
'jpg' => [
'image_url',
'small_image_url',
'large_image_url'
],
'webp' => [
'image_url',
'small_image_url',
'large_image_url'
],
],
'title',
'title_english',
'title_japanese',
'title_synonyms',
2019-05-13 13:09:34 +05:00
'type',
2022-06-07 15:52:18 +02:00
'chapters',
2019-05-13 13:09:34 +05:00
'volumes',
2022-06-07 15:52:18 +02:00
'status',
'publishing',
'published' => [
'from',
'to',
'prop' => [
'from' => [
'day',
'month',
'year'
],
'to' => [
'day',
'month',
'year'
]
],
'string'
],
2019-05-13 13:09:34 +05:00
'score',
2022-06-07 15:52:18 +02:00
'scored_by',
'rank',
'popularity',
'members',
'favorites',
'synopsis',
'background',
'authors' => [
[
'mal_id',
'type',
'name',
'url'
]
],
'serializations' => [
[
'mal_id',
'type',
'name',
'url'
]
],
'genres' => [
[
'mal_id',
'type',
'name',
'url'
]
]
2019-05-13 13:09:34 +05:00
]
]
]);
}
public function testTopPeople()
{
Person::factory(3)->state(new Sequence(
["member_favorites" => 524],
["member_favorites" => 323],
["member_favorites" => 224],
))->create();
2021-01-16 10:24:14 +05:00
$this->get('/v4/top/people')
2019-05-13 13:09:34 +05:00
->seeStatusCode(200)
->seeJsonStructure([
2022-06-07 15:52:18 +02:00
'data' => [
2019-05-13 13:09:34 +05:00
[
'mal_id',
'url',
2022-06-07 15:52:18 +02:00
'website_url',
'images' => [
'jpg' => [
'image_url',
],
],
'name',
'given_name',
'family_name',
'alternate_names',
2019-05-13 13:09:34 +05:00
'birthday',
2022-06-07 15:52:18 +02:00
'favorites',
'about',
2019-05-13 13:09:34 +05:00
]
]
]);
}
public function testTopCharacters()
{
Character::factory(3)->state(new Sequence(
["member_favorites" => 524],
["member_favorites" => 323],
["member_favorites" => 224],
))->create();
2021-01-16 10:24:14 +05:00
$this->get('/v4/top/characters')
2019-05-13 13:09:34 +05:00
->seeStatusCode(200)
->seeJsonStructure([
2022-06-07 15:52:18 +02:00
'data' => [
2019-05-13 13:09:34 +05:00
[
'mal_id',
'url',
2022-06-07 15:52:18 +02:00
'images' => [
'jpg' => [
'image_url',
],
'webp' => [
'image_url',
],
2019-05-13 13:09:34 +05:00
],
2022-06-07 15:52:18 +02:00
'name',
'nicknames',
2019-05-15 12:35:55 +05:00
'favorites',
2022-06-07 15:52:18 +02:00
'about',
2019-05-13 13:09:34 +05:00
]
]
]);
}
public function test404()
{
2021-01-16 10:24:14 +05:00
$this->get('/v4/top/anime/999')
2019-05-13 13:09:34 +05:00
->seeStatusCode(404);
}
2024-07-26 14:14:13 +01:00
/**
* @dataProvider topReviewTypeParametersProvider
* @param $params
* @return void
2024-07-26 15:49:27 +01:00
* @throws BadResponseException
* @throws ParserException
2024-07-26 14:14:13 +01:00
*/
public function testTopReviews($params)
{
2024-07-26 15:49:27 +01:00
$jikanParser = \Mockery::mock(MalClient::class)->makePartial();
$reviewsParser = \Mockery::mock(ReviewsParser::class)->makePartial();
$reviewsParser->allows()->getReviews()->andReturn([]);
$reviewsParser->allows()->hasNextPage()->andReturn(false);
$reviewsFacade = Reviews::fromParser($reviewsParser);
/** @noinspection PhpParamsInspection */
$jikanParser->allows()->getReviews(\Mockery::any())->andReturn($reviewsFacade);
$this->app->instance('JikanParser', $jikanParser);
2024-07-26 14:14:13 +01:00
$this->getJsonResponse($params,"/v4/top/reviews");
$this->seeStatusCode(200);
}
2019-05-13 13:09:34 +05:00
}