Completed
Push — impl-EZP-26000-permission-look... ( 25d45c...ab7ef8 )
by
unknown
11:36
created

PermissionResolverTest   B

Complexity

Total Complexity 25

Size/Duplication

Total Lines 851
Duplicated Lines 57.46 %

Coupling/Cohesion

Components 1
Dependencies 16

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 489
loc 851
rs 8.4095
wmc 25
lcom 1
cbo 16

21 Methods

Rating   Name   Duplication   Size   Complexity  
B testGetCurrentUserReferenceReturnsAnonymousUserReference() 0 26 1
B testSetCurrentUserReference() 35 35 1
A testHasAccessWithAnonymousUserNo() 0 23 1
B testHasAccessForCurrentUserNo() 26 26 1
A testHasAccessWithAdministratorUser() 0 21 1
B testHasAccessForCurrentUserYes() 24 24 1
A testHasAccessLimited() 23 23 1
B testCanUserForAnonymousUserNo() 0 35 2
B testCanUserForAdministratorUser() 34 34 1
B testCanUserWithLimitationYes() 27 27 1
B testCanUserWithLimitationNo() 0 33 2
B testCanUserThrowsInvalidArgumentException() 27 27 1
A testCanUserWithTargetYes() 51 51 1
A testCanUserWithTargetNo() 48 48 2
A testCanUserWithMultipleTargetsYes() 52 52 1
A testCanUserWithMultipleTargetsNo() 49 49 2
B testCanUserWithTargetThrowsInvalidArgumentException() 35 35 1
A testCanUserThrowsBadStateException() 0 6 1
B testLookupAccessGranted() 29 29 1
B testLookupAccessLimited() 0 34 1
B testLookupAccessDenied() 29 29 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
/**
4
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
5
 * @license For full copyright and license information view LICENSE file distributed with this source code.
6
 */
7
namespace eZ\Publish\API\Repository\Tests;
8
9
use eZ\Publish\API\Repository\Values\User\Limitation\SectionLimitation;
10
use eZ\Publish\API\Repository\Values\User\Limitation\SubtreeLimitation;
11
use eZ\Publish\API\Repository\Values\User\PermissionInfo;
12
use eZ\Publish\Core\Repository\Values\User\UserReference;
13
14
/**
15
 *  Test case for operations in the PermissionResolver.
16
 *
17
 * @see \eZ\Publish\API\Repository\PermissionResolver
18
 * @group integration
19
 * @group permission
20
 */
