Completed
Push — ezp26356-rest_parser_inception ( c3cab8...1163b5 )
by
unknown
57:26 queued 31:12
created

PermissionsCriterionHandlerTest::mockServices()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 38
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 38
c 0
b 0
f 0
cc 1
eloc 28
nc 1
nop 3
rs 8.8571
1
<?php
2
3
/**
4
 * File contains: eZ\Publish\Core\Repository\Tests\Service\Mock\PermissionCriterionHandlerTest class.
5
 *
6
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
7
 * @license For full copyright and license information view LICENSE file distributed with this source code.
8
 *
9
 * @version //autogentag//
10
 */
11
namespace eZ\Publish\Core\Repository\Tests\Service\Mock;
12
13
use eZ\Publish\Core\Repository\Tests\Service\Mock\Base as BaseServiceMockTest;
14
use eZ\Publish\Core\Repository\PermissionsCriterionHandler;
15
use eZ\Publish\API\Repository\Values\Content\Query\Criterion;
16
use eZ\Publish\Core\Repository\Values\User\Policy;
17
18
/**
19
 * Mock test case for PermissionCriterionHandler.
20
 */
21
class PermissionsCriterionHandlerTest extends BaseServiceMockTest
22
{
23
    protected $repositoryMock;
24
25
    /**
26
     * Test for the __construct() method.
27
     */
28
    public function testConstructor()
29
    {
30
        $repositoryMock = $this->getRepositoryMock();
31
        $handler = new PermissionsCriterionHandler($repositoryMock);
0 ignored issues
show
Bug introduced by
It seems like $repositoryMock defined by $this->getRepositoryMock() on line 30 can also be of type object<PHPUnit_Framework_MockObject_MockObject>; however, eZ\Publish\Core\Reposito...nHandler::__construct() does only seem to accept object<eZ\Publish\API\Repository\Repository>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
32
33
        $this->assertAttributeSame(
34
            $repositoryMock,
35
            'repository',
36
            $handler
37
        );
38
    }
39
40
    public function providerForTestAddPermissionsCriterionWithBooleanPermission()
41
    {
42
        return array(
43
            array(true),
44
            array(false),
45
        );
46
    }
47
48
    /**
49
     * Test for the addPermissionsCriterion() method.
50
     *
51
     * @dataProvider providerForTestAddPermissionsCriterionWithBooleanPermission
52
     */
53 View Code Duplication
    public function testAddPermissionsCriterionWithBooleanPermission($permissionsCriterion)
54
    {
55
        $handler = $this->getPartlyMockedPermissionsCriterionHandler(array('getPermissionsCriterion'));
56
        $criterionMock = $this
57
            ->getMockBuilder('eZ\\Publish\\API\\Repository\\Values\\Content\\Query\\Criterion')
58
            ->disableOriginalConstructor()
59
            ->getMock();
60
61
        $handler
62
            ->expects($this->once())
63
            ->method('getPermissionsCriterion')
64
            ->will($this->returnValue($permissionsCriterion));
65
66
        /* @var \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterionMock */
67
        $result = $handler->addPermissionsCriterion($criterionMock);
68
69
        $this->assertSame($permissionsCriterion, $result);
70
    }
71
72
    public function providerForTestAddPermissionsCriterion()
73
    {
74
        $criterionMock = $this
75
            ->getMockBuilder('eZ\\Publish\\API\\Repository\\Values\\Content\\Query\\Criterion')
76
            ->disableOriginalConstructor()
77
            ->getMock();
78
79
        return array(
80
            array(
81
                $criterionMock,
82
                new Criterion\LogicalAnd(array()),
83
                new Criterion\LogicalAnd(array($criterionMock)),
84
            ),
85
            array(
86
                $criterionMock,
87
                $criterionMock,
88
                new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
89
            ),
90
        );
91
    }
92
93
    /**
94
     * Test for the addPermissionsCriterion() method.
95
     *
96
     * @dataProvider providerForTestAddPermissionsCriterion
97
     */
98 View Code Duplication
    public function testAddPermissionsCriterion($permissionsCriterionMock, $givenCriterion, $expectedCriterion)
99
    {
100
        $handler = $this->getPartlyMockedPermissionsCriterionHandler(array('getPermissionsCriterion'));
101
        $handler
102
            ->expects($this->once())
103
            ->method('getPermissionsCriterion')
104
            ->will($this->returnValue($permissionsCriterionMock));
105
106
        /* @var \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterionMock */
107
        $result = $handler->addPermissionsCriterion($givenCriterion);
108
109
        $this->assertTrue($result);
110
        $this->assertEquals($expectedCriterion, $givenCriterion);
111
    }
112
113
    public function providerForTestGetPermissionsCriterion()
114
    {
115
        $criterionMock = $this
116
            ->getMockBuilder('eZ\\Publish\\API\\Repository\\Values\\Content\\Query\\Criterion')
117
            ->disableOriginalConstructor()
118
            ->getMock();
119
        $limitationMock = $this->getMockForAbstractClass('eZ\\Publish\\API\\Repository\\Values\\User\\Limitation');
120
        $limitationMock
121
            ->expects($this->any())
122
            ->method('getIdentifier')
123
            ->will($this->returnValue('limitationIdentifier'));
124
125
        $policy1 = new Policy(array('limitations' => array($limitationMock)));
126
        $policy2 = new Policy(array('limitations' => array($limitationMock, $limitationMock)));
127
128
        return array(
129
            array(
130
                $criterionMock,
131
                1,
132
                array(
133
                    array(
134
                        'limitation' => null,
135
                        'policies' => array($policy1),
136
                    ),
137
                ),
138
                $criterionMock,
139
            ),
140
            array(
141
                $criterionMock,
142
                2,
143
                array(
144
                    array(
145
                        'limitation' => null,
146
                        'policies' => array($policy1, $policy1),
147
                    ),
148
                ),
149
                new Criterion\LogicalOr(array($criterionMock, $criterionMock)),
150
            ),
151
            array(
152
                $criterionMock,
153
                1,
154
                array(
155
                    array(
156
                        'limitation' => null,
157
                        'policies' => array(new Policy(array('limitations' => '*')), $policy1),
158
                    ),
159
                ),
160
                $criterionMock,
161
            ),
162
            array(
163
                $criterionMock,
164
                1,
165
                array(
166
                    array(
167
                        'limitation' => null,
168
                        'policies' => array(new Policy(array('limitations' => array())), $policy1),
169
                    ),
170
                ),
171
                $criterionMock,
172
            ),
173
            array(
174
                $criterionMock,
175
                2,
176
                array(
177
                    array(
178
                        'limitation' => null,
179
                        'policies' => array($policy2),
180
                    ),
181
                ),
182
                new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
183
            ),
184
            array(
185
                $criterionMock,
186
                3,
187
                array(
188
                    array(
189
                        'limitation' => null,
190
                        'policies' => array($policy1, $policy2),
191
                    ),
192
                ),
193
                new Criterion\LogicalOr(
194
                    array(
195
                        $criterionMock,
196
                        new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
197
                    )
198
                ),
199
            ),
200
            array(
201
                $criterionMock,
202
                2,
203
                array(
204
                    array(
205
                        'limitation' => null,
206
                        'policies' => array($policy1),
207
                    ),
208
                    array(
209
                        'limitation' => null,
210
                        'policies' => array($policy1),
211
                    ),
212
                ),
213
                new Criterion\LogicalOr(array($criterionMock, $criterionMock)),
214
            ),
215
            array(
216
                $criterionMock,
217
                3,
218
                array(
219
                    array(
220
                        'limitation' => null,
221
                        'policies' => array($policy1),
222
                    ),
223
                    array(
224
                        'limitation' => null,
225
                        'policies' => array($policy1, $policy1),
226
                    ),
227
                ),
228
                new Criterion\LogicalOr(array($criterionMock, $criterionMock, $criterionMock)),
229
            ),
230
            array(
231
                $criterionMock,
232
                3,
233
                array(
234
                    array(
235
                        'limitation' => null,
236
                        'policies' => array($policy2),
237
                    ),
238
                    array(
239
                        'limitation' => null,
240
                        'policies' => array($policy1),
241
                    ),
242
                ),
243
                new Criterion\LogicalOr(
244
                    array(
245
                        new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
246
                        $criterionMock,
247
                    )
248
                ),
249
            ),
250
            array(
251
                $criterionMock,
252
                2,
253
                array(
254
                    array(
255
                        'limitation' => $limitationMock,
256
                        'policies' => array($policy1),
257
                    ),
258
                ),
259
                new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
260
            ),
261
            array(
262
                $criterionMock,
263
                4,
264
                array(
265
                    array(
266
                        'limitation' => $limitationMock,
267
                        'policies' => array($policy1),
268
                    ),
269
                    array(
270
                        'limitation' => $limitationMock,
271
                        'policies' => array($policy1),
272
                    ),
273
                ),
274
                new Criterion\LogicalOr(
275
                    array(
276
                        new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
277
                        new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
278
                    )
279
                ),
280
            ),
281
            array(
282
                $criterionMock,
283
                1,
284
                array(
285
                    array(
286
                        'limitation' => $limitationMock,
287
                        'policies' => array(new Policy(array('limitations' => '*'))),
288
                    ),
289
                ),
290
                $criterionMock,
291
            ),
292
            array(
293
                $criterionMock,
294
                2,
295
                array(
296
                    array(
297
                        'limitation' => $limitationMock,
298
                        'policies' => array(new Policy(array('limitations' => '*'))),
299
                    ),
300
                    array(
301
                        'limitation' => $limitationMock,
302
                        'policies' => array(new Policy(array('limitations' => '*'))),
303
                    ),
304
                ),
305
                new Criterion\LogicalOr(array($criterionMock, $criterionMock)),
306
            ),
307
        );
308
    }
309
310
    protected function getMockedRepository($criterionMock, $limitationCount, $permissionSets)
311
    {
312
        $repositoryMock = $this->getRepositoryMock();
313
        $roleServiceMock = $this->getMock('eZ\\Publish\\API\\Repository\\RoleService');
314
        $userMock = $this->getMock('eZ\\Publish\\API\\Repository\\Values\\User\\User');
315
        $limitationTypeMock = $this->getMock('eZ\\Publish\\SPI\\Limitation\\Type');
316
317
        $limitationTypeMock
318
            ->expects($this->any())
319
            ->method('getCriterion')
320
            ->with(
321
                $this->isInstanceOf('eZ\\Publish\\API\\Repository\\Values\\User\\Limitation'),
322
                $this->equalTo($userMock)
323
            )
324
            ->will($this->returnValue($criterionMock));
325
326
        $roleServiceMock
327
            ->expects($this->exactly($limitationCount))
328
            ->method('getLimitationType')
329
            ->with($this->equalTo('limitationIdentifier'))
330
            ->will($this->returnValue($limitationTypeMock));
331
332
        $repositoryMock
333
            ->expects($this->once())
334
            ->method('hasAccess')
335
            ->with($this->equalTo('content'), $this->equalTo('read'))
336
            ->will($this->returnValue($permissionSets));
337
338
        $repositoryMock
339
            ->expects($this->once())
340
            ->method('getRoleService')
341
            ->will($this->returnValue($roleServiceMock));
342
343
        $repositoryMock
344
            ->expects($this->once())
345
            ->method('getCurrentUserReference')
346
            ->will($this->returnValue($userMock));
347
348
        return $repositoryMock;
349
    }
350
351
    /**
352
     * Test for the getPermissionsCriterion() method.
353
     *
354
     * @dataProvider providerForTestGetPermissionsCriterion
355
     */
356
    public function testGetPermissionsCriterion(
357
        $criterionMock,
358
        $limitationCount,
359
        $permissionSets,
360
        $expectedCriterion
361
    ) {
362
        $repositoryMock = $this->getMockedRepository(
363
            $criterionMock,
364
            $limitationCount,
365
            $permissionSets
366
        );
367
        $handler = new PermissionsCriterionHandler($repositoryMock);
0 ignored issues
show
Bug introduced by
It seems like $repositoryMock defined by $this->getMockedReposito...Count, $permissionSets) on line 362 can also be of type object<PHPUnit_Framework_MockObject_MockObject>; however, eZ\Publish\Core\Reposito...nHandler::__construct() does only seem to accept object<eZ\Publish\API\Repository\Repository>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
368
369
        $permissionsCriterion = $handler->getPermissionsCriterion();
370
371
        $this->assertEquals($expectedCriterion, $permissionsCriterion);
372
    }
