Completed
Push — master ( 1cb9cd...ecf884 )
by Korvin
05:21 queued 01:49
created

ScopeTest::testJsonSerializable()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.8333
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php namespace League\Fractal\Test;
2
3
use League\Fractal\Manager;
4
use League\Fractal\Pagination\Cursor;
5
use League\Fractal\Resource\Collection;
6
use League\Fractal\Resource\Item;
7
use League\Fractal\Resource\NullResource;
8
use League\Fractal\Resource\Primitive;
9
use League\Fractal\Scope;
10
use League\Fractal\Serializer\ArraySerializer;
11
use League\Fractal\Test\Stub\ArraySerializerWithNull;
12
use League\Fractal\Test\Stub\Transformer\DefaultIncludeBookTransformer;
13
use League\Fractal\Test\Stub\Transformer\NullIncludeBookTransformer;
14
use League\Fractal\Test\Stub\Transformer\PrimitiveIncludeBookTransformer;
15
use Mockery;
16
use PHPUnit\Framework\TestCase;
17
18
class ScopeTest extends TestCase
19
{
20
    protected $simpleItem = ['foo' => 'bar'];
21
    protected $simpleCollection = [['foo' => 'bar']];
22
23 View Code Duplication
    public function testEmbedChildScope()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
24
    {
25
        $manager = new Manager();
26
27
        $resource = new Item(['foo' => 'bar'], function () {
28
        });
29
30
        $scope = new Scope($manager, $resource, 'book');
31
        $this->assertSame($scope->getScopeIdentifier(), 'book');
32
        $childScope = $scope->embedChildScope('author', $resource);
33
34
        $this->assertInstanceOf('League\Fractal\Scope', $childScope);
35
    }
36
37 View Code Duplication
    public function testGetManager()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
38
    {
39
        $resource = new Item(['foo' => 'bar'], function () {
40
        });
41
42
        $scope = new Scope(new Manager(), $resource, 'book');
43
44
        $this->assertInstanceOf('League\Fractal\Manager', $scope->getManager());
45
    }
46
47 View Code Duplication
    public function testGetResource()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
48
    {
49
        $resource = new Item(['foo' => 'bar'], function () {
50
        });
51
52
        $scope = new Scope(new Manager(), $resource, 'book');
53
54
        $this->assertInstanceOf('League\Fractal\Resource\ResourceAbstract', $scope->getResource());
55
        $this->assertInstanceOf('League\Fractal\Resource\Item', $scope->getResource());
56
    }
57
58
    /**
59
     * @covers \League\Fractal\Scope::toArray
60
     */
61
    public function testToArray()
62
    {
63
        $manager = new Manager();
64
65
        $resource = new Item(['foo' => 'bar'], function ($data) {
66
            return $data;
67
        });
68
69
        $scope = new Scope($manager, $resource);
70
71
72
        $this->assertSame(['data' => ['foo' => 'bar']], $scope->toArray());
73
    }
74
75
    /**
76
     * @covers \League\Fractal\Scope::jsonSerialize()
77
     */
78
    public function testJsonSerializable()
79
    {
80
        $manager = new Manager();
81
82
        $resource = new Item(['foo' => 'bar'], function ($data) {
83
            return $data;
84
        });
85
86
        $scope = new Scope($manager, $resource);
87
88
        $this->assertInstanceOf('\JsonSerializable', $scope);
89
        $this->assertEquals($scope->jsonSerialize(), $scope->toArray());
90
    }
91
92 View Code Duplication
    public function testToJson()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
93
    {
94
        $data = [
95
            'foo' => 'bar',
96
        ];
97
98
        $manager = new Manager();
99
100
        $resource = new Item($data, function ($data) {
101
            return $data;
102
        });
103
104
        $scope = new Scope($manager, $resource);
105
106
        $expected = json_encode([
107
            'data' => $data,
108
        ]);
109
110
        $this->assertSame($expected, $scope->toJson());
111
    }
112
113 View Code Duplication
    public function testToJsonWithOption()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
114
    {
115
        $data = [
116
            'foo' => 'bar',
117
        ];
118
119
        $manager = new Manager();
120
121
        $resource = new Item($data, function ($data) {
122
            return $data;
123
        });
124
125
        $scope = new Scope($manager, $resource);
126
127
        $expected = json_encode([
128
            'data' => $data,
129
        ], JSON_PRETTY_PRINT);
130
131
        $this->assertSame($expected, $scope->toJson(JSON_PRETTY_PRINT));
132
    }
133
134 View Code Duplication
    public function testGetCurrentScope()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
135
    {
136
        $manager = new Manager();
137
138
        $resource = new Item(['name' => 'Larry Ullman'], function () {
139
        });
140
141
        $scope = new Scope($manager, $resource, 'book');
142
        $this->assertSame('book', $scope->getScopeIdentifier());
143
144
        $childScope = $scope->embedChildScope('author', $resource);
145
        $this->assertSame('author', $childScope->getScopeIdentifier());
146
147
        $grandChildScope = $childScope->embedChildScope('profile', $resource);
148
        $this->assertSame('profile', $grandChildScope->getScopeIdentifier());
149
    }
150
151 View Code Duplication
    public function testGetIdentifier()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
152
    {
153
        $manager = new Manager();
154
155
        $resource = new Item(['name' => 'Larry Ullman'], function () {
156
        });
157
158
        $scope = new Scope($manager, $resource, 'book');
159
        $this->assertSame('book', $scope->getIdentifier());
160
161
        $childScope = $scope->embedChildScope('author', $resource);
162
        $this->assertSame('book.author', $childScope->getIdentifier());
163
164
        $grandChildScope = $childScope->embedChildScope('profile', $resource);
165
        $this->assertSame('book.author.profile', $grandChildScope->getIdentifier());
166
    }
167
168 View Code Duplication
    public function testGetParentScopes()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
169
    {
170
        $manager = new Manager();
171
172
        $resource = new Item(['name' => 'Larry Ullman'], function () {
173
        });
174
175
        $scope = new Scope($manager, $resource, 'book');
176
177
        $childScope = $scope->embedChildScope('author', $resource);
178
179
        $this->assertSame(['book'], $childScope->getParentScopes());
180
181
        $grandChildScope = $childScope->embedChildScope('profile', $resource);
182
        $this->assertSame(['book', 'author'], $grandChildScope->getParentScopes());
183
    }
184
185
    public function testIsRequested()
186
    {
187
        $manager = new Manager();
188
        $manager->parseIncludes(['foo', 'bar', 'baz.bart']);
189
190
        $scope = new Scope($manager, Mockery::mock('League\Fractal\Resource\ResourceAbstract'));
191
192
        $this->assertTrue($scope->isRequested('foo'));
193
        $this->assertTrue($scope->isRequested('bar'));
194
        $this->assertTrue($scope->isRequested('baz'));
195
        $this->assertTrue($scope->isRequested('baz.bart'));
196
        $this->assertFalse($scope->isRequested('nope'));
197
198
        $childScope = $scope->embedChildScope('baz', Mockery::mock('League\Fractal\Resource\ResourceAbstract'));
199
        $this->assertTrue($childScope->isRequested('bart'));
200
        $this->assertFalse($childScope->isRequested('foo'));
201
        $this->assertFalse($childScope->isRequested('bar'));
202
        $this->assertFalse($childScope->isRequested('baz'));
203
    }
204
205
    public function testIsExcluded()
206
    {
207
        $manager = new Manager();
208
        $manager->parseIncludes(['foo', 'bar', 'baz.bart']);
209
210
        $scope = new Scope($manager, Mockery::mock('League\Fractal\Resource\ResourceAbstract'));
211
        $childScope = $scope->embedChildScope('baz', Mockery::mock('League\Fractal\Resource\ResourceAbstract'));
0 ignored issues
show
Unused Code introduced by
$childScope is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
212
213
        $manager->parseExcludes('bar');
214
215
        $this->assertFalse($scope->isExcluded('foo'));
216
        $this->assertTrue($scope->isExcluded('bar'));
217
        $this->assertFalse($scope->isExcluded('baz.bart'));
218
219
        $manager->parseExcludes('baz.bart');
220
221
        $this->assertFalse($scope->isExcluded('baz'));
222
        $this->assertTrue($scope->isExcluded('baz.bart'));
223
    }
224
225
    /**
226
     * @expectedException \InvalidArgumentException
227
     */
228 View Code Duplication
    public function testScopeRequiresConcreteImplementation()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
229
    {
230
        $manager = new Manager();
231
        $manager->parseIncludes('book');
232
233
        $resource = Mockery::mock('League\Fractal\Resource\ResourceAbstract', [
234
            ['bar' => 'baz'],
235
            function () {},
236
        ])->makePartial();
237
238
        $scope = new Scope($manager, $resource);
0 ignored issues
show
Documentation introduced by
$resource is of type object<Mockery\Mock>, but the function expects a object<League\Fractal\Resource\ResourceInterface>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
239
        $scope->toArray();
240
    }
241
242
    public function testToArrayWithIncludes()
243
    {
244
        $manager = new Manager();
245
        $manager->parseIncludes('book,price');
246
247
        $transformer = Mockery::mock('League\Fractal\TransformerAbstract')->makePartial();
248
        $transformer->shouldReceive('getAvailableIncludes')->twice()->andReturn(['book']);
249
        $transformer->shouldReceive('transform')->once()->andReturnUsing(function (array $data) {
250
            return $data;
251
        });
252
        $transformer
253
            ->shouldReceive('processIncludedResources')
254
            ->once()
255
            ->andReturn(['book' => ['yin' => 'yang'], 'price' => 99]);
256
257
        $resource = new Item(['bar' => 'baz'], $transformer);
258
259
        $scope = new Scope($manager, $resource);
260
261
        $this->assertSame(['data' => ['bar' => 'baz', 'book' => ['yin' => 'yang'], 'price' => 99]], $scope->toArray());
262
    }
263
264
    public function testToArrayWithNumericKeysPreserved()
265
    {
266
        $manager = new Manager();
267
        $manager->setSerializer(new ArraySerializer());
268
269
        $resource = new Item(['1' => 'First', '2' => 'Second'], function ($data) {
270
            return $data;
271
        });
272
273
        $scope = new Scope($manager, $resource);
274
275
        $this->assertSame(['1' => 'First', '2' => 'Second'], $scope->toArray());
276
    }
277
278
    public function testToArrayWithSideloadedIncludes()
279
    {
280
        $serializer = Mockery::mock('League\Fractal\Serializer\ArraySerializer')->makePartial();
281
        $serializer->shouldReceive('sideloadIncludes')->andReturn(true);
282
        $serializer->shouldReceive('item')->andReturnUsing(function ($key, $data) {
283
            return ['data' => $data];
284
        });
285
        $serializer->shouldReceive('includedData')->andReturnUsing(function ($key, $data) {
286
            return ['sideloaded' => array_pop($data)];
287
        });
288
289
        $manager = new Manager();
290
        $manager->parseIncludes('book');
291
        $manager->setSerializer($serializer);
0 ignored issues
show
Documentation introduced by
$serializer is of type object<Mockery\Mock>, but the function expects a object<League\Fractal\Se...zer\SerializerAbstract>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
292
293
        $transformer = Mockery::mock('League\Fractal\TransformerAbstract')->makePartial();
294
        $transformer->shouldReceive('getAvailableIncludes')->twice()->andReturn(['book']);
295
        $transformer->shouldReceive('transform')->once()->andReturnUsing(function (array $data) {
296
            return $data;
297
        });
298
        $transformer->shouldReceive('processIncludedResources')->once()->andReturn(['book' => ['yin' => 'yang']]);
299
300
        $resource = new Item(['bar' => 'baz'], $transformer);
301
302
        $scope = new Scope($manager, $resource);
303
304
        $expected = [
305
            'data' => ['bar' => 'baz'],
306
            'sideloaded' => ['book' => ['yin' => 'yang']],
307
        ];
308
309
        $this->assertSame($expected, $scope->toArray());
310
    }
311
312
    public function testPushParentScope()
313
    {
314
        $manager = new Manager();
315
316
        $resource = new Item(['name' => 'Larry Ullman'], function () {
317
        });
318
319
        $scope = new Scope($manager, $resource);
320
321
        $this->assertSame(1, $scope->pushParentScope('book'));
322
        $this->assertSame(2, $scope->pushParentScope('author'));
323
        $this->assertSame(3, $scope->pushParentScope('profile'));
324
325
326
        $this->assertSame(['book', 'author', 'profile'], $scope->getParentScopes());
327
    }
328
329
    public function testRunAppropriateTransformerWithPrimitive()
330
    {
331
        $manager = new Manager();
332
333
        $transformer = Mockery::mock('League\Fractal\TransformerAbstract');
334
        $transformer->shouldReceive('transform')->once()->andReturn('simple string');
335
        $transformer->shouldReceive('setCurrentScope')->once()->andReturn([]);
336
        $transformer->shouldNotReceive('getAvailableIncludes');
0 ignored issues
show
Unused Code introduced by
The call to MockInterface::shouldNotReceive() has too many arguments starting with 'getAvailableIncludes'.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
337
        $transformer->shouldNotReceive('getDefaultIncludes');
0 ignored issues
show
Unused Code introduced by
The call to MockInterface::shouldNotReceive() has too many arguments starting with 'getDefaultIncludes'.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
338
339
        $resource = new Primitive('test', $transformer);
340
        $scope = $manager->createData($resource);
341
342
        $this->assertSame('simple string', $scope->transformPrimitiveResource());
343
344
        $resource = new Primitive(10, function ($x) {return $x + 10;});
345
        $scope = $manager->createData($resource);
346
347
        $this->assertSame(20, $scope->transformPrimitiveResource());
348
    }
349
350
    public function testRunAppropriateTransformerWithItem()
351
    {
352
        $manager = new Manager();
353
354
        $transformer = Mockery::mock('League\Fractal\TransformerAbstract');
355
        $transformer->shouldReceive('transform')->once()->andReturn($this->simpleItem);
356
        $transformer->shouldReceive('getAvailableIncludes')->once()->andReturn([]);
357
        $transformer->shouldReceive('getDefaultIncludes')->once()->andReturn([]);
358
        $transformer->shouldReceive('setCurrentScope')->once()->andReturn([]);
359
360
        $resource = new Item($this->simpleItem, $transformer);
361
        $scope = $manager->createData($resource);
362
363
        $this->assertSame(['data' => $this->simpleItem], $scope->toArray());
364
    }
365
366
    public function testRunAppropriateTransformerWithCollection()
367
    {
368
        $manager = new Manager();
369
370
        $transformer = Mockery::mock('League\Fractal\TransformerAbstract');
371
        $transformer->shouldReceive('transform')->once()->andReturn(['foo' => 'bar']);
372
        $transformer->shouldReceive('getAvailableIncludes')->once()->andReturn([]);
373
        $transformer->shouldReceive('getDefaultIncludes')->once()->andReturn([]);
374
        $transformer->shouldReceive('setCurrentScope')->once()->andReturn([]);
375
376
        $resource = new Collection([['foo' => 'bar']], $transformer);
377
        $scope = $manager->createData($resource);
378
379
        $this->assertSame(['data' => [['foo' => 'bar']]], $scope->toArray());
380
381
    }
382
383
    /**
384
     * @covers \League\Fractal\Scope::executeResourceTransformers
385
     * @expectedException \InvalidArgumentException
386
     * @expectedExceptionMessage Argument $resource should be an instance of League\Fractal\Resource\Item or League\Fractal\Resource\Collection
387
     */
388
    public function testCreateDataWithClassFuckKnows()
389
    {
390
        $manager = new Manager();
391
392
        $transformer = Mockery::mock('League\Fractal\TransformerAbstract')->makePartial();
393
394
        $resource = Mockery::mock('League\Fractal\Resource\ResourceAbstract', [$this->simpleItem, $transformer])->makePartial();
395
        $scope = $manager->createData($resource);
396
        $scope->toArray();
397
    }
398
399
    public function testPaginatorOutput()
400
    {
401
        $manager = new Manager();
402
403
        $collection = new Collection([['foo' => 'bar', 'baz' => 'ban']], function (array $data) {
404
            return $data;
405
        });
406
407
        $paginator = Mockery::mock('League\Fractal\Pagination\IlluminatePaginatorAdapter')->makePartial();
408
409
        $total = 100;
410
        $perPage = $count = 5;
411
        $currentPage = 2;
412
        $lastPage = 20;
413
414
        $paginator->shouldReceive('getTotal')->once()->andReturn($total);
415
        $paginator->shouldReceive('getCount')->once()->andReturn($count);
416
        $paginator->shouldReceive('getPerPage')->once()->andReturn($perPage);
417
        $paginator->shouldReceive('getCurrentPage')->once()->andReturn($currentPage);
418
        $paginator->shouldReceive('getLastPage')->once()->andReturn($lastPage);
419
        $paginator->shouldReceive('getUrl')->times(2)->andReturnUsing(function ($page) {
420
            return 'http://example.com/foo?page='.$page;
421
        });
422
423
        $collection->setPaginator($paginator);
424
425
        $rootScope = $manager->createData($collection);
426
427
428
        $expectedOutput = [
429
            'data' => [
430
                [
431
                    'foo' => 'bar',
432
                    'baz' => 'ban',
433
                ],
434
            ],
435
            'meta' => [
436
                'pagination' => [
437
                    'total' => $total,
438
                    'count' => $count,
439
                    'per_page' => $perPage,
440
                    'current_page' => $currentPage,
441
                    'total_pages' => $lastPage,
442
                    'links' => [
443
                        'previous' => 'http://example.com/foo?page=1',
444
                        'next' => 'http://example.com/foo?page=3',
445
446
                    ],
447
                ],
448
            ],
449
        ];
450
451
        $this->assertSame($expectedOutput, $rootScope->toArray());
452
    }
453
454
    public function testCursorOutput()
455
    {
456
        $manager = new Manager();
457
458
        $inputData = [
459
            [
460
                'foo' => 'bar',
461
                'baz' => 'ban',
462
            ],
463
        ];
464
465
        $collection = new Collection($inputData, function (array $data) {
466
            return $data;
467
        });
468
469
        $cursor = new Cursor(0, 'ban', 'ban', 2);
470
471
        $collection->setCursor($cursor);
472
473
        $rootScope = $manager->createData($collection);
474
475
476
        $expectedOutput = [
477
            'data' => $inputData,
478
            'meta' => [
479
                'cursor' => [
480
                    'current' => 0,
481
                    'prev' => 'ban',
482
                    'next' => 'ban',
483
                    'count' => 2,
484
485
                ],
486
            ],
487
        ];
488
489
        $this->assertSame($expectedOutput, $rootScope->toArray());
490
    }
491
492 View Code Duplication
    public function testDefaultIncludeSuccess()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
493
    {
494
        $manager = new Manager();
495
        $manager->setSerializer(new ArraySerializer());
496
497
        // Send this stub junk, it has a specific format anyhow
498
        $resource = new Item([], new DefaultIncludeBookTransformer());
499
500
        // Try without metadata
501
        $scope = new Scope($manager, $resource);
502
503
        $expected = [
504
            'a' => 'b',
505
            'author' => [
506
                'c' => 'd',
507
            ],
508
        ];
509
510
        $this->assertSame($expected, $scope->toArray());
511
    }
512
513 View Code Duplication
    public function testPrimitiveResourceIncludeSuccess()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
514
    {
515
        $manager = new Manager();
516
        $manager->setSerializer(new ArraySerializer());
517
518
        $resource = new Item(['price' => '49'], new PrimitiveIncludeBookTransformer);
519
520
        $scope = new Scope($manager, $resource);
521
        $expected = [
522
            'a' => 'b',
523
            'price' => 49,
524
        ];
525
526
        $this->assertSame($expected, $scope->toArray());
527
    }
528
529 View Code Duplication
    public function testNullResourceIncludeSuccess()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
530
    {
531
        $manager = new Manager();
532
        $manager->setSerializer(new ArraySerializerWithNull);
533
534
        // Send this stub junk, it has a specific format anyhow
535
        $resource = new Item([], new NullIncludeBookTransformer);
536
537
        // Try without metadata
538
        $scope = new Scope($manager, $resource);
539
        $expected = [
540
            'a' => 'b',
541
            'author' => null,
542
        ];
543
544
        $this->assertSame($expected, $scope->toArray());
545
    }
546
547
    /**
548
     * @covers \League\Fractal\Scope::toArray
549
     */
550 View Code Duplication
    public function testNullResourceDataAndJustMeta()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
551
    {
552
        $manager = new Manager();
553
        $manager->setSerializer(new ArraySerializerWithNull);
554
555
        $resource = new NullResource();
556
        $resource->setMeta(['foo' => 'bar']);
557
558
        $scope = new Scope($manager, $resource);
559
560
        $this->assertSame(['meta' => ['foo' => 'bar']], $scope->toArray());
561
    }
562
563
    /**
564
     * @covers \League\Fractal\Scope::toArray
565
     * @dataProvider fieldsetsProvider
566
     */
567 View Code Duplication
    public function testToArrayWithFieldsets($fieldsetsToParse, $expected)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
568
    {
569
        $manager = new Manager();
570
571
        $resource = new Item(
572
            ['foo' => 'bar', 'baz' => 'qux'],
573
            function ($data) {
574
                return $data;
575
            },
576
            'resourceName'
577
        );
578
579
        $scope = new Scope($manager, $resource);
580
581
        $manager->parseFieldsets($fieldsetsToParse);
582
        $this->assertSame($expected, $scope->toArray());
583
    }
584
585 View Code Duplication
    public function fieldsetsProvider()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
586
    {
587
        return [
588
            [
589
                ['resourceName' => 'foo'],
590
                ['data' => ['foo' => 'bar']]
591
            ],
592
            [
593
                ['resourceName' => 'foo,baz'],
594
                ['data' => ['foo' => 'bar', 'baz' => 'qux']]
595
            ],
596
            [
597
                ['resourceName' => 'inexistentField'],
598
                ['data' => []]
599
            ]
600
        ];
601
    }
602
603
    /**
604
     * @covers \League\Fractal\Scope::toArray
605
     * @dataProvider fieldsetsWithMandatorySerializerFieldsProvider
606
     */
607 View Code Duplication
    public function testToArrayWithFieldsetsAndMandatorySerializerFields($fieldsetsToParse, $expected)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
608
    {
609
        $serializer = Mockery::mock('League\Fractal\Serializer\DataArraySerializer')->makePartial();
610
        $serializer->shouldReceive('getMandatoryFields')->andReturn(['foo']);
611
612
        $resource = new Item(
613
            ['foo' => 'bar', 'baz' => 'qux'],
614
            function ($data) {
615
                return $data;
616
            },
617
            'resourceName'
618
        );
619
620
        $manager = new Manager();
621
        $manager->setSerializer($serializer);
0 ignored issues
show
Documentation introduced by
$serializer is of type object<Mockery\Mock>, but the function expects a object<League\Fractal\Se...zer\SerializerAbstract>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
622
        $scope = new Scope($manager, $resource);
623
624
        $manager->parseFieldsets($fieldsetsToParse);
625
        $this->assertSame($expected, $scope->toArray());
626
    }
627
628 View Code Duplication
    public function fieldsetsWithMandatorySerializerFieldsProvider()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
629
    {
630
        return [
631
            //Don't request for mandatory field
632
            [
633
                ['resourceName' => 'baz'],
634
                ['data' => ['foo' => 'bar', 'baz' => 'qux']]
635
            ],
636
            //Request required field anyway
637
            [
638
                ['resourceName' => 'foo,baz'],
639
                ['data' => ['foo' => 'bar', 'baz' => 'qux']]
640
            ]
641
        ];
642
    }
643
644
    /**
645
     * @dataProvider fieldsetsWithIncludesProvider
646
     */
647 View Code Duplication
    public function testToArrayWithIncludesAndFieldsets($fieldsetsToParse, $expected)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
648
    {
649
        $transformer = $this->createTransformerWithIncludedResource('book', ['book' => ['yin' => 'yang']]);
650
651
        $resource = new Item(
652
            ['foo' => 'bar', 'baz' => 'qux'],
653
            $transformer,
654
            'resourceName'
655
        );
656
        $manager = new Manager();
657
        $scope = new Scope($manager, $resource);
658
659
        $manager->parseIncludes('book');
660
661
        $manager->parseFieldsets($fieldsetsToParse);
662
        $this->assertSame($expected, $scope->toArray());
663
    }
664
665 View Code Duplication
    public function fieldsetsWithIncludesProvider()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
666
    {
667
        return [
668
            //Included relation was not requested
669
            [
670
                ['resourceName' => 'foo'],
671
                ['data' => ['foo' => 'bar']]
672
            ],
673
            //Included relation was requested
674
            [
675
                ['resourceName' => 'foo,book', 'book' => 'yin'],
676
                ['data' => ['foo' => 'bar', 'book' => ['yin' => 'yang']]]
677
            ]
678
        ];
679
    }
680
681
    /**
682
     * @covers \League\Fractal\Scope::toArray
683
     * @dataProvider fieldsetsWithSideLoadIncludesProvider
684
     */
685
    public function testToArrayWithSideloadedIncludesAndFieldsets($fieldsetsToParse, $expected)
686
    {
687
        $serializer = Mockery::mock('League\Fractal\Serializer\DataArraySerializer')->makePartial();
688
        $serializer->shouldReceive('sideloadIncludes')->andReturn(true);
689
        $serializer->shouldReceive('item')->andReturnUsing(
690
            function ($key, $data) {
691
                return ['data' => $data];
692
            }
693
        );
694
        $serializer->shouldReceive('includedData')->andReturnUsing(
695
            function ($key, $data) {
696
                $data = array_pop($data);
697
                return empty($data) ? [] : ['sideloaded' => $data];
698
            }
699
        );
700
701
        $manager = new Manager();
702
        $manager->parseIncludes('book');
703
        $manager->setSerializer($serializer);
0 ignored issues
show
Documentation introduced by
$serializer is of type object<Mockery\Mock>, but the function expects a object<League\Fractal\Se...zer\SerializerAbstract>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
704
705
        $transformer = $this->createTransformerWithIncludedResource('book', ['book' => ['yin' => 'yang']]);
706
707
        $resource = new Item(['foo' => 'bar'], $transformer, 'resourceName');
708
        $scope = new Scope($manager, $resource);
709
710
        $manager->parseFieldsets($fieldsetsToParse);
711
        $this->assertSame($expected, $scope->toArray());
712
    }
713
714 View Code Duplication
    public function fieldsetsWithSideLoadIncludesProvider()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
715
    {
716
        return [
717
            //Included relation was not requested
718
            [
719
                ['resourceName' => 'foo'],
720
                ['data' => ['foo' => 'bar']]
721
            ],
722
            //Included relation was requested
723
            [
724
                ['resourceName' => 'foo,book', 'book' => 'yin'],
725
                ['data' => ['foo' => 'bar'], 'sideloaded' => ['book' => ['yin' => 'yang']]]
726
            ]
727
        ];
728
    }
729
730
    public function tearDown()
731
    {
732
        Mockery::close();
733
    }
734
735
    protected function createTransformerWithIncludedResource($resourceName, $transformResult)
736
    {
737
        $transformer = Mockery::mock('League\Fractal\TransformerAbstract')->makePartial();
738
        $transformer->shouldReceive('getAvailableIncludes')->twice()->andReturn([$resourceName]);
739
        $transformer->shouldReceive('transform')->once()->andReturnUsing(
740
            function (array $data) {
741
                return $data;
742
            }
743
        );
744
        $transformer->shouldReceive('processIncludedResources')->once()->andReturn($transformResult);
745
        return $transformer;
746
    }
747
}
748