21
class PermissionResolverTest extends BaseTest
22
{
23
    /**
24
     * Test for the getCurrentUser() method.
25
     *
26
     * @see \eZ\Publish\API\Repository\PermissionResolver::getCurrentUserReference()
27
     */
28
    public function testGetCurrentUserReferenceReturnsAnonymousUserReference()
29
    {
30
        $repository = $this->getRepository();
31
        $anonymousUserId = $this->generateId('user', 10);
32
        $repository->getPermissionResolver()->setCurrentUserReference(
33
            new UserReference($anonymousUserId)
34
        );
35
36
        /* BEGIN: Use Case */
37
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
38
        // Publish demo installation.
39
        // Only a UserReference has previously been set to the $repository
40
41
        $permissionResolver = $repository->getPermissionResolver();
42
        $anonymousUserReference = $permissionResolver->getCurrentUserReference();
43
        /* END: Use Case */
44
45
        $this->assertInstanceOf(
46
            'eZ\Publish\API\Repository\Values\User\UserReference',
47
            $anonymousUserReference
48
        );
49
        $this->assertEquals(
50
            $anonymousUserReference->getUserId(),
51
            $repository->getUserService()->loadUser($anonymousUserId)->id
52
        );
53
    }
54
55
    /**
56
     * Test for the setCurrentUser() method.
57
     *
58
     * @see \eZ\Publish\API\Repository\PermissionResolver::setCurrentUserReference()
59
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
60
     */
61 View Code Duplication
    public function testSetCurrentUserReference()
62
    {
63
        $repository = $this->getRepository();
64
        $repository->getPermissionResolver()->setCurrentUserReference(
65
            new UserReference(
66
                $this->generateId('user', 10)
67
            )
68
        );
69
70
        $administratorUserId = $this->generateId('user', 14);
71
72
        /* BEGIN: Use Case */
73
        // $administratorUserId contains the ID of the administrator user
74
75
        $permissionResolver = $repository->getPermissionResolver();
76
77
        $userService = $repository->getUserService();
78
79
        // Load administrator user
80
        $administratorUser = $userService->loadUser($administratorUserId);
81
82
        // Set administrator user as current user reference
83
        $permissionResolver->setCurrentUserReference($administratorUser);
84
        /* END: Use Case */
85
86
        $this->assertEquals(
87
            $administratorUserId,
88
            $permissionResolver->getCurrentUserReference()->getUserId()
89
        );
90
91
        $this->assertSame(
92
            $administratorUser,
93
            $permissionResolver->getCurrentUserReference()
94
        );
95
    }
96
97
    /**
98
     * Test for the hasAccess() method.
99
     *
100
     * @see \eZ\Publish\API\Repository\PermissionResolver::hasAccess()
101
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
102
     */
103
    public function testHasAccessWithAnonymousUserNo()
104
    {
105
        $repository = $this->getRepository();
106
107
        $anonymousUserId = $this->generateId('user', 10);
108
109
        /* BEGIN: Use Case */
110
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
111
        // Publish demo installation.
112
113
        $userService = $repository->getUserService();
114
        $permissionResolver = $repository->getPermissionResolver();
115
116
        // Load anonymous user
117
        $anonymousUser = $userService->loadUser($anonymousUserId);
118
119
        // This call will return false because anonymous user does not have access
120
        // to content removal
121
        $hasAccess = $permissionResolver->hasAccess('content', 'remove', $anonymousUser);
122
        /* END: Use Case */
123
124
        $this->assertFalse($hasAccess);
125
    }
126
127
    /**
128
     * Test for the hasAccess() method.
129
     *
130
     * @see \eZ\Publish\API\Repository\PermissionResolver::hasAccess()
131
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
132
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessWithAnonymousUserNo
133
     */
134 View Code Duplication
    public function testHasAccessForCurrentUserNo()
135
    {
136
        $repository = $this->getRepository();
137
138
        $anonymousUserId = $this->generateId('user', 10);
139
140
        /* BEGIN: Use Case */
141
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
142
        // Publish demo installation.
143
144
        $userService = $repository->getUserService();
145
        $permissionResolver = $repository->getPermissionResolver();
146
147
        // Load anonymous user
148
        $anonymousUser = $userService->loadUser($anonymousUserId);
149
150
        // Set anonymous user as current user reference
151
        $permissionResolver->setCurrentUserReference($anonymousUser);
152
153
        // This call will return false because anonymous user does not have access
154
        // to content removal
155
        $hasAccess = $permissionResolver->hasAccess('content', 'remove');
156
        /* END: Use Case */
157
158
        $this->assertFalse($hasAccess);
159
    }
160
161
    /**
162
     * Test for the hasAccess() method.
163
     *
164
     * @see \eZ\Publish\API\Repository\PermissionResolver::hasAccess()
165
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
166
     */
167
    public function testHasAccessWithAdministratorUser()
168
    {
169
        $repository = $this->getRepository();
170
171
        $administratorUserId = $this->generateId('user', 14);
172
173
        /* BEGIN: Use Case */
174
        // $administratorUserId contains the ID of the administrator user
175
176
        $userService = $repository->getUserService();
177
        $permissionResolver = $repository->getPermissionResolver();
178
179
        // Load administrator user
180
        $administratorUser = $userService->loadUser($administratorUserId);
181
182
        // This call will return true
183
        $hasAccess = $permissionResolver->hasAccess('content', 'read', $administratorUser);
184
        /* END: Use Case */
185
186
        $this->assertTrue($hasAccess);
187
    }
188
189
    /**
190
     * Test for the hasAccess() method.
191
     *
192
     * @see \eZ\Publish\API\Repository\PermissionResolver::hasAccess()
193
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
194
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testSetCurrentUserReference
195
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessWithAdministratorUser
196
     */
197 View Code Duplication
    public function testHasAccessForCurrentUserYes()
198
    {
199
        $repository = $this->getRepository();
200
201
        $administratorUserId = $this->generateId('user', 14);
202
203
        /* BEGIN: Use Case */
204
        // $administratorUserId contains the ID of the administrator user
205
206
        $userService = $repository->getUserService();
207
        $permissionResolver = $repository->getPermissionResolver();
208
209
        // Load administrator user
210
        $administratorUser = $userService->loadUser($administratorUserId);
211
212
        // Set administrator user as current user reference
213
        $permissionResolver->setCurrentUserReference($administratorUser);
214
215
        // This call will return true
216
        $hasAccess = $permissionResolver->hasAccess('content', 'read');
217
        /* END: Use Case */
218
219
        $this->assertTrue($hasAccess);
220
    }
221
222
    /**
223
     * Test for the hasAccess() method.
224
     *
225
     * @see \eZ\Publish\API\Repository\PermissionResolver::hasAccess()
226
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
227
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testSetCurrentUserReference
228
     */
229 View Code Duplication
    public function testHasAccessLimited()
230
    {
231
        $repository = $this->getRepository();
232
233
        /* BEGIN: Use Case */
234
        $user = $this->createUserVersion1();
235
236
        $permissionResolver = $repository->getPermissionResolver();
237
238
        // Set created user as current user reference
239
        $permissionResolver->setCurrentUserReference($user);
240
241
        // This call will return an array of permission sets describing user's access
242
        // to reading content
243
        $permissionSets = $permissionResolver->hasAccess('content', 'read');
244
        /* END: Use Case */
245
246
        $this->assertInternalType(
247
            'array',
248
            $permissionSets
249
        );
250
        $this->assertNotEmpty($permissionSets);
251
    }
252
253
    /**
254
     * Test for the canUser() method.
255
     *
256
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
257
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
258
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
259
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessForCurrentUserNo
260
     * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
261
     */
262
    public function testCanUserForAnonymousUserNo()
263
    {
264
        $repository = $this->getRepository();
265
266
        $homeId = $this->generateId('object', 57);
267
268
        $anonymousUserId = $this->generateId('user', 10);
269
        /* BEGIN: Use Case */
270
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
271
        // Publish demo installation.
272
        // $homeId contains the ID of the "Home" frontpage
273
274
        $contentService = $repository->getContentService();
275
        $userService = $repository->getUserService();
276
        $permissionResolver = $repository->getPermissionResolver();
277
278
        // Load anonymous user
279
        $anonymousUser = $userService->loadUser($anonymousUserId);
280
281
        // Set anonymous user as current user reference
282
        $permissionResolver->setCurrentUserReference($anonymousUser);
283
284
        // Load the ContentInfo for "Home" frontpage
285
        $contentInfo = $contentService->loadContentInfo($homeId);
286
287
        // This call will return false because anonymous user does not have access
288
        // to content removal and hence no permission to remove given content
289
        $canUser = $permissionResolver->canUser('content', 'remove', $contentInfo);
290
291
        // Performing an action without necessary permissions will fail with "UnauthorizedException"
292
        if (!$canUser) {
293
            $contentService->deleteContent($contentInfo);
294
        }
295
        /* END: Use Case */
296
    }
297
298
    /**
299
     * Test for the canUser() method.
300
     *
301
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
302
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
303
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
304
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessForCurrentUserYes
305
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
306
     */
307 View Code Duplication
    public function testCanUserForAdministratorUser()
308
    {
309
        $repository = $this->getRepository();
310
311
        $administratorUserId = $this->generateId('user', 14);
312
        $homeId = $this->generateId('object', 57);
313
314
        /* BEGIN: Use Case */
315
        // $administratorUserId contains the ID of the administrator user
316
        // $homeId contains the ID of the "Home" frontpage
317
318
        $contentService = $repository->getContentService();
319
        $userService = $repository->getUserService();
320
        $permissionResolver = $repository->getPermissionResolver();
321
322
        // Load administrator user
323
        $administratorUser = $userService->loadUser($administratorUserId);
324
325
        // Set administrator user as current user reference
326
        $permissionResolver->setCurrentUserReference($administratorUser);
327
328
        // Load the ContentInfo for "Home" frontpage
329
        $contentInfo = $contentService->loadContentInfo($homeId);
330
331
        // This call will return true
332
        $canUser = $permissionResolver->canUser('content', 'remove', $contentInfo);
333
334
        // Performing an action having necessary permissions will succeed
335
        $contentService->deleteContent($contentInfo);
336
        /* END: Use Case */
337
338
        $this->assertTrue($canUser);
339
        $contentService->loadContent($homeId);
340
    }
341
342
    /**
343
     * Test for the canUser() method.
344
     *
345
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
346
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
347
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
348
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
349
     */
350 View Code Duplication
    public function testCanUserWithLimitationYes()
351
    {
352
        $repository = $this->getRepository();
353
354
        $imagesFolderId = $this->generateId('object', 49);
355
356
        /* BEGIN: Use Case */
357
        // $imagesFolderId contains the ID of the "Images" folder
358
359
        $user = $this->createUserVersion1();
360
361
        $permissionResolver = $repository->getPermissionResolver();
362
363
        // Set created user as current user reference
364
        $permissionResolver->setCurrentUserReference($user);
365
366
        $contentService = $repository->getContentService();
367
368
        // Performing an action having necessary permissions will succeed
369
        $imagesFolder = $contentService->loadContent($imagesFolderId);
370
371
        // This call will return true
372
        $canUser = $permissionResolver->canUser('content', 'read', $imagesFolder);
373
        /* END: Use Case */
374
375
        $this->assertTrue($canUser);
376
    }
377
378
    /**
379
     * Test for the canUser() method.
380
     *
381
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
382
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
383
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
384
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
385
     * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
386
     */
387
    public function testCanUserWithLimitationNo()
388
    {
389
        $repository = $this->getRepository();
390
391
        $administratorUserId = $this->generateId('user', 14);
392
393
        /* BEGIN: Use Case */
394
        // $administratorUserId contains the ID of the administrator user
395
396
        $user = $this->createUserVersion1();
397
398
        $permissionResolver = $repository->getPermissionResolver();
399
400
        // Set created user as current user reference
401
        $permissionResolver->setCurrentUserReference($user);
402
403
        $userService = $repository->getUserService();
404
405
        // Load administrator user using UserService, this does not check for permissions
406
        $administratorUser = $userService->loadUser($administratorUserId);
407
408
        // This call will return false as user with Editor role does not have
409
        // permission to read "Users" subtree
410
        $canUser = $permissionResolver->canUser('content', 'read', $administratorUser);
411
412
        $contentService = $repository->getContentService();
413
414
        // Performing an action without necessary permissions will fail with "UnauthorizedException"
415
        if (!$canUser) {
416
            $content = $contentService->loadContent($administratorUserId);
0 ignored issues
show
Unused Code introduced by
$content 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...
417
        }
418
        /* END: Use Case */
419
    }
420
421
    /**
422
     * Test for the canUser() method.
423
     *
424
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
425
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
426
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
427
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testSetCurrentUserReference
428
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
429
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
430
     */
431 View Code Duplication
    public function testCanUserThrowsInvalidArgumentException()
432
    {
433
        $repository = $this->getRepository();
434
435
        $userGroupContentTypeId = $this->generateId('type', 3);
436
437
        /* BEGIN: Use Case */
438
        // $userGroupContentTypeId contains the ID of the "UserGroup" ContentType
439
440
        $user = $this->createUserVersion1();
441
442
        $permissionResolver = $repository->getPermissionResolver();
443
444
        // Set created user as current user reference
445
        $permissionResolver->setCurrentUserReference($user);
446
447
        $contentTypeService = $repository->getContentTypeService();
448
449
        // Load the "UserGroup" ContentType
450
        $userGroupContentType = $contentTypeService->loadContentType($userGroupContentTypeId);
451
452
        // This call will throw "InvalidArgumentException" because $userGroupContentType
453
        // is an instance of \eZ\Publish\API\Repository\Values\ContentType\ContentType,
454
        // which can not be checked for user access
455
        $canUser = $permissionResolver->canUser('content', 'create', $userGroupContentType);
0 ignored issues
show
Unused Code introduced by
$canUser 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...
456
        /* END: Use Case */
457
    }
458
459
    /**
460
     * Test for the canUser() method.
461
     *
462
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
463
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
464
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
465
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
466
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
467
     */
468 View Code Duplication
    public function testCanUserWithTargetYes()
469
    {
470
        $repository = $this->getRepository();
471
472
        $homeLocationId = $this->generateId('location', 2);
473
474
        /* BEGIN: Use Case */
475
        // $homeLocationId contains the ID of the "Home" location
476
477
        $user = $this->createUserVersion1();
478
479
        $permissionResolver = $repository->getPermissionResolver();
480
481
        // Set created user as current user reference
482
        $permissionResolver->setCurrentUserReference($user);
483
484
        $contentTypeService = $repository->getContentTypeService();
485
486
        $contentType = $contentTypeService->loadContentTypeByIdentifier('forums');
487
488
        $contentService = $repository->getContentService();
489
490
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, 'eng-US');
491
        $contentCreateStruct->setField('title', 'My awesome forums');
492
        $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789';
493
        $contentCreateStruct->alwaysAvailable = true;
494
495
        $locationService = $repository->getLocationService();
496
        $locationCreateStruct = $locationService->newLocationCreateStruct($homeLocationId);
497
498
        // This call will return true
499
        $canUser = $permissionResolver->canUser(
500
            'content',
501
            'create',
502
            $contentCreateStruct,
503
            [$locationCreateStruct]
504
        );
505
506
        // Performing an action having necessary permissions will succeed
507
        $contentDraft = $contentService->createContent(
508
            $contentCreateStruct,
509
            array($locationCreateStruct)
510
        );
511
        /* END: Use Case */
512
513
        $this->assertTrue($canUser);
514
        $this->assertEquals(
515
            'My awesome forums',
516
            $contentDraft->getFieldValue('title')->text
517
        );
518
    }
