Completed
Push — master ( 9a380f...b40ee9 )
by Łukasz
25:43
created

PermissionCriterionResolverTest::mockServices()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 55

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 55
c 0
b 0
f 0
cc 1
nc 1
nop 3
rs 8.9818

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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
namespace eZ\Publish\Core\Repository\Tests\Permission;
10
11
use eZ\Publish\API\Repository\Values\Content\Query\Criterion;
12
use eZ\Publish\API\Repository\Values\User\Limitation;
13
use eZ\Publish\API\Repository\Values\User\User;
14
use eZ\Publish\API\Repository\PermissionResolver;
15
use eZ\Publish\Core\Limitation\TargetOnlyLimitationType;
16
use eZ\Publish\Core\Repository\Permission\PermissionCriterionResolver;
17
use eZ\Publish\Core\Repository\Values\User\Policy;
18
use eZ\Publish\Core\Repository\Helper\LimitationService;
19
use eZ\Publish\SPI\Limitation\Type;
20
use PHPUnit\Framework\TestCase;
21
22
/**
23
 * Mock test case for PermissionCriterionResolver.
24
 */
25
class PermissionCriterionResolverTest extends TestCase
26
{
27
    /**
28
     * Test for the __construct() method.
29
     */
30 View Code Duplication
    public function testConstructor()
31
    {
32
        $permissionResolverMock = $this->getPermissionResolverMock();
33
        $limitationServiceMock = $this->getLimitationServiceMock();
34
        $criterionResolver = $this->getPermissionCriterionResolverMock();
35
36
        $this->assertAttributeSame(
0 ignored issues
show
Deprecated Code introduced by
The method PHPUnit\Framework\Assert::assertAttributeSame() has been deprecated with message: https://github.com/sebastianbergmann/phpunit/issues/3338

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
37
            $permissionResolverMock,
38
            'permissionResolver',
39
            $criterionResolver
40
        );
41
        $this->assertAttributeSame(
0 ignored issues
show
Deprecated Code introduced by
The method PHPUnit\Framework\Assert::assertAttributeSame() has been deprecated with message: https://github.com/sebastianbergmann/phpunit/issues/3338

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
42
            $limitationServiceMock,
43
            'limitationService',
44
            $criterionResolver
45
        );
46
    }
47
48
    public function providerForTestGetPermissionsCriterion()
49
    {
50
        $criterionMock = $this
51
            ->getMockBuilder(Criterion::class)
52
            ->disableOriginalConstructor()
53
            ->getMock();
54
        $limitationMock = $this
55
            ->getMockBuilder(Limitation::class)
56
            ->getMockForAbstractClass();
57
        $limitationMock
58
            ->expects($this->any())
59
            ->method('getIdentifier')
60
            ->will($this->returnValue('limitationIdentifier'));
61
62
        $targetOnlyLimitationMock = $this->createMock(Limitation::class);
63
        $targetOnlyLimitationMock
64
            ->expects($this->any())
65
            ->method('getIdentifier')
66
            ->willReturn('targetOnlyLimitationIdentifier');
67
68
        $policy1 = new Policy(['limitations' => [$limitationMock]]);
69
        $policy2 = new Policy(['limitations' => [$limitationMock, $limitationMock]]);
70
        $policy3 = new Policy(['limitations' => [$limitationMock, $targetOnlyLimitationMock]]);
71
72
        return [
73
            [
74
                $criterionMock,
75
                1,
76
                [
77
                    [
78
                        'limitation' => null,
79
                        'policies' => [$policy1],
80
                    ],
81
                ],
82
                $criterionMock,
83
            ],
84
            [
85
                $criterionMock,
86
                2,
87
                [
88
                    [
89
                        'limitation' => null,
90
                        'policies' => [$policy1, $policy1],
91
                    ],
92
                ],
93
                new Criterion\LogicalOr([$criterionMock, $criterionMock]),
94
            ],
95
            [
96
                $criterionMock,
97
                0,
98
                [
99
                    [
100
                        'limitation' => null,
101
                        'policies' => [new Policy(['limitations' => '*']), $policy1],
102
                    ],
103
                ],
104
                false,
105
            ],
106
            [
107
                $criterionMock,
108
                0,
109
                [
110
                    [
111
                        'limitation' => null,
112
                        'policies' => [new Policy(['limitations' => []]), $policy1],
113
                    ],
114
                ],
115
                false,
116
            ],
117
            [
118
                $criterionMock,
119
                2,
120
                [
121
                    [
122
                        'limitation' => null,
123
                        'policies' => [$policy2],
124
                    ],
125
                ],
126
                new Criterion\LogicalAnd([$criterionMock, $criterionMock]),
127
            ],
128
            [
129
                $criterionMock,
130
                3,
131
                [
132
                    [
133
                        'limitation' => null,
134
                        'policies' => [$policy1, $policy2],
135
                    ],
136
                ],
137
                new Criterion\LogicalOr(
138
                    [
139
                        $criterionMock,
140
                        new Criterion\LogicalAnd([$criterionMock, $criterionMock]),
141
                    ]
142
                ),
143
            ],
144
            [
145
                $criterionMock,
146
                2,
147
                [
148
                    [
149
                        'limitation' => null,
150
                        'policies' => [$policy1],
151
                    ],
152
                    [
153
                        'limitation' => null,
154
                        'policies' => [$policy1],
155
                    ],
156
                ],
157
                new Criterion\LogicalOr([$criterionMock, $criterionMock]),
158
            ],
159
            [
160
                $criterionMock,
161
                3,
162
                [
163
                    [
164
                        'limitation' => null,
165
                        'policies' => [$policy1],
166
                    ],
167
                    [
168
                        'limitation' => null,
169
                        'policies' => [$policy1, $policy1],
170
                    ],
171
                ],
172
                new Criterion\LogicalOr([$criterionMock, $criterionMock, $criterionMock]),
173
            ],
174
            [
175
                $criterionMock,
176
                3,
177
                [
178
                    [
179
                        'limitation' => null,
180
                        'policies' => [$policy2],
181
                    ],
182
                    [
183
                        'limitation' => null,
184
                        'policies' => [$policy1],
185
                    ],
186
                ],
187
                new Criterion\LogicalOr(
188
                    [
189
                        new Criterion\LogicalAnd([$criterionMock, $criterionMock]),
190
                        $criterionMock,
191
                    ]
192
                ),
193
            ],
194
            [
195
                $criterionMock,
196
                2,
197
                [
198
                    [
199
                        'limitation' => $limitationMock,
200
                        'policies' => [$policy1],
201
                    ],
202
                ],
203
                new Criterion\LogicalAnd([$criterionMock, $criterionMock]),
204
            ],
205
            [
206
                $criterionMock,
207
                4,
208
                [
209
                    [
210
                        'limitation' => $limitationMock,
211
                        'policies' => [$policy1],
212
                    ],
213
                    [
214
                        'limitation' => $limitationMock,
215
                        'policies' => [$policy1],
216
                    ],
217
                ],
218
                new Criterion\LogicalOr(
219
                    [
220
                        new Criterion\LogicalAnd([$criterionMock, $criterionMock]),
221
                        new Criterion\LogicalAnd([$criterionMock, $criterionMock]),
222
                    ]
223
                ),
224
            ],
225
            [
226
                $criterionMock,
227
                1,
228
                [
229
                    [
230
                        'limitation' => $limitationMock,
231
                        'policies' => [new Policy(['limitations' => '*'])],
232
                    ],
233
                ],
234
                $criterionMock,
235
            ],
236
            [
237
                $criterionMock,
238
                2,
239
                [
240
                    [
241
                        'limitation' => $limitationMock,
242
                        'policies' => [new Policy(['limitations' => '*'])],
243
                    ],
244
                    [
245
                        'limitation' => $limitationMock,
246
                        'policies' => [new Policy(['limitations' => '*'])],
247
                    ],
248
                ],
249
                new Criterion\LogicalOr([$criterionMock, $criterionMock]),
250
            ],
251
            [
252
                $criterionMock,
253
                2,
254
                [
255
                    [
256
                        'limitation' => null,
257
                        'policies' => [$policy3],
258
                    ],
259
                ],
260
                new Criterion\LogicalAnd([$criterionMock, $criterionMock]),
261
            ],
262
        ];
263
    }
264
265
    protected function mockServices($criterionMock, $limitationCount, $permissionSets)
266
    {
267
        $userMock = $this->getMockBuilder(User::class)->getMockForAbstractClass();
268
        $limitationServiceMock = $this->getLimitationServiceMock(['getLimitationType']);
269
        $limitationTypeMock = $this->getMockBuilder(Type::class)->getMockForAbstractClass();
270
        $targetOnlyLimitationTypeMock = $this->createMock(TargetOnlyLimitationType::class);
271
        $permissionResolverMock = $this->getPermissionResolverMock(
272
            [
273
                'hasAccess',
274
                'getCurrentUserReference',
275
            ]
276
        );
277
278
        $limitationTypeMock
279
            ->expects($this->any())
280
            ->method('getCriterion')
281
            ->with(
282
                $this->isInstanceOf(Limitation::class),
283
                $this->equalTo($userMock)
284
            )
285
            ->will($this->returnValue($criterionMock));
286
287
        $targetOnlyLimitationTypeMock
288
            ->expects($this->never())
289
            ->method('getCriterion');
290
291
        $targetOnlyLimitationTypeMock
292
            ->expects($this->any())
293
            ->method('getCriterionByTarget')
294
            ->with(
295
                $this->isInstanceOf(Limitation::class),
296
                $this->equalTo($userMock),
297
                $this->anything()
298
            )
299
            ->willReturn($criterionMock);
300
301
        $limitationServiceMock
302
            ->expects($this->exactly($limitationCount))
303
            ->method('getLimitationType')
304
            ->willReturnMap([
305
                ['limitationIdentifier', $limitationTypeMock],
306
                ['targetOnlyLimitationIdentifier', $targetOnlyLimitationTypeMock],
307
            ]);
308
309
        $permissionResolverMock
310
            ->expects($this->once())
311
            ->method('hasAccess')
312
            ->with($this->equalTo('content'), $this->equalTo('read'))
313
            ->will($this->returnValue($permissionSets));
314
315
        $permissionResolverMock
316
            ->expects($this->once())
317
            ->method('getCurrentUserReference')
318
            ->will($this->returnValue($userMock));
319
    }
320
321
    /**
322
     * Test for the getPermissionsCriterion() method.
323
     *
324
     * @dataProvider providerForTestGetPermissionsCriterion
325
     */
326
    public function testGetPermissionsCriterion(
327
        $criterionMock,
328
        $limitationCount,
329
        $permissionSets,
330
        $expectedCriterion
331
    ) {
332
        $this->mockServices($criterionMock, $limitationCount, $permissionSets);
333
        $criterionResolver = $this->getPermissionCriterionResolverMock(null);
334
335
        $permissionsCriterion = $criterionResolver->getPermissionsCriterion('content', 'read', []);
336
337
        $this->assertEquals($expectedCriterion, $permissionsCriterion);
338
    }
339
340
    public function providerForTestGetPermissionsCriterionBooleanPermissionSets()
341
    {
342
        return [
343
            [true],
344
            [false],
345
        ];
346
    }
347
348
    /**
349
     * Test for the getPermissionsCriterion() method.
350
     *
351
     * @dataProvider providerForTestGetPermissionsCriterionBooleanPermissionSets
352
     */
353 View Code Duplication
    public function testGetPermissionsCriterionBooleanPermissionSets($permissionSets)
354
    {
355
        $permissionResolverMock = $this->getPermissionResolverMock(['hasAccess']);
356
        $permissionResolverMock
357
            ->expects($this->once())
358
            ->method('hasAccess')
359
            ->with($this->equalTo('testModule'), $this->equalTo('testFunction'))
360
            ->will($this->returnValue($permissionSets));
361
362
        $criterionResolver = $this->getPermissionCriterionResolverMock(null);
363
364
        $permissionsCriterion = $criterionResolver->getPermissionsCriterion('testModule', 'testFunction');
365
366
        $this->assertEquals($permissionSets, $permissionsCriterion);
367
    }
368
369
    /**
370
     * Returns the PermissionCriterionResolver to test with $methods mocked.
371
     *
372
     * @param string[]|null $methods
373
     *
374
     * @return \PHPUnit\Framework\MockObject\MockObject|\eZ\Publish\Core\Repository\Permission\PermissionCriterionResolver
375
     */
376 View Code Duplication
    protected function getPermissionCriterionResolverMock($methods = [])
377
    {
378
        return $this
379
            ->getMockBuilder(PermissionCriterionResolver::class)
380
            ->setMethods($methods)
381
            ->setConstructorArgs(
382
                [
383
                    $this->getPermissionResolverMock(),
384
                    $this->getLimitationServiceMock(),
385
                ]
386
            )
387
            ->getMock();
388
    }
389
390
    protected $permissionResolverMock;
391
392 View Code Duplication
    protected function getPermissionResolverMock($methods = [])
393
    {
394
        // Tests first calls here with methods set before initiating PermissionCriterionResolver with same instance.
395
        if ($this->permissionResolverMock !== null) {
396
            return $this->permissionResolverMock;
397
        }
398
399
        return $this->permissionResolverMock = $this
400
            ->getMockBuilder(PermissionResolver::class)
401
            ->setMethods($methods)
402
            ->disableOriginalConstructor()
403
            ->getMockForAbstractClass();
404
    }
405
406
    protected $limitationServiceMock;
407
408 View Code Duplication
    protected function getLimitationServiceMock($methods = [])
409
    {
410
        // Tests first calls here with methods set before initiating PermissionCriterionResolver with same instance.
411
        if ($this->limitationServiceMock !== null) {
412
            return $this->limitationServiceMock;
413
        }
414
415
        return $this->limitationServiceMock = $this
416
            ->getMockBuilder(LimitationService::class)
417
            ->setMethods($methods)
418
            ->disableOriginalConstructor()
419
            ->getMock();
420
    }
421
}
422