Skip to content

Commit c0c73cb

Browse files
Adds support for distinct simple paginator, flows through to the new fractal illuminate simple paginator adapter (#60)
1 parent 52eb1fd commit c0c73cb

File tree

7 files changed

+82
-7
lines changed

7 files changed

+82
-7
lines changed

composer.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"php-open-source-saver/fractal": "^1.0"
2020
},
2121
"require-dev": {
22+
"dingo/blueprint": "~0.4",
2223
"friendsofphp/php-cs-fixer": "~3",
2324
"illuminate/auth": "^9.0|^10.0|^11.0",
2425
"illuminate/cache": "^9.0|^10.0|^11.0",
@@ -28,12 +29,12 @@
2829
"illuminate/filesystem": "^9.0|^10.0|^11.0",
2930
"illuminate/log": "^9.0|^10.0|^11.0",
3031
"illuminate/pagination": "^9.0|^10.0|^11.0",
31-
"laravel/lumen-framework": "^9.0|^10.0|^11.0",
32+
"laravel/framework": "^9.0|^10.0|^11.0",
33+
"illuminate/translation": "^9.0|^10.0|^11.0",
3234
"mockery/mockery": "~1.0",
33-
"phpunit/phpunit": "^9.0|^10.0",
34-
"squizlabs/php_codesniffer": "~2.0",
3535
"php-open-source-saver/jwt-auth": "^1.4 | ^2.2",
36-
"dingo/blueprint": "~0.4"
36+
"phpunit/phpunit": "^9.0|^10.0",
37+
"squizlabs/php_codesniffer": "~2.0"
3738
},
3839
"suggest": {
3940
"php-open-source-saver/jwt-auth": "Protect your API with JSON Web Tokens.",

src/Transformer/Adapter/Fractal.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
use PHPOpenSourceSaver\Fractal\Manager as FractalManager;
1010
use PHPOpenSourceSaver\Fractal\Resource\Item as FractalItem;
1111
use PHPOpenSourceSaver\Fractal\Pagination\IlluminatePaginatorAdapter;
12+
use PHPOpenSourceSaver\Fractal\Pagination\IlluminateSimplePaginatorAdapter;
1213
use Illuminate\Support\Collection as IlluminateCollection;
1314
use PHPOpenSourceSaver\Fractal\Resource\Collection as FractalCollection;
1415
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
1516
use Illuminate\Contracts\Pagination\Paginator as IlluminatePaginator;
17+
use Illuminate\Contracts\Pagination\LengthAwarePaginator as IlluminateLengthAwarePaginator;
1618

1719
class Fractal implements Adapter
1820
{
@@ -127,11 +129,15 @@ protected function shouldEagerLoad($response)
127129
* Create the Fractal paginator adapter.
128130
*
129131
* @param \Illuminate\Contracts\Pagination\Paginator $paginator
130-
* @return \PHPOpenSourceSaver\Fractal\Pagination\IlluminatePaginatorAdapter
132+
* @return IlluminatePaginatorAdapter|IlluminateSimplePaginatorAdapter
131133
*/
132134
protected function createPaginatorAdapter(IlluminatePaginator $paginator)
133135
{
134-
return new IlluminatePaginatorAdapter($paginator);
136+
if ($paginator instanceof IlluminateLengthAwarePaginator) {
137+
return new IlluminatePaginatorAdapter($paginator);
138+
} else {
139+
return new IlluminateSimplePaginatorAdapter($paginator);
140+
}
135141
}
136142

137143
/**

tests/BaseTestCase.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace Dingo\Api\Tests;
44

55
use Dingo\Api\Http\Response;
6+
use Dingo\Api\Tests\Stubs\TranslatorStub;
7+
use Illuminate\Container\Container;
68
use Mockery;
79
use PHPUnit\Framework\TestCase;
810

@@ -22,4 +24,9 @@ public function setUp(): void
2224
{
2325
parent::setUp();
2426
}
27+
28+
protected function setupTranslator(): void
29+
{
30+
app()->singleton('translator', TranslatorStub::class);;
31+
}
2532
}

tests/ChecksLaravelVersionTrait.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ private function getFrameworkVersion()
2828
// Find laravel/framework or lumen package
2929
$just_laravel = array_filter($parsed_data, function ($composerPackageData) {
3030
if (is_array($composerPackageData) && array_key_exists('name', $composerPackageData)) {
31-
if ('laravel/framework' === $composerPackageData['name'] || 'laravel/lumen-framework' === $composerPackageData['name']) {
31+
if ('laravel/framework' === $composerPackageData['name']) {
3232
return true;
3333
}
3434
}

tests/Http/Response/FactoryTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Dingo\Api\Tests\BaseTestCase;
88
use Dingo\Api\Tests\Stubs\UserStub;
99
use Dingo\Api\Transformer\Factory as TransformerFactory;
10+
use Illuminate\Pagination\LengthAwarePaginator;
1011
use Illuminate\Pagination\Paginator;
1112
use Illuminate\Support\Collection;
1213
use PHPOpenSourceSaver\Fractal\Manager;
@@ -27,6 +28,7 @@ class FactoryTest extends BaseTestCase
2728

2829
public function setUp(): void
2930
{
31+
parent::setUp();
3032
$this->transformer = Mockery::mock(TransformerFactory::class);
3133
$this->factory = new Factory($this->transformer);
3234
}
@@ -127,6 +129,16 @@ public function testMakingItemResponseWithThreeParameters()
127129
}
128130

129131
public function testMakingPaginatorRegistersUnderlyingClassWithTransformer()
132+
{
133+
$this->setupTranslator();
134+
135+
$this->transformer->shouldReceive('register')->twice()->with(UserStub::class, 'test', [], null);
136+
137+
$this->assertInstanceOf(LengthAwarePaginator::class, $this->factory->paginator(new LengthAwarePaginator([new UserStub('Jason')], 1, 1), 'test')->getOriginalContent());
138+
$this->assertInstanceOf(LengthAwarePaginator::class, $this->factory->withPaginator(new LengthAwarePaginator([new UserStub('Jason')], 1, 1), 'test')->getOriginalContent());
139+
}
140+
141+
public function testMakingSimplePaginatorRegistersUnderlyingClassWithTransformer()
130142
{
131143
$this->transformer->shouldReceive('register')->twice()->with(UserStub::class, 'test', [], null);
132144

tests/Http/Response/Format/JsonTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
use Dingo\Api\Tests\BaseTestCase;
88
use Dingo\Api\Tests\Stubs\EloquentModelStub;
99
use Illuminate\Database\Eloquent\Collection;
10+
use Illuminate\Pagination\LengthAwarePaginator;
11+
use Illuminate\Pagination\Paginator;
1012
use Illuminate\Support\MessageBag;
1113

1214
class JsonTest extends BaseTestCase
@@ -53,6 +55,25 @@ public function testMorphingEloquentCollection()
5355
$this->assertSame('{"foo_bars":[{"foo":"bar"},{"foo":"bar"}]}', $response->getContent());
5456
}
5557

58+
public function testMorphLengthAwarePaginator()
59+
{
60+
$response = (new Response(new LengthAwarePaginator([new EloquentModelStub, new EloquentModelStub], 2, 10)))->morph();
61+
62+
$content = json_decode($response->getContent(), true);
63+
64+
$this->assertArrayHasKey('total', $content);
65+
$this->assertSame(2, $content['total']);
66+
}
67+
68+
public function testMorphSimplePaginator()
69+
{
70+
$response = (new Response(new Paginator([new EloquentModelStub, new EloquentModelStub], 2, 1)))->morph();
71+
72+
$content = json_decode($response->getContent(), true);
73+
74+
$this->assertArrayNotHasKey('total', $content);
75+
}
76+
5677
public function testMorphingEmptyEloquentCollection()
5778
{
5879
$response = (new Response(new Collection))->morph();

tests/Stubs/TranslatorStub.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Dingo\Api\Tests\Stubs;
4+
5+
use Illuminate\Contracts\Translation\Translator;
6+
7+
class TranslatorStub implements Translator
8+
{
9+
10+
public function get($key, array $replace = [], $locale = null)
11+
{
12+
return $key;
13+
}
14+
15+
public function choice($key, $number, array $replace = [], $locale = null)
16+
{
17+
return $key;
18+
}
19+
20+
public function getLocale()
21+
{
22+
return 'en';
23+
}
24+
25+
public function setLocale($locale)
26+
{
27+
}
28+
}

0 commit comments

Comments
 (0)