519
520
    /**
521
     * Test for the canUser() method.
522
     *
523
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
524
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
525
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
526
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
527
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
528
     * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
529
     */
530 View Code Duplication
    public function testCanUserWithTargetNo()
531
    {
532
        $repository = $this->getRepository();
533
534
        $homeLocationId = $this->generateId('location', 2);
535
536
        /* BEGIN: Use Case */
537
        // $homeLocationId contains the ID of the "Home" frontpage location
538
539
        $user = $this->createUserVersion1();
540
541
        $permissionResolver = $repository->getPermissionResolver();
542
543
        // Set created user as current user reference
544
        $permissionResolver->setCurrentUserReference($user);
545
546
        $contentTypeService = $repository->getContentTypeService();
547
548
        $contentType = $contentTypeService->loadContentTypeByIdentifier('forum');
549
550
        $contentService = $repository->getContentService();
551
552
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, 'eng-US');
553
        $contentCreateStruct->setField('name', 'My awesome forum');
554
        $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789';
555
        $contentCreateStruct->alwaysAvailable = true;
556
557
        $locationService = $repository->getLocationService();
558
        $locationCreateStruct = $locationService->newLocationCreateStruct($homeLocationId);
559
560
        // This call will return false because user with Editor role has permission to
561
        // create "forum" type content only under "folder" type content.