373
374
    public function providerForTestGetPermissionsCriterionBooleanPermissionSets()
375
    {
376
        return array(
377
            array(true),
378
            array(false),
379
        );
380
    }
381
382
    /**
383
     * Test for the getPermissionsCriterion() method.
384
     *
385
     * @dataProvider providerForTestGetPermissionsCriterionBooleanPermissionSets
386
     */
387 View Code Duplication
    public function testGetPermissionsCriterionBooleanPermissionSets($permissionSets)
388
    {
389
        $repositoryMock = $this->getRepositoryMock();
390
        $repositoryMock
391
            ->expects($this->once())
392
            ->method('hasAccess')
393
            ->with($this->equalTo('testModule'), $this->equalTo('testFunction'))
394
            ->will($this->returnValue($permissionSets));
395
        $handler = new PermissionsCriterionHandler($this->getRepositoryMock());
0 ignored issues
show
Bug introduced by
It seems like $this->getRepositoryMock() targeting eZ\Publish\Core\Reposito...se::getRepositoryMock() can also be of type object<PHPUnit_Framework_MockObject_MockObject>; however, eZ\Publish\Core\Reposito...nHandler::__construct() does only seem to accept object<eZ\Publish\API\Repository\Repository>, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
396
397
        $permissionsCriterion = $handler->getPermissionsCriterion('testModule', 'testFunction');
398
399
        $this->assertEquals($permissionSets, $permissionsCriterion);
400
    }
401
402
    /**
403
     * Returns the PermissionsCriterionHandler to test with $methods mocked.
404
     *
405
     * Injected Repository comes from {@see getRepositoryMock()}
406
     *
407
     * @param string[] $methods
408
     *
409
     * @return \PHPUnit_Framework_MockObject_MockObject|\eZ\Publish\Core\Repository\PermissionsCriterionHandler
410
     */
411
    protected function getPartlyMockedPermissionsCriterionHandler(array $methods = array())
412
    {
413
        return $this->getMock(
414
            'eZ\\Publish\\Core\\Repository\\PermissionsCriterionHandler',
415
            $methods,
416
            array($this->getRepositoryMock())
417
        );
418
    }
419
}
420