Completed
Push — master ( e03925...d40975 )
by Matt
17s queued 12s
created

test/TransformerAbstractTest.php (4 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php namespace League\Fractal\Test;
2
3
use League\Fractal\Manager;
4
use League\Fractal\Resource\Collection;
5
use League\Fractal\Resource\Item;
6
use League\Fractal\Scope;
7
use Mockery as m;
8
use PHPUnit\Framework\TestCase;
9
10
class TransformerAbstractTest extends TestCase
11
{
12
    /**
13
     * @covers \League\Fractal\TransformerAbstract::setAvailableIncludes
14
     */
15
    public function testSetAvailableIncludes()
16
    {
17
        $transformer = m::mock('League\Fractal\TransformerAbstract')->makePartial();
18
        $this->assertInstanceOf('League\Fractal\TransformerAbstract', $transformer->setAvailableIncludes(['foo']));
19
    }
20
21
    /**
22
     * @covers \League\Fractal\TransformerAbstract::getAvailableIncludes
23
     */
24 View Code Duplication
    public function testGetAvailableIncludes()
25
    {
26
        $transformer = m::mock('League\Fractal\TransformerAbstract')->makePartial();
27
28
        $transformer->setAvailableIncludes(['foo', 'bar']);
29
        $this->assertSame(['foo', 'bar'], $transformer->getAvailableIncludes());
30
    }
31
32
    /**
33
     * @covers \League\Fractal\TransformerAbstract::setDefaultIncludes
34
     */
35
    public function testSetDefaultIncludes()
36
    {
37
        $transformer = m::mock('League\Fractal\TransformerAbstract')->makePartial();
38
        $this->assertInstanceOf('League\Fractal\TransformerAbstract', $transformer->setDefaultIncludes(['foo']));
39
    }
40
41
    /**
42
     * @covers \League\Fractal\TransformerAbstract::getDefaultIncludes
43
     */
44 View Code Duplication
    public function testGetDefaultIncludes()
45
    {
46
        $transformer = m::mock('League\Fractal\TransformerAbstract')->makePartial();
47
48
        $transformer->setDefaultIncludes(['foo', 'bar']);
49
        $this->assertSame(['foo', 'bar'], $transformer->getDefaultIncludes());
50
    }
51
52
    /**
53
     * @covers \League\Fractal\TransformerAbstract::setCurrentScope
54
     */
55 View Code Duplication
    public function testSetCurrentScope()
56
    {
57
        $transformer = $this->getMockForAbstractClass('League\Fractal\TransformerAbstract');
58
        $manager = new Manager();
59
        $scope = new Scope($manager, m::mock('League\Fractal\Resource\ResourceAbstract'));
60
        $this->assertInstanceOf('League\Fractal\TransformerAbstract', $transformer->setCurrentScope($scope));
61
    }
62
63
    /**
64
     * @covers \League\Fractal\TransformerAbstract::getCurrentScope
65
     */
66 View Code Duplication
    public function testGetCurrentScope()
67
    {
68
        $transformer = m::mock('League\Fractal\TransformerAbstract')->makePartial();
69
        $manager = new Manager();
70
        $scope = new Scope($manager, m::mock('League\Fractal\Resource\ResourceAbstract'));
71
        $transformer->setCurrentScope($scope);
72
        $this->assertSame($transformer->getCurrentScope(), $scope);
73
    }
74
75 View Code Duplication
    public function testProcessEmbeddedResourcesNoAvailableIncludes()
0 ignored issues
show
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...
76
    {
77
        $transformer = m::mock('League\Fractal\TransformerAbstract')->makePartial();
78
79
        $manager = new Manager();
80
        $manager->parseIncludes('foo');
81
82
        $scope = new Scope($manager, m::mock('League\Fractal\Resource\ResourceAbstract'));
83
        $this->assertFalse($transformer->processIncludedResources($scope, ['some' => 'data']));
84
    }
85
86 View Code Duplication
    public function testProcessEmbeddedResourcesNoDefaultIncludes()
0 ignored issues
show
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...
87
    {
88
        $transformer = m::mock('League\Fractal\TransformerAbstract')->makePartial();
89
90
        $manager = new Manager();
91
        $manager->parseIncludes('foo');
92
93
        $scope = new Scope($manager, m::mock('League\Fractal\Resource\ResourceAbstract'));
94
        $this->assertFalse($transformer->processIncludedResources($scope, ['some' => 'data']));
95
    }
96
97
    /**
98
     * @covers \League\Fractal\TransformerAbstract::processIncludedResources
99
     * @covers \League\Fractal\TransformerAbstract::callIncludeMethod
100
     * @expectedException \BadMethodCallException
101
     */
102
    public function testProcessEmbeddedResourcesInvalidAvailableEmbed()
103
    {
104
        $transformer = m::mock('League\Fractal\TransformerAbstract')->makePartial();
105
106
        $manager = new Manager();
107
        $manager->parseIncludes('book');
108
109
        $scope = new Scope($manager, m::mock('League\Fractal\Resource\ResourceAbstract'));
110
        $transformer->setCurrentScope($scope);
111
112
        $transformer->setAvailableIncludes(['book']);
113
        $transformer->processIncludedResources($scope, []);
114
    }
115
116
    /**
117
     * @covers \League\Fractal\TransformerAbstract::processIncludedResources
118
     * @covers \League\Fractal\TransformerAbstract::callIncludeMethod
119
     * @expectedException \BadMethodCallException
120
     */
121 View Code Duplication
    public function testProcessEmbeddedResourcesInvalidDefaultEmbed()
122
    {
123
        $transformer = m::mock('League\Fractal\TransformerAbstract')->makePartial();
124
125
        $manager = new Manager();
126
127
        $scope = new Scope($manager, m::mock('League\Fractal\Resource\ResourceAbstract'));
128
129
        $transformer->setDefaultIncludes(['book']);
130
        $transformer->processIncludedResources($scope, []);
131
    }
132
133
    /**
134
     * @covers \League\Fractal\TransformerAbstract::processIncludedResources
135
     * @covers \League\Fractal\TransformerAbstract::callIncludeMethod
136
     */
137 View Code Duplication
    public function testProcessIncludedAvailableResources()
138
    {
139
        $manager = new Manager();
140
        $manager->parseIncludes('book');
141
        $transformer = m::mock('League\Fractal\TransformerAbstract[transform]');
142
143
        $transformer->shouldReceive('includeBook')->once()->andReturnUsing(function ($data) {
144
            return new Item(['included' => 'thing'], function ($data) {
145
                return $data;
146
            });
147
        });
148
149
        $transformer->setAvailableIncludes(['book', 'publisher']);
150
        $scope = new Scope($manager, new Item([], $transformer));
151
        $included = $transformer->processIncludedResources($scope, ['meh']);
152
        $this->assertSame(['book' => ['data' => ['included' => 'thing']]], $included);
153
    }
154
155
    /**
156
     * @covers \League\Fractal\TransformerAbstract::processIncludedResources
157
     * @covers \League\Fractal\TransformerAbstract::figureOutWhichIncludes
158
     */
159 View Code Duplication
    public function testProcessExcludedAvailableResources()
160
    {
161
        $manager = new Manager();
162
        $transformer = m::mock('League\Fractal\TransformerAbstract[transform]');
163
        $scope = new Scope($manager, new Item([], $transformer));
164
165
        $transformer->shouldReceive('includeBook')->never();
166
167
        $transformer->shouldReceive('includePublisher')->once()->andReturnUsing(function ($data) {
168
            return new Item(['another' => 'thing'], function ($data) {
169
                return $data;
170
            });
171
        });
172
173
        // available includes that have been requested are excluded
174
        $manager->parseIncludes('book,publisher');
175
        $manager->parseExcludes('book');
176
177
        $transformer->setAvailableIncludes(['book', 'publisher']);
178
179
        $included = $transformer->processIncludedResources($scope, ['meh']);
180
        $this->assertSame(['publisher' => ['data' => ['another' => 'thing']]], $included);
181
    }
182
183
    /**
184
     * @covers \League\Fractal\TransformerAbstract::processIncludedResources
185
     * @covers \League\Fractal\TransformerAbstract::figureOutWhichIncludes
186
     */
187 View Code Duplication
    public function testProcessExcludedDefaultResources()
188
    {
189
        $manager = new Manager();
190
        $transformer = m::mock('League\Fractal\TransformerAbstract[transform]');
191
        $scope = new Scope($manager, new Item([], $transformer));
192
193
        $transformer->shouldReceive('includeBook')->never();
194
195
        $transformer->shouldReceive('includePublisher')->once()->andReturnUsing(function ($data) {
196
            return new Item(['another' => 'thing'], function ($data) {
197
                return $data;
198
            });
199
        });
200
201
        $manager->parseIncludes('book,publisher');
202
        $manager->parseExcludes('book');
203
204
        $transformer->setDefaultIncludes(['book', 'publisher']);
205
206
        $included = $transformer->processIncludedResources($scope, ['meh']);
207
        $this->assertSame(['publisher' => ['data' => ['another' => 'thing']]], $included);
208
    }
209
210
    /**
211
     * @covers \League\Fractal\TransformerAbstract::processIncludedResources
212
     * @covers \League\Fractal\TransformerAbstract::callIncludeMethod
213
     */
214
    public function testProcessIncludedAvailableResourcesEmptyEmbed()
215
    {
216
        $manager = new Manager();
217
        $manager->parseIncludes(['book']);
218
        $transformer = m::mock('League\Fractal\TransformerAbstract[transform]');
219
220
        $transformer->shouldReceive('includeBook')->once()->andReturn(null);
221
222
        $transformer->setAvailableIncludes(['book']);
223
        $scope = new Scope($manager, new Item([], $transformer));
224
        $included = $transformer->processIncludedResources($scope, ['meh']);
225
226
        $this->assertFalse($included);
227
    }
228
229
    /**
230
     * @covers \League\Fractal\TransformerAbstract::callIncludeMethod
231
     * @expectedException \Exception
232
     * @expectedExceptionMessage Invalid return value from League\Fractal\TransformerAbstract::includeBook().
233
     */
234 View Code Duplication
    public function testCallEmbedMethodReturnsCrap()
0 ignored issues
show
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...
235
    {
236
        $manager = new Manager();
237
        $manager->parseIncludes('book');
238
        $transformer = m::mock('League\Fractal\TransformerAbstract[transform]');
239
240
        $transformer->shouldReceive('includeBook')->once()->andReturn(new \stdClass());
241
242
        $transformer->setAvailableIncludes(['book']);
243
        $scope = new Scope($manager, new Item([], $transformer));
244
        $transformer->processIncludedResources($scope, ['meh']);
245
    }
246
247
    /**
248
     * @covers \League\Fractal\TransformerAbstract::processIncludedResources
249
     * @covers \League\Fractal\TransformerAbstract::callIncludeMethod
250
     */
251 View Code Duplication
    public function testProcessEmbeddedDefaultResources()
252
    {
253
        $manager = new Manager();
254
        $transformer = m::mock('League\Fractal\TransformerAbstract[transform]');
255
256
        $transformer->shouldReceive('includeBook')->once()->andReturnUsing(function ($data) {
257
            return new Item(['included' => 'thing'], function ($data) {
258
                return $data;
259
            });
260
        });
261
262
        $transformer->setDefaultIncludes(['book']);
263
        $scope = new Scope($manager, new Item([], $transformer));
264
        $included = $transformer->processIncludedResources($scope, ['meh']);
265
        $this->assertSame(['book' => ['data' => ['included' => 'thing']]], $included);
266
    }
267
268
    /**
269
     * @covers \League\Fractal\TransformerAbstract::processIncludedResources
270
     * @covers \League\Fractal\TransformerAbstract::callIncludeMethod
271
     */
272 View Code Duplication
    public function testIncludedItem()
273
    {
274
        $manager = new Manager();
275
        $manager->parseIncludes('book');
276
277
        $transformer = m::mock('League\Fractal\TransformerAbstract[transform]');
278
        $transformer->shouldReceive('includeBook')->once()->andReturnUsing(function ($data) {
279
            return new Item(['included' => 'thing'], function ($data) {
280
                return $data;
281
            });
282
        });
283
284
        $transformer->setAvailableIncludes(['book']);
285
        $scope = new Scope($manager, new Item([], $transformer));
286
        $included = $transformer->processIncludedResources($scope, ['meh']);
287
        $this->assertSame(['book' => ['data' => ['included' => 'thing']]], $included);
288
    }
289
290
    public function testParamBagIsProvidedForIncludes()
291
    {
292
        $manager = new Manager();
293
        $manager->parseIncludes('book:foo(bar)');
294
295
        $transformer = m::mock('League\Fractal\TransformerAbstract')->makePartial();
296
297
        $transformer->shouldReceive('includeBook')
298
            ->with(m::any(), m::type('\League\Fractal\ParamBag'))
299
            ->once();
300
301
        $transformer->setAvailableIncludes(['book']);
302
        $scope = new Scope($manager, new Item([], $transformer));
303
304
        $this->assertFalse($transformer->processIncludedResources($scope, []));
305
    }
306
307
    /**
308
     * @covers \League\Fractal\TransformerAbstract::processIncludedResources
309
     * @covers \League\Fractal\TransformerAbstract::callIncludeMethod
310
     */
311
    public function testIncludedCollection()
312
    {
313
        $manager = new Manager();
314
        $manager->parseIncludes('book');
315
316
        $collectionData = [
317
            ['included' => 'thing'],
318
            ['another' => 'thing'],
319
        ];
320
321
        $transformer = m::mock('League\Fractal\TransformerAbstract[transform]');
322
        $transformer->shouldReceive('includeBook')->once()->andReturnUsing(function ($data) use ($collectionData) {
323
            return new Collection($collectionData, function ($data) {
324
                return $data;
325
            });
326
        });
327
328
        $transformer->setAvailableIncludes(['book']);
329
        $scope = new Scope($manager, new Collection([], $transformer));
330
        $included = $transformer->processIncludedResources($scope, ['meh']);
331
        $this->assertSame(['book' => ['data' => $collectionData]], $included);
332
    }
333
334
    /**
335
     * @covers \League\Fractal\TransformerAbstract::processIncludedResources
336
     * @covers \League\Fractal\TransformerAbstract::callIncludeMethod
337
     */
338 View Code Duplication
    public function testProcessEmbeddedDefaultResourcesEmptyEmbed()
0 ignored issues
show
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...
339
    {
340
        $transformer = m::mock('League\Fractal\TransformerAbstract[transform]');
341
        $transformer->shouldReceive('includeBook')->once()->andReturn(null);
342
343
        $transformer->setDefaultIncludes(['book']);
344
        $scope = new Scope(new Manager(), new Item([], $transformer));
345
        $included = $transformer->processIncludedResources($scope, ['meh']);
346
347
        $this->assertFalse($included);
348
    }
349
350
    /**
351
     * @covers \League\Fractal\TransformerAbstract::item
352
     */
353
    public function testItem()
354
    {
355
        $mock = m::mock('League\Fractal\TransformerAbstract');
356
        $item = $mock->item([], function () {
357
        });
358
        $this->assertInstanceOf('League\Fractal\Resource\Item', $item);
359
    }
360
361
    /**
362
     * @covers \League\Fractal\TransformerAbstract::collection
363
     */
364
    public function testCollection()
365
    {
366
        $mock = m::mock('League\Fractal\TransformerAbstract');
367
        $collection = $mock->collection([], function () {
368
        });
369
        $this->assertInstanceOf('League\Fractal\Resource\Collection', $collection);
370
    }
371
372
    public function tearDown()
373
    {
374
        m::close();
375
    }
376
}
377