562
        $canUser = $permissionResolver->canUser(
563
            'content',
564
            'create',
565
            $contentCreateStruct,
566
            [$locationCreateStruct]
567
        );
568
569
        // Performing an action without necessary permissions will fail with "UnauthorizedException"
570
        if (!$canUser) {
571
            $contentDraft = $contentService->createContent(
0 ignored issues
show
Unused Code introduced by
$contentDraft 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...
572
                $contentCreateStruct,
573
                array($locationCreateStruct)
574
            );
575
        }
576
        /* END: Use Case */
577
    }
578
579
    /**
580
     * Test for the canUser() method.
581
     *
582
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
583
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
584
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
585
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
586
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
587
     */
588 View Code Duplication
    public function testCanUserWithMultipleTargetsYes()
589
    {
590
        $repository = $this->getRepository();
591
592
        $imagesLocationId = $this->generateId('location', 51);
593
        $filesLocationId = $this->generateId('location', 52);
594
595
        /* BEGIN: Use Case */
596
        // $imagesLocationId contains the ID of the "Images" location
597
        // $filesLocationId contains the ID of the "Files" location
598
599
        $user = $this->createUserVersion1();
600
601
        $permissionResolver = $repository->getPermissionResolver();
602
603
        // Set created user as current user reference
604
        $permissionResolver->setCurrentUserReference($user);
605
606
        $contentTypeService = $repository->getContentTypeService();
607
608
        $contentType = $contentTypeService->loadContentTypeByIdentifier('folder');
609
610
        $contentService = $repository->getContentService();
611
612
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, 'eng-US');
613
        $contentCreateStruct->setField('name', 'My multipurpose folder');
