From 8f5dab73fca1bdd260fecdf2be81876f1ff98f50 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 9 Feb 2025 18:12:44 +0100 Subject: [PATCH] Adds support for distinct simple paginator, flows through to the new fractal illuminate simple paginator adapter --- composer.json | 9 ++++---- src/Transformer/Adapter/Fractal.php | 10 +++++++-- tests/BaseTestCase.php | 7 +++++++ tests/ChecksLaravelVersionTrait.php | 2 +- tests/Http/Response/FactoryTest.php | 12 +++++++++++ tests/Http/Response/Format/JsonTest.php | 21 +++++++++++++++++++ tests/Stubs/TranslatorStub.php | 28 +++++++++++++++++++++++++ 7 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 tests/Stubs/TranslatorStub.php diff --git a/composer.json b/composer.json index 745e8242..f9568814 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ "php-open-source-saver/fractal": "^1.0" }, "require-dev": { + "dingo/blueprint": "~0.4", "friendsofphp/php-cs-fixer": "~3", "illuminate/auth": "^9.0|^10.0|^11.0", "illuminate/cache": "^9.0|^10.0|^11.0", @@ -28,12 +29,12 @@ "illuminate/filesystem": "^9.0|^10.0|^11.0", "illuminate/log": "^9.0|^10.0|^11.0", "illuminate/pagination": "^9.0|^10.0|^11.0", - "laravel/lumen-framework": "^9.0|^10.0|^11.0", + "laravel/framework": "^9.0|^10.0|^11.0", + "illuminate/translation": "^9.0|^10.0|^11.0", "mockery/mockery": "~1.0", - "phpunit/phpunit": "^9.0|^10.0", - "squizlabs/php_codesniffer": "~2.0", "php-open-source-saver/jwt-auth": "^1.4 | ^2.2", - "dingo/blueprint": "~0.4" + "phpunit/phpunit": "^9.0|^10.0", + "squizlabs/php_codesniffer": "~2.0" }, "suggest": { "php-open-source-saver/jwt-auth": "Protect your API with JSON Web Tokens.", diff --git a/src/Transformer/Adapter/Fractal.php b/src/Transformer/Adapter/Fractal.php index 4ed10cac..ae9400d1 100644 --- a/src/Transformer/Adapter/Fractal.php +++ b/src/Transformer/Adapter/Fractal.php @@ -9,10 +9,12 @@ use PHPOpenSourceSaver\Fractal\Manager as FractalManager; use PHPOpenSourceSaver\Fractal\Resource\Item as FractalItem; use PHPOpenSourceSaver\Fractal\Pagination\IlluminatePaginatorAdapter; +use PHPOpenSourceSaver\Fractal\Pagination\IlluminateSimplePaginatorAdapter; use Illuminate\Support\Collection as IlluminateCollection; use PHPOpenSourceSaver\Fractal\Resource\Collection as FractalCollection; use Illuminate\Database\Eloquent\Collection as EloquentCollection; use Illuminate\Contracts\Pagination\Paginator as IlluminatePaginator; +use Illuminate\Contracts\Pagination\LengthAwarePaginator as IlluminateLengthAwarePaginator; class Fractal implements Adapter { @@ -127,11 +129,15 @@ protected function shouldEagerLoad($response) * Create the Fractal paginator adapter. * * @param \Illuminate\Contracts\Pagination\Paginator $paginator - * @return \PHPOpenSourceSaver\Fractal\Pagination\IlluminatePaginatorAdapter + * @return IlluminatePaginatorAdapter|IlluminateSimplePaginatorAdapter */ protected function createPaginatorAdapter(IlluminatePaginator $paginator) { - return new IlluminatePaginatorAdapter($paginator); + if ($paginator instanceof IlluminateLengthAwarePaginator) { + return new IlluminatePaginatorAdapter($paginator); + } else { + return new IlluminateSimplePaginatorAdapter($paginator); + } } /** diff --git a/tests/BaseTestCase.php b/tests/BaseTestCase.php index fa460e1a..17602d0f 100644 --- a/tests/BaseTestCase.php +++ b/tests/BaseTestCase.php @@ -3,6 +3,8 @@ namespace Dingo\Api\Tests; use Dingo\Api\Http\Response; +use Dingo\Api\Tests\Stubs\TranslatorStub; +use Illuminate\Container\Container; use Mockery; use PHPUnit\Framework\TestCase; @@ -22,4 +24,9 @@ public function setUp(): void { parent::setUp(); } + + protected function setupTranslator(): void + { + app()->singleton('translator', TranslatorStub::class);; + } } diff --git a/tests/ChecksLaravelVersionTrait.php b/tests/ChecksLaravelVersionTrait.php index 1e5b68b1..e6561a93 100644 --- a/tests/ChecksLaravelVersionTrait.php +++ b/tests/ChecksLaravelVersionTrait.php @@ -28,7 +28,7 @@ private function getFrameworkVersion() // Find laravel/framework or lumen package $just_laravel = array_filter($parsed_data, function ($composerPackageData) { if (is_array($composerPackageData) && array_key_exists('name', $composerPackageData)) { - if ('laravel/framework' === $composerPackageData['name'] || 'laravel/lumen-framework' === $composerPackageData['name']) { + if ('laravel/framework' === $composerPackageData['name']) { return true; } } diff --git a/tests/Http/Response/FactoryTest.php b/tests/Http/Response/FactoryTest.php index d113f891..0411fe05 100644 --- a/tests/Http/Response/FactoryTest.php +++ b/tests/Http/Response/FactoryTest.php @@ -7,6 +7,7 @@ use Dingo\Api\Tests\BaseTestCase; use Dingo\Api\Tests\Stubs\UserStub; use Dingo\Api\Transformer\Factory as TransformerFactory; +use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\Paginator; use Illuminate\Support\Collection; use PHPOpenSourceSaver\Fractal\Manager; @@ -27,6 +28,7 @@ class FactoryTest extends BaseTestCase public function setUp(): void { + parent::setUp(); $this->transformer = Mockery::mock(TransformerFactory::class); $this->factory = new Factory($this->transformer); } @@ -127,6 +129,16 @@ public function testMakingItemResponseWithThreeParameters() } public function testMakingPaginatorRegistersUnderlyingClassWithTransformer() + { + $this->setupTranslator(); + + $this->transformer->shouldReceive('register')->twice()->with(UserStub::class, 'test', [], null); + + $this->assertInstanceOf(LengthAwarePaginator::class, $this->factory->paginator(new LengthAwarePaginator([new UserStub('Jason')], 1, 1), 'test')->getOriginalContent()); + $this->assertInstanceOf(LengthAwarePaginator::class, $this->factory->withPaginator(new LengthAwarePaginator([new UserStub('Jason')], 1, 1), 'test')->getOriginalContent()); + } + + public function testMakingSimplePaginatorRegistersUnderlyingClassWithTransformer() { $this->transformer->shouldReceive('register')->twice()->with(UserStub::class, 'test', [], null); diff --git a/tests/Http/Response/Format/JsonTest.php b/tests/Http/Response/Format/JsonTest.php index 0f6c9f05..a95b559f 100644 --- a/tests/Http/Response/Format/JsonTest.php +++ b/tests/Http/Response/Format/JsonTest.php @@ -7,6 +7,8 @@ use Dingo\Api\Tests\BaseTestCase; use Dingo\Api\Tests\Stubs\EloquentModelStub; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Pagination\LengthAwarePaginator; +use Illuminate\Pagination\Paginator; use Illuminate\Support\MessageBag; class JsonTest extends BaseTestCase @@ -53,6 +55,25 @@ public function testMorphingEloquentCollection() $this->assertSame('{"foo_bars":[{"foo":"bar"},{"foo":"bar"}]}', $response->getContent()); } + public function testMorphLengthAwarePaginator() + { + $response = (new Response(new LengthAwarePaginator([new EloquentModelStub, new EloquentModelStub], 2, 10)))->morph(); + + $content = json_decode($response->getContent(), true); + + $this->assertArrayHasKey('total', $content); + $this->assertSame(2, $content['total']); + } + + public function testMorphSimplePaginator() + { + $response = (new Response(new Paginator([new EloquentModelStub, new EloquentModelStub], 2, 1)))->morph(); + + $content = json_decode($response->getContent(), true); + + $this->assertArrayNotHasKey('total', $content); + } + public function testMorphingEmptyEloquentCollection() { $response = (new Response(new Collection))->morph(); diff --git a/tests/Stubs/TranslatorStub.php b/tests/Stubs/TranslatorStub.php new file mode 100644 index 00000000..bcb5990f --- /dev/null +++ b/tests/Stubs/TranslatorStub.php @@ -0,0 +1,28 @@ +