Skip to content

Commit

Permalink
Merge pull request #549 from jikan-me/bugfix/548
Browse files Browse the repository at this point in the history
🐛 Fixed an issue with casting query string params on `/top/reviews` endpoint
  • Loading branch information
pushrbx authored Oct 15, 2024
2 parents 634528a + 8bdcf97 commit 744bd69
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 19 deletions.
7 changes: 0 additions & 7 deletions app/Dto/LookupDataCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

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;
Expand All @@ -13,12 +12,6 @@
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.
Expand Down
4 changes: 1 addition & 3 deletions app/Dto/QueryTopReviewsCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -23,6 +21,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;
}
3 changes: 1 addition & 2 deletions app/Features/QueryTopReviewsHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
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;

Expand All @@ -31,7 +30,7 @@ protected function getScraperData(string $requestFingerPrint, Collection $reques
$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(ensureEnumPrimitiveValue($type), $page, $spoilers, $preliminary)),
$requestParams->get("page"));
}
}
1 change: 1 addition & 0 deletions app/Http/Resources/V4/ReviewsResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace App\Http\Resources\V4;

use Illuminate\Http\Resources\Json\JsonResource;
use OpenApi\Annotations as OA;

class ReviewsResource extends JsonResource
{
Expand Down
9 changes: 9 additions & 0 deletions app/Support/helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,12 @@ function cache(...$arguments)
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;
}
}
14 changes: 7 additions & 7 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

37 changes: 37 additions & 0 deletions tests/Integration/TopControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,27 @@
use App\Testing\ScoutFlush;
use App\Testing\SyntheticMongoDbTransaction;
use Illuminate\Database\Eloquent\Factories\Sequence;
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;

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(
Expand Down Expand Up @@ -290,4 +304,27 @@ public function test404()
$this->get('/v4/top/anime/999')
->seeStatusCode(404);
}

/**
* @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);
}
}

0 comments on commit 744bd69

Please sign in to comment.