614
        $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789';
615
        $contentCreateStruct->alwaysAvailable = true;
616
617
        $locationService = $repository->getLocationService();
618
        $locationCreateStruct1 = $locationService->newLocationCreateStruct($imagesLocationId);
619
        $locationCreateStruct2 = $locationService->newLocationCreateStruct($filesLocationId);
620
        $locationCreateStructs = array($locationCreateStruct1, $locationCreateStruct2);
621
622
        // This call will return true
623
        $canUser = $permissionResolver->canUser(
624
            'content',
625
            'create',
626
            $contentCreateStruct,
627
            $locationCreateStructs
628
        );
629
630
        // Performing an action having necessary permissions will succeed
631
        $contentDraft = $contentService->createContent($contentCreateStruct, $locationCreateStructs);
632
        /* END: Use Case */
633
634
        $this->assertTrue($canUser);
635
        $this->assertEquals(
636
            'My multipurpose folder',
637
            $contentDraft->getFieldValue('name')->text
638
        );
639
    }
640
641
    /**
642
     * Test for the canUser() method.
643
     *
644
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
645
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
646
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
647
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
648
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
649
     * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
650
     */
651 View Code Duplication
    public function testCanUserWithMultipleTargetsNo()
652
    {
653
        $repository = $this->getRepository();
654
655
        $homeLocationId = $this->generateId('location', 2);
656
        $administratorUsersLocationId = $this->generateId('location', 13);
657
658
        /* BEGIN: Use Case */
659
        // $homeLocationId contains the ID of the "Home" location
660
        // $administratorUsersLocationId contains the ID of the "Administrator users" location
661
662
        $user = $this->createUserVersion1();
663
664
        $permissionResolver = $repository->getPermissionResolver();
665
666
        // Set created user as current user reference
667
        $permissionResolver->setCurrentUserReference($user);
668
669
        $contentTypeService = $repository->getContentTypeService();
670
671
        $contentType = $contentTypeService->loadContentTypeByIdentifier('forums');
672
673
        $contentService = $repository->getContentService();
674
675
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, 'eng-US');
676
        $contentCreateStruct->setField('name', 'My awesome forums');
