Completed
Push — feature-EZP-25696 ( 52d929...5f47d3 )
by André
23:51
created

testGetPermissionsCriterionBooleanPermissionSets()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 10

Duplication

Lines 14
Ratio 100 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 10
nc 1
nop 1
dl 14
loc 14
rs 9.4285
c 1
b 0
f 0
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\API\Repository\Values\Content\Query\Criterion;
15
use eZ\Publish\Core\Repository\Values\User\Policy;
16
17
/**
18
 * Mock test case for PermissionCriterionHandler.
19
 */
20
class PermissionsCriterionHandlerTest extends BaseServiceMockTest
21
{
22
    /**
23
     * Test for the __construct() method.
24
     */
25
    public function testConstructor()
26
    {
27
        $permissionResolverMock = $this->getPermissionResolverMock();
28
        $limitationServiceMock = $this->getLimitationServiceMock();
29
        $handler = $this->getPermissionsCriterionHandlerMock();
30
31
        $this->assertAttributeSame(
32
            $permissionResolverMock,
33
            'permissionResolver',
34
            $handler
35
        );
36
        $this->assertAttributeSame(
37
            $limitationServiceMock,
38
            'limitationService',
39
            $handler
40
        );
41
    }
42
43
    public function providerForTestAddPermissionsCriterionWithBooleanPermission()
44
    {
45
        return array(
46
            array(true),
47
            array(false),
48
        );
49
    }
50
51
    /**
52
     * Test for the addPermissionsCriterion() method.
53
     *
54
     * @dataProvider providerForTestAddPermissionsCriterionWithBooleanPermission
55
     */
56 View Code Duplication
    public function testAddPermissionsCriterionWithBooleanPermission($permissionsCriterion)
57
    {
58
        $handler = $this->getPermissionsCriterionHandlerMock(array('getPermissionsCriterion'));
59
        $criterionMock = $this
60
            ->getMockBuilder('eZ\\Publish\\API\\Repository\\Values\\Content\\Query\\Criterion')
61
            ->disableOriginalConstructor()
62
            ->getMock();
63
64
        $handler
65
            ->expects($this->once())
66
            ->method('getPermissionsCriterion')
67
            ->will($this->returnValue($permissionsCriterion));
68
69
        /* @var \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterionMock */
70
        $result = $handler->addPermissionsCriterion($criterionMock);
71
72
        $this->assertSame($permissionsCriterion, $result);
73
    }
74
75
    public function providerForTestAddPermissionsCriterion()
76
    {
77
        $criterionMock = $this
78
            ->getMockBuilder('eZ\\Publish\\API\\Repository\\Values\\Content\\Query\\Criterion')
79
            ->disableOriginalConstructor()
80
            ->getMock();
81
82
        return array(
83
            array(
84
                $criterionMock,
85
                new Criterion\LogicalAnd(array()),
86
                new Criterion\LogicalAnd(array($criterionMock)),
87
            ),
88
            array(
89
                $criterionMock,
90
                $criterionMock,
91
                new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
92
            ),
93
        );
94
    }
95
96
    /**
97
     * Test for the addPermissionsCriterion() method.
98
     *
99
     * @dataProvider providerForTestAddPermissionsCriterion
100
     */
101 View Code Duplication
    public function testAddPermissionsCriterion($permissionsCriterionMock, $givenCriterion, $expectedCriterion)
102
    {
103
        $handler = $this->getPermissionsCriterionHandlerMock(array('getPermissionsCriterion'));
104
        $handler
105
            ->expects($this->once())
106
            ->method('getPermissionsCriterion')
107
            ->will($this->returnValue($permissionsCriterionMock));
108
109
        /* @var \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterionMock */
110
        $result = $handler->addPermissionsCriterion($givenCriterion);
111
112
        $this->assertTrue($result);
113
        $this->assertEquals($expectedCriterion, $givenCriterion);
114
    }
115
116
    public function providerForTestGetPermissionsCriterion()
117
    {
118
        $criterionMock = $this
119
            ->getMockBuilder('eZ\\Publish\\API\\Repository\\Values\\Content\\Query\\Criterion')
120
            ->disableOriginalConstructor()
121
            ->getMock();
122
        $limitationMock = $this
123
            ->getMockBuilder('eZ\\Publish\\API\\Repository\\Values\\User\\Limitation')
124
            ->getMockForAbstractClass();
125
        $limitationMock
126
            ->expects($this->any())
127
            ->method('getIdentifier')
128
            ->will($this->returnValue('limitationIdentifier'));
129
130
        $policy1 = new Policy(array('limitations' => array($limitationMock)));
131
        $policy2 = new Policy(array('limitations' => array($limitationMock, $limitationMock)));
132
133
        return array(
134
            array(
135
                $criterionMock,
136
                1,
137
                array(
138
                    array(
139
                        'limitation' => null,
140
                        'policies' => array($policy1),
141
                    ),
142
                ),
143
                $criterionMock,
144
            ),
145
            array(
146
                $criterionMock,
147
                2,
148
                array(
149
                    array(
150
                        'limitation' => null,
151
                        'policies' => array($policy1, $policy1),
152
                    ),
153
                ),
154
                new Criterion\LogicalOr(array($criterionMock, $criterionMock)),
155
            ),
156
            array(
157
                $criterionMock,
158
                1,
159
                array(
160
                    array(
161
                        'limitation' => null,
162
                        'policies' => array(new Policy(array('limitations' => '*')), $policy1),
163
                    ),
164
                ),
165
                $criterionMock,
166
            ),
167
            array(
168
                $criterionMock,
169
                1,
170
                array(
171
                    array(
172
                        'limitation' => null,
173
                        'policies' => array(new Policy(array('limitations' => array())), $policy1),
174
                    ),
175
                ),
176
                $criterionMock,
177
            ),
178
            array(
179
                $criterionMock,
180
                2,
181
                array(
182
                    array(
183
                        'limitation' => null,
184
                        'policies' => array($policy2),
185
                    ),
186
                ),
187
                new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
188
            ),
189
            array(
190
                $criterionMock,
191
                3,
192
                array(
193
                    array(
194
                        'limitation' => null,
195
                        'policies' => array($policy1, $policy2),
196
                    ),
197
                ),
198
                new Criterion\LogicalOr(
199
                    array(
200
                        $criterionMock,
201
                        new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
202
                    )
203
                ),
204
            ),
205
            array(
206
                $criterionMock,
207
                2,
208
                array(
209
                    array(
210
                        'limitation' => null,
211
                        'policies' => array($policy1),
212
                    ),
213
                    array(
214
                        'limitation' => null,
215
                        'policies' => array($policy1),
216
                    ),
217
                ),
218
                new Criterion\LogicalOr(array($criterionMock, $criterionMock)),
219
            ),
220
            array(
221
                $criterionMock,
222
                3,
223
                array(
224
                    array(
225
                        'limitation' => null,
226
                        'policies' => array($policy1),
227
                    ),
228
                    array(
229
                        'limitation' => null,
230
                        'policies' => array($policy1, $policy1),
231
                    ),
232
                ),
233
                new Criterion\LogicalOr(array($criterionMock, $criterionMock, $criterionMock)),
234
            ),
235
            array(
236
                $criterionMock,
237
                3,
238
                array(
239
                    array(
240
                        'limitation' => null,
241
                        'policies' => array($policy2),
242
                    ),
243
                    array(
244
                        'limitation' => null,
245
                        'policies' => array($policy1),
246
                    ),
247
                ),
248
                new Criterion\LogicalOr(
249
                    array(
250
                        new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
251
                        $criterionMock,
252
                    )
253
                ),
254
            ),
255
            array(
256
                $criterionMock,
257
                2,
258
                array(
259
                    array(
260
                        'limitation' => $limitationMock,
261
                        'policies' => array($policy1),
262
                    ),
263
                ),
264
                new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
265
            ),
266
            array(
267
                $criterionMock,
268
                4,
269
                array(
270
                    array(
271
                        'limitation' => $limitationMock,
272
                        'policies' => array($policy1),
273
                    ),
274
                    array(
275
                        'limitation' => $limitationMock,
276
                        'policies' => array($policy1),
277
                    ),
278
                ),
279
                new Criterion\LogicalOr(
280
                    array(
281
                        new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
282
                        new Criterion\LogicalAnd(array($criterionMock, $criterionMock)),
283
                    )
284
                ),
285
            ),
286
            array(
287
                $criterionMock,
288
                1,
289
                array(
290
                    array(
291
                        'limitation' => $limitationMock,
292
                        'policies' => array(new Policy(array('limitations' => '*'))),
293
                    ),
294
                ),
295
                $criterionMock,
296
            ),
297
            array(
298
                $criterionMock,
299
                2,
300
                array(
301
                    array(
302
                        'limitation' => $limitationMock,
303
                        'policies' => array(new Policy(array('limitations' => '*'))),
304
                    ),
305
                    array(
306
                        'limitation' => $limitationMock,
307
                        'policies' => array(new Policy(array('limitations' => '*'))),
308
                    ),
309
                ),
310
                new Criterion\LogicalOr(array($criterionMock, $criterionMock)),
311
            ),
312
        );
313
    }
314
315
    protected function mockServices($criterionMock, $limitationCount, $permissionSets)
316
    {
317
        $userMock = $this->getMock('eZ\\Publish\\API\\Repository\\Values\\User\\User');
318
        $limitationTypeMock = $this->getMock('eZ\\Publish\\SPI\\Limitation\\Type');
319
        $limitationServiceMock = $this->getLimitationServiceMock(['getLimitationType']);
320
        $permissionResolverMock = $this->getPermissionResolverMock(
321
            [
322
                'hasAccess',
323
                'getCurrentUserReference',
324
            ]
325
        );
326
327
        $limitationTypeMock
328
            ->expects($this->any())
329
            ->method('getCriterion')
330
            ->with(
331
                $this->isInstanceOf('eZ\\Publish\\API\\Repository\\Values\\User\\Limitation'),
332
                $this->equalTo($userMock)
333
            )
334
            ->will($this->returnValue($criterionMock));
335
336
        $limitationServiceMock
337
            ->expects($this->exactly($limitationCount))
338
            ->method('getLimitationType')
339
            ->with($this->equalTo('limitationIdentifier'))
340
            ->will($this->returnValue($limitationTypeMock));
341
342
        $permissionResolverMock
343
            ->expects($this->once())
344
            ->method('hasAccess')
345
            ->with($this->equalTo('content'), $this->equalTo('read'))
346
            ->will($this->returnValue($permissionSets));
347
348
        $permissionResolverMock
349
            ->expects($this->once())
350
            ->method('getCurrentUserReference')
351
            ->will($this->returnValue($userMock));
352
    }
353
354
    /**
355
     * Test for the getPermissionsCriterion() method.
356
     *
357
     * @dataProvider providerForTestGetPermissionsCriterion
358
     */
359
    public function testGetPermissionsCriterion(
360
        $criterionMock,
361
        $limitationCount,
362
        $permissionSets,
363
        $expectedCriterion
364
    ) {
365
        $this->mockServices($criterionMock, $limitationCount, $permissionSets);
366
        $handler = $this->getPermissionsCriterionHandlerMock(null);
367
368
        $permissionsCriterion = $handler->getPermissionsCriterion();
369
370
        $this->assertEquals($expectedCriterion, $permissionsCriterion);
371
    }
372
373
    public function providerForTestGetPermissionsCriterionBooleanPermissionSets()
374
    {
375
        return array(
376
            array(true),
377
            array(false),
378
        );
379
    }
380
381
    /**
382
     * Test for the getPermissionsCriterion() method.
383
     *
384
     * @dataProvider providerForTestGetPermissionsCriterionBooleanPermissionSets
385
     */
386 View Code Duplication
    public function testGetPermissionsCriterionBooleanPermissionSets($permissionSets)
387
    {
388
        $permissionResolverMock = $this->getPermissionResolverMock(['hasAccess']);
389
        $permissionResolverMock
390
            ->expects($this->once())
391
            ->method('hasAccess')
392
            ->with($this->equalTo('testModule'), $this->equalTo('testFunction'))
393
            ->will($this->returnValue($permissionSets));
394
        $handler = $this->getPermissionsCriterionHandlerMock(null);
395
396
        $permissionsCriterion = $handler->getPermissionsCriterion('testModule', 'testFunction');
397
398
        $this->assertEquals($permissionSets, $permissionsCriterion);
399
    }
400
401
    /**
402
     * Returns the PermissionsCriterionHandler to test with $methods mocked.
403
     *
404
     * @param string[]|null $methods
405
     *
406
     * @return \PHPUnit_Framework_MockObject_MockObject|\eZ\Publish\Core\Repository\PermissionsCriterionHandler
407
     */
408
    protected function getPermissionsCriterionHandlerMock($methods = [])
409
    {
410
        return $this
411
            ->getMockBuilder('eZ\\Publish\\Core\\Repository\\PermissionsCriterionHandler')
412
            ->setMethods($methods)
413
            ->setConstructorArgs(
414
                [
415
                    $this->getPermissionResolverMock(),
416
                    $this->getLimitationServiceMock(),
417
                ]
418
            )
419
            ->getMock();
420
    }
421
422
    protected $permissionResolverMock;
423
424
    protected function getPermissionResolverMock($methods = [])
425
    {
426
        if ($this->permissionResolverMock === null) {
427
            $this->permissionResolverMock = $this
428
                ->getMockBuilder('eZ\Publish\API\Repository\PermissionResolver')
429
                ->setMethods($methods)
430
                ->disableOriginalConstructor()
431
                ->getMockForAbstractClass();
432
        }
433
434
        return $this->permissionResolverMock;
435
    }
436
437
    protected $limitationServiceMock;
438
439 View Code Duplication
    protected function getLimitationServiceMock($methods = [])
440
    {
441
        if ($this->limitationServiceMock === null) {
442
            $this->limitationServiceMock = $this
443
                ->getMockBuilder('eZ\Publish\Core\Repository\Helper\LimitationService')
444
                ->setMethods($methods)
445
                ->disableOriginalConstructor()
446
                ->getMock();
447
        }
448
449
        return $this->limitationServiceMock;
450
    }
451
}
452