From 6e4ff113e360c4c62ba80ec08e8c0bd94eb27fce Mon Sep 17 00:00:00 2001 From: pushrbx Date: Fri, 26 Jul 2024 13:52:24 +0100 Subject: [PATCH 1/8] fixed enum cast for top reviews endpoint #548 --- app/Dto/QueryTopReviewsCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Dto/QueryTopReviewsCommand.php b/app/Dto/QueryTopReviewsCommand.php index b9ede8e..45ca6dd 100644 --- a/app/Dto/QueryTopReviewsCommand.php +++ b/app/Dto/QueryTopReviewsCommand.php @@ -23,6 +23,6 @@ final class QueryTopReviewsCommand extends QueryTopItemsCommand implements DataR { use HasRequestFingerprint, HasPreliminaryParameter, HasSpoilersParameter, PreparesData; - #[WithCast(EnumCast::class, TopAnimeFilterEnum::class), EnumValidation(TopReviewsTypeEnum::class)] + #[WithCast(EnumCast::class, TopReviewsTypeEnum::class), EnumValidation(TopReviewsTypeEnum::class)] public TopReviewsTypeEnum|Optional $type; } From a9f02dad8b9152e2fec59c8306e66ee450af2c3d Mon Sep 17 00:00:00 2001 From: pushrbx Date: Fri, 26 Jul 2024 14:14:13 +0100 Subject: [PATCH 2/8] added tests for top/reviews endpoint --- tests/Integration/TopControllerTest.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/Integration/TopControllerTest.php b/tests/Integration/TopControllerTest.php index e85ca9f..f445066 100644 --- a/tests/Integration/TopControllerTest.php +++ b/tests/Integration/TopControllerTest.php @@ -14,6 +14,15 @@ class TopControllerTest extends TestCase use SyntheticMongoDbTransaction; use ScoutFlush; + public function topReviewTypeParametersProvider(): array + { + return [ + "empty query string" => [[]], + "query string = `?type=anime`" => [["type" => "anime"]], + "query string = `?type=manga`" => [["type" => "manga"]], + ]; + } + public function testTopAnime() { Anime::factory(3)->state(new Sequence( @@ -290,4 +299,15 @@ class TopControllerTest extends TestCase $this->get('/v4/top/anime/999') ->seeStatusCode(404); } + + /** + * @dataProvider topReviewTypeParametersProvider + * @param $params + * @return void + */ + public function testTopReviews($params) + { + $this->getJsonResponse($params,"/v4/top/reviews"); + $this->seeStatusCode(200); + } } From 475633457aa85c157e3728cce752af274bf8d9e0 Mon Sep 17 00:00:00 2001 From: pushrbx Date: Fri, 26 Jul 2024 14:16:42 +0100 Subject: [PATCH 3/8] cleanup --- app/Dto/QueryTopReviewsCommand.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/Dto/QueryTopReviewsCommand.php b/app/Dto/QueryTopReviewsCommand.php index 45ca6dd..322b66f 100644 --- a/app/Dto/QueryTopReviewsCommand.php +++ b/app/Dto/QueryTopReviewsCommand.php @@ -2,14 +2,12 @@ namespace App\Dto; -use App\Casts\ContextualBooleanCast; use App\Casts\EnumCast; use App\Concerns\HasRequestFingerprint; use App\Contracts\DataRequest; use App\Dto\Concerns\HasPreliminaryParameter; use App\Dto\Concerns\HasSpoilersParameter; use App\Dto\Concerns\PreparesData; -use App\Enums\TopAnimeFilterEnum; use App\Enums\TopReviewsTypeEnum; use App\Rules\Attributes\EnumValidation; use Illuminate\Http\JsonResponse; From 0c4afddcaca0cc49d757ae0dbdc9da172e2bef52 Mon Sep 17 00:00:00 2001 From: pushrbx Date: Fri, 26 Jul 2024 15:49:27 +0100 Subject: [PATCH 4/8] fixed tests --- tests/Integration/TopControllerTest.php | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/Integration/TopControllerTest.php b/tests/Integration/TopControllerTest.php index f445066..4906dd1 100644 --- a/tests/Integration/TopControllerTest.php +++ b/tests/Integration/TopControllerTest.php @@ -7,6 +7,21 @@ use App\Person; use App\Testing\ScoutFlush; use App\Testing\SyntheticMongoDbTransaction; use Illuminate\Database\Eloquent\Factories\Sequence; +use Illuminate\Support\Carbon; +use Jikan\Exception\BadResponseException; +use Jikan\Exception\ParserException; +use Jikan\Model\Anime\AnimeReview; +use Jikan\Model\Anime\AnimeReviewScores; +use Jikan\Model\Manga\MangaReview; +use Jikan\Model\Manga\MangaReviewScores; +use Jikan\Model\Resource\UserImageResource\UserImageResource; +use Jikan\Model\Reviews\Reactions; +use Jikan\Model\Reviews\Reviewer; +use Jikan\Model\Reviews\Reviews; +use Jikan\MyAnimeList\MalClient; +use Jikan\Parser\Reviews\AnimeReviewParser; +use Jikan\Parser\Reviews\MangaReviewParser; +use Jikan\Parser\Reviews\ReviewsParser; use Tests\TestCase; class TopControllerTest extends TestCase @@ -304,9 +319,21 @@ class TopControllerTest extends TestCase * @dataProvider topReviewTypeParametersProvider * @param $params * @return void + * @throws BadResponseException + * @throws ParserException */ public function testTopReviews($params) { + $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); $this->getJsonResponse($params,"/v4/top/reviews"); $this->seeStatusCode(200); } From 08af55545bdd5ec0018b151c1715761985022194 Mon Sep 17 00:00:00 2001 From: pushrbx Date: Fri, 26 Jul 2024 15:52:44 +0100 Subject: [PATCH 5/8] cleanup --- tests/Integration/TopControllerTest.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tests/Integration/TopControllerTest.php b/tests/Integration/TopControllerTest.php index 4906dd1..22f0e46 100644 --- a/tests/Integration/TopControllerTest.php +++ b/tests/Integration/TopControllerTest.php @@ -7,20 +7,10 @@ use App\Person; use App\Testing\ScoutFlush; use App\Testing\SyntheticMongoDbTransaction; use Illuminate\Database\Eloquent\Factories\Sequence; -use Illuminate\Support\Carbon; use Jikan\Exception\BadResponseException; use Jikan\Exception\ParserException; -use Jikan\Model\Anime\AnimeReview; -use Jikan\Model\Anime\AnimeReviewScores; -use Jikan\Model\Manga\MangaReview; -use Jikan\Model\Manga\MangaReviewScores; -use Jikan\Model\Resource\UserImageResource\UserImageResource; -use Jikan\Model\Reviews\Reactions; -use Jikan\Model\Reviews\Reviewer; use Jikan\Model\Reviews\Reviews; use Jikan\MyAnimeList\MalClient; -use Jikan\Parser\Reviews\AnimeReviewParser; -use Jikan\Parser\Reviews\MangaReviewParser; use Jikan\Parser\Reviews\ReviewsParser; use Tests\TestCase; From bef1992c2daefe0ef7e16710bf16d429da23cac0 Mon Sep 17 00:00:00 2001 From: Irfan Date: Sun, 22 Sep 2024 13:29:38 +0500 Subject: [PATCH 6/8] fix: object being passed to the parser instead of value --- app/Features/QueryTopReviewsHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Features/QueryTopReviewsHandler.php b/app/Features/QueryTopReviewsHandler.php index 6eaae8b..932cc0d 100644 --- a/app/Features/QueryTopReviewsHandler.php +++ b/app/Features/QueryTopReviewsHandler.php @@ -31,7 +31,7 @@ final class QueryTopReviewsHandler extends RequestHandlerWithScraperCache $preliminary = $requestParams->get("preliminary", true); return $this->scraperService->findList( $requestFingerPrint, - fn (MalClient $jikan, ?int $page = null) => $jikan->getReviews(new ReviewsRequest($type, $page, $spoilers, $preliminary)), + fn (MalClient $jikan, ?int $page = null) => $jikan->getReviews(new ReviewsRequest($type->value, $page, $spoilers, $preliminary)), $requestParams->get("page")); } } From 6f1e3715b0647655bb38fcad65589c7fcba4781f Mon Sep 17 00:00:00 2001 From: Irfan Date: Sun, 22 Sep 2024 13:29:47 +0500 Subject: [PATCH 7/8] update deps --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index b7d9f1a..572b6df 100644 --- a/composer.lock +++ b/composer.lock @@ -4554,16 +4554,16 @@ }, { "name": "jikan-me/jikan", - "version": "v4.0.11", + "version": "v4.0.12", "source": { "type": "git", "url": "https://github.com/jikan-me/jikan.git", - "reference": "fcc8d20817ce29332b496a21652b9965c6c8196c" + "reference": "dcb47237a9407473f484bd28a5e44479cdd916fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jikan-me/jikan/zipball/fcc8d20817ce29332b496a21652b9965c6c8196c", - "reference": "fcc8d20817ce29332b496a21652b9965c6c8196c", + "url": "https://api.github.com/repos/jikan-me/jikan/zipball/dcb47237a9407473f484bd28a5e44479cdd916fc", + "reference": "dcb47237a9407473f484bd28a5e44479cdd916fc", "shasum": "" }, "require": { @@ -4602,7 +4602,7 @@ "description": "Jikan is an unofficial MyAnimeList API", "support": { "issues": "https://github.com/jikan-me/jikan/issues", - "source": "https://github.com/jikan-me/jikan/tree/v4.0.11" + "source": "https://github.com/jikan-me/jikan/tree/v4.0.12" }, "funding": [ { @@ -4610,7 +4610,7 @@ "type": "patreon" } ], - "time": "2024-05-30T08:15:50+00:00" + "time": "2024-09-20T22:15:42+00:00" }, { "name": "jms/metadata", @@ -13591,5 +13591,5 @@ "ext-mongodb": "*" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } From 8bdcf97d4e370c8fcd74e572b2f6f10206c64a6d Mon Sep 17 00:00:00 2001 From: pushrbx Date: Tue, 15 Oct 2024 18:58:19 +0100 Subject: [PATCH 8/8] fixed test issues --- app/Dto/LookupDataCommand.php | 7 ------- app/Features/QueryTopReviewsHandler.php | 3 +-- app/Http/Resources/V4/ReviewsResource.php | 1 + app/Support/helpers.php | 9 +++++++++ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app/Dto/LookupDataCommand.php b/app/Dto/LookupDataCommand.php index 5949d97..9d60f2d 100644 --- a/app/Dto/LookupDataCommand.php +++ b/app/Dto/LookupDataCommand.php @@ -4,7 +4,6 @@ namespace App\Dto; use App\Concerns\HasRequestFingerprint; use App\Contracts\DataRequest; -use App\DataPipes\MapRouteParametersDataPipe; use App\Dto\Concerns\MapsRouteParameters; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\ResourceCollection; @@ -13,12 +12,6 @@ use Spatie\LaravelData\Attributes\Validation\Min; use Spatie\LaravelData\Attributes\Validation\Numeric; use Spatie\LaravelData\Attributes\Validation\Required; use Spatie\LaravelData\Data; -use Spatie\LaravelData\DataPipeline; -use Spatie\LaravelData\DataPipes\AuthorizedDataPipe; -use Spatie\LaravelData\DataPipes\CastPropertiesDataPipe; -use Spatie\LaravelData\DataPipes\DefaultValuesDataPipe; -use Spatie\LaravelData\DataPipes\MapPropertiesDataPipe; -use Spatie\LaravelData\DataPipes\ValidatePropertiesDataPipe; /** * Base class for all requests/commands which are for looking up things by id. diff --git a/app/Features/QueryTopReviewsHandler.php b/app/Features/QueryTopReviewsHandler.php index 932cc0d..a967d99 100644 --- a/app/Features/QueryTopReviewsHandler.php +++ b/app/Features/QueryTopReviewsHandler.php @@ -7,7 +7,6 @@ use App\Enums\TopReviewsTypeEnum; use App\Support\CachedData; use Illuminate\Http\JsonResponse; use Illuminate\Support\Collection; -use Jikan\Helper\Constants; use Jikan\MyAnimeList\MalClient; use Jikan\Request\Reviews\ReviewsRequest; @@ -31,7 +30,7 @@ final class QueryTopReviewsHandler extends RequestHandlerWithScraperCache $preliminary = $requestParams->get("preliminary", true); return $this->scraperService->findList( $requestFingerPrint, - fn (MalClient $jikan, ?int $page = null) => $jikan->getReviews(new ReviewsRequest($type->value, $page, $spoilers, $preliminary)), + fn (MalClient $jikan, ?int $page = null) => $jikan->getReviews(new ReviewsRequest(ensureEnumPrimitiveValue($type), $page, $spoilers, $preliminary)), $requestParams->get("page")); } } diff --git a/app/Http/Resources/V4/ReviewsResource.php b/app/Http/Resources/V4/ReviewsResource.php index 256beb2..0bca9e0 100644 --- a/app/Http/Resources/V4/ReviewsResource.php +++ b/app/Http/Resources/V4/ReviewsResource.php @@ -3,6 +3,7 @@ namespace App\Http\Resources\V4; use Illuminate\Http\Resources\Json\JsonResource; +use OpenApi\Annotations as OA; class ReviewsResource extends JsonResource { diff --git a/app/Support/helpers.php b/app/Support/helpers.php index dc9094d..df69542 100644 --- a/app/Support/helpers.php +++ b/app/Support/helpers.php @@ -114,3 +114,12 @@ if (! function_exists('cache')) { return app('cache')->put(key($arguments[0]), reset($arguments[0]), $arguments[1] ?? null); } } + +if (!function_exists("ensureEnumPrimitiveValue")) { + function ensureEnumPrimitiveValue(int|string|bool|float|null|\Spatie\Enum\Laravel\Enum $value): mixed { + if ($value instanceof \Spatie\Enum\Laravel\Enum) { + return $value->value; + } + return $value; + } +}