677
        $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789';
678
        $contentCreateStruct->alwaysAvailable = true;
679
680
        $locationService = $repository->getLocationService();
681
        $locationCreateStruct1 = $locationService->newLocationCreateStruct($homeLocationId);
682
        $locationCreateStruct2 = $locationService->newLocationCreateStruct($administratorUsersLocationId);
683
        $locationCreateStructs = array($locationCreateStruct1, $locationCreateStruct2);
684
685
        // This call will return false because user with Editor role does not have permission to
686
        // create content in the "Administrator users" location subtree
687
        $canUser = $permissionResolver->canUser(
688
            'content',
689
            'create',
690
            $contentCreateStruct,
691
            $locationCreateStructs
692
        );
693
694
        // Performing an action without necessary permissions will fail with "UnauthorizedException"
695
        if (!$canUser) {
696
            $contentDraft = $contentService->createContent($contentCreateStruct, $locationCreateStructs);
0 ignored issues
show
Unused Code introduced by
$contentDraft 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...
697
        }
698
        /* END: Use Case */
699
    }
700
701
    /**
702
     * Test for the canUser() method.
703
     *
704
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
705
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
706
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
707
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
708
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetURLAliasService
709
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testSetCurrentUserReference
710
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
711
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
712
     */
713 View Code Duplication
    public function testCanUserWithTargetThrowsInvalidArgumentException()
714
    {
715
        $repository = $this->getRepository();
716
717
        /* BEGIN: Use Case */
718
        $user = $this->createUserVersion1();
719
720
        $permissionResolver = $repository->getPermissionResolver();
721
722
        // Set created user as current user reference
723
        $permissionResolver->setCurrentUserReference($user);
724
725
        $contentTypeService = $repository->getContentTypeService();
726
727
        $contentType = $contentTypeService->loadContentTypeByIdentifier('forum');
728
729
        $contentService = $repository->getContentService();
730
731
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, 'eng-US');
732
        $contentCreateStruct->setField('name', 'My awesome forum');
733
        $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789';
734
        $contentCreateStruct->alwaysAvailable = true;
735
736
        $urlAliasService = $repository->getURLAliasService();
737
        $rootUrlAlias = $urlAliasService->lookup('/');
738
739
        // This call will throw "InvalidArgumentException" because $rootAlias is not a valid target object
740
        $canUser = $permissionResolver->canUser(
0 ignored issues
show
Unused Code introduced by
$canUser 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...
741
            'content',
742
            'create',
743
            $contentCreateStruct,
744
            [$rootUrlAlias]
745
        );
746
        /* END: Use Case */
747
    }
748
749
    /**
750
     * Test for the canUser() method.
751
     *
752
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
753
     * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException
754
     */
755
    public function testCanUserThrowsBadStateException()
756
    {
757
        $this->markTestIncomplete(
758
            'Cannot be tested on current fixture since policy with unsupported limitation value is not available.'
759
        );
760
    }
761
762
    /**
763
     * Test for the lookup() method.
764
     *
765
     * @see \eZ\Publish\API\Repository\PermissionResolver::lookup()
766
     */
767 View Code Duplication
    public function testLookupAccessGranted()
768
    {
769
        $repository = $this->getRepository();
770
771
        /* BEGIN: Use Case */
772
        $user = $this->createUserVersion1();
773
774
        $permissionResolver = $repository->getPermissionResolver();
775
776
        // Set created user as current user reference
777
        $permissionResolver->setCurrentUserReference($user);
778
779
        $permissionInfo = $permissionResolver->lookup(
780
            'content',
781
            'read',
782
            [
783
                new SectionLimitation(['limitationValues' => [1]]),
784
                new SubtreeLimitation(['limitationValues' => ['/1/2/']]),
785
            ]
786
        );
787
        /* END: Use Case */
788
789
        $this->assertInstanceOf(
790
            'eZ\Publish\API\Repository\Values\User\PermissionInfo',
791
            $permissionInfo
792
        );
793
        $this->assertEquals(PermissionInfo::ACCESS_GRANTED, $permissionInfo->access);
794
        $this->assertEmpty($permissionInfo->limitationSets);
795
    }
796
797
    /**
798
     * Test for the lookup() method.
799
     *
800
     * @see \eZ\Publish\API\Repository\PermissionResolver::lookup()
801
     */
802
    public function testLookupAccessLimited()
803
    {
804
        $repository = $this->getRepository();
805
806
        /* BEGIN: Use Case */
807
        $user = $this->createUserVersion1();
808
809
        $permissionResolver = $repository->getPermissionResolver();
810
811
        // Set created user as current user reference
812
        $permissionResolver->setCurrentUserReference($user);
813
814
        $permissionInfo = $permissionResolver->lookup(
815
            'content',
816
            'read',
817
            [
818
                new SubtreeLimitation(['limitationValues' => ['/1/2/']]),
819
            ]
820
        );
821
        /* END: Use Case */
822
823
        $this->assertInstanceOf(
824
            'eZ\Publish\API\Repository\Values\User\PermissionInfo',
825
            $permissionInfo
826
        );
827
        $this->assertEquals(PermissionInfo::ACCESS_LIMITED, $permissionInfo->access);
828
        $this->assertCount(1, $permissionInfo->limitationSets);
829
        $this->assertCount(1, $permissionInfo->limitationSets[0]);
830
        $this->assertInstanceOf(
831
            'eZ\Publish\API\Repository\Values\User\Limitation\SectionLimitation',
832
            $permissionInfo->limitationSets[0][0]
833
        );
834
        $this->assertEquals([1, 6, 3], $permissionInfo->limitationSets[0][0]->limitationValues);
835
    }
836
837
    /**
838
     * Test for the lookup() method.
839
     *
840
     * @see \eZ\Publish\API\Repository\PermissionResolver::lookup()
841
     */
842 View Code Duplication
    public function testLookupAccessDenied()
843
    {
844
        $repository = $this->getRepository();
845
846
        /* BEGIN: Use Case */
847
        $user = $this->createUserVersion1();
848
849
        $permissionResolver = $repository->getPermissionResolver();
850
851
        // Set created user as current user reference
852
        $permissionResolver->setCurrentUserReference($user);
853
854
        $permissionInfo = $permissionResolver->lookup(
855
            'content',
856
            'read',
857
            [
858
                new SectionLimitation(['limitationValues' => [1]]),
859
                new SubtreeLimitation(['limitationValues' => ['/1/5/']]),
860
            ]
861
        );
862
        /* END: Use Case */
863
864
        $this->assertInstanceOf(
865
            'eZ\Publish\API\Repository\Values\User\PermissionInfo',
866
            $permissionInfo
867
        );
868
        $this->assertEquals(PermissionInfo::ACCESS_DENIED, $permissionInfo->access);
869
        $this->assertEmpty($permissionInfo->limitationSets);
870
    }
871
}
872