Completed
Push — ezp_30812 ( 78f0de...aab94f )
by
unknown
21:13 queued 05:34
created

testLoadUserGroupWithNoAccessToParent()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 29
rs 9.456
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * File containing the UserServiceTest 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\API\Repository\Tests;
10
11
use DateTime;
12
use eZ\Publish\API\Repository\Exceptions\InvalidArgumentException;
13
use eZ\Publish\API\Repository\Exceptions\NotFoundException;
14
use eZ\Publish\API\Repository\Values\Content\ContentInfo;
15
use eZ\Publish\API\Repository\Values\Content\VersionInfo as APIVersionInfo;
16
use eZ\Publish\API\Repository\Values\ContentType\ContentType;
17
use eZ\Publish\API\Repository\Values\User\Limitation\SubtreeLimitation;
18
use eZ\Publish\API\Repository\Values\User\PasswordValidationContext;
19
use eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct;
20
use eZ\Publish\API\Repository\Values\User\UserTokenUpdateStruct;
21
use eZ\Publish\API\Repository\Values\User\UserUpdateStruct;
22
use eZ\Publish\API\Repository\Values\User\User;
23
use eZ\Publish\Core\FieldType\ValidationError;
24
use eZ\Publish\Core\Repository\Values\Content\Content;
25
use eZ\Publish\Core\Repository\Values\Content\VersionInfo;
26
use eZ\Publish\Core\Repository\Values\User\UserGroup;
27
use Exception;
28
use ReflectionClass;
29
30
/**
31
 * Test case for operations in the UserService using in memory storage.
32
 *
33
 * @see eZ\Publish\API\Repository\UserService
34
 * @group integration
35
 * @group user
36
 */
37
class UserServiceTest extends BaseTest
38
{
39
    /**
40
     * Test for the loadUserGroup() method.
41
     *
42
     * @see \eZ\Publish\API\Repository\UserService::loadUserGroup()
43
     */
44
    public function testLoadUserGroup()
45
    {
46
        $repository = $this->getRepository();
47
48
        $mainGroupId = $this->generateId('group', 4);
49
        /* BEGIN: Use Case */
50
        // $mainGroupId is the ID of the main "Users" group
51
52
        $userService = $repository->getUserService();
53
54
        $userGroup = $userService->loadUserGroup($mainGroupId);
55
        /* END: Use Case */
56
57
        $this->assertInstanceOf(UserGroup::class, $userGroup);
58
59
        // User group happens to also be a Content; isUserGroup() should be true and isUser() should be false
60
        $this->assertTrue($userService->isUserGroup($userGroup), 'isUserGroup() => false on a user group');
61
        $this->assertFalse($userService->isUser($userGroup), 'isUser() => true on a user group');
62
        $this->assertSame(0, $userGroup->parentId, 'parentId should be equal `0` because it is top level node');
63
    }
64
65
    /**
66
     * Test for the loadUserGroup() method to ensure that DomainUserGroupObject is created properly even if a user
67
     * has no access to parent of UserGroup.
68
     *
69
     * @see \eZ\Publish\API\Repository\UserService::loadUserGroup()
70
     */
71
    public function testLoadUserGroupWithNoAccessToParent()
72
    {
73
        $repository = $this->getRepository();
74
75
        $mainGroupId = $this->generateId('group', 4);
76
        /* BEGIN: Use Case */
77
        // $mainGroupId is the ID of the main "Users" group
78
79
        $userService = $repository->getUserService();
80
81
        $user = $this->createUserWithPolicies(
82
            'user',
83
            [
84
                ['module' => 'content', 'function' => 'read'],
85
            ],
86
            new SubtreeLimitation(['limitationValues' => ['/1/5']])
87
        );
88
        $repository->getPermissionResolver()->setCurrentUserReference($user);
89
90
        $userGroup = $userService->loadUserGroup($mainGroupId);
91
        /* END: Use Case */
92
93
        $this->assertInstanceOf(UserGroup::class, $userGroup);
94
95
        // User group happens to also be a Content; isUserGroup() should be true and isUser() should be false
96
        $this->assertTrue($userService->isUserGroup($userGroup), 'isUserGroup() => false on a user group');
97
        $this->assertFalse($userService->isUser($userGroup), 'isUser() => true on a user group');
98
        $this->assertSame(0, $userGroup->parentId, 'parentId should be equal `0` because it is top level node');
99
    }
100
101
    /**
102
     * Test for the loadUserGroup() method.
103
     *
104
     * @see \eZ\Publish\API\Repository\UserService::loadUserGroup()
105
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
106
     */
107 View Code Duplication
    public function testLoadUserGroupThrowsNotFoundException()
108
    {
109
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
110
111
        $repository = $this->getRepository();
112
113
        $nonExistingGroupId = $this->generateId('group', self::DB_INT_MAX);
114
        /* BEGIN: Use Case */
115
        $userService = $repository->getUserService();
116
117
        // This call will fail with a NotFoundException
118
        $userService->loadUserGroup($nonExistingGroupId);
119
        /* END: Use Case */
120
    }
121
122
    /**
123
     * Test for the loadSubUserGroups() method.
124
     *
125
     * @see \eZ\Publish\API\Repository\UserService::loadSubUserGroups()
126
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
127
     */
128
    public function testLoadSubUserGroups()
129
    {
130
        $repository = $this->getRepository();
131
132
        $mainGroupId = $this->generateId('group', 4);
133
        /* BEGIN: Use Case */
134
        // $mainGroupId is the ID of the main "Users" group
135
136
        $userService = $repository->getUserService();
137
138
        $userGroup = $userService->loadUserGroup($mainGroupId);
139
140
        $subUserGroups = $userService->loadSubUserGroups($userGroup);
141
        foreach ($subUserGroups as $subUserGroup) {
142
            // Do something with the $subUserGroup
143
            $this->assertInstanceOf(UserGroup::class, $subUserGroup);
144
        }
145
        /* END: Use Case */
146
    }
147
148
    /**
149
     * Test loading sub groups throwing NotFoundException.
150
     *
151
     * @covers \eZ\Publish\API\Repository\UserService::loadSubUserGroups
152
     */
153 View Code Duplication
    public function testLoadSubUserGroupsThrowsNotFoundException()
154
    {
155
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
156
157
        $repository = $this->getRepository();
158
        $userService = $repository->getUserService();
159
160
        $parentGroup = new UserGroup(
161
            [
162
                'content' => new Content(
163
                    [
164
                        'versionInfo' => new VersionInfo(
165
                            [
166
                                'contentInfo' => new ContentInfo(
167
                                ['id' => 123456]
168
                            ),
169
                            ]
170
                        ),
171
                        'internalFields' => [],
172
                    ]
173
                ),
174
            ]
175
        );
176
        $userService->loadSubUserGroups($parentGroup);
177
    }
178
179
    /**
180
     * Test for the newUserGroupCreateStruct() method.
181
     *
182
     * @return \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct
183
     *
184
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
185
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
186
     */
187
    public function testNewUserGroupCreateStruct()
188
    {
189
        $repository = $this->getRepository();
190
191
        /* BEGIN: Use Case */
192
        $userService = $repository->getUserService();
193
194
        $groupCreate = $userService->newUserGroupCreateStruct('eng-US');
195
        /* END: Use Case */
196
197
        $this->assertInstanceOf(
198
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroupCreateStruct',
199
            $groupCreate
200
        );
201
202
        return $groupCreate;
203
    }
204
205
    /**
206
     * Test for the newUserGroupCreateStruct() method.
207
     *
208
     * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $groupCreate
209
     *
210
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
211
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
212
     */
213
    public function testNewUserGroupCreateStructSetsMainLanguageCode($groupCreate)
214
    {
215
        $this->assertEquals('eng-US', $groupCreate->mainLanguageCode);
216
    }
217
218
    /**
219
     * Test for the newUserGroupCreateStruct() method.
220
     *
221
     * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $groupCreate
222
     *
223
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
224
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
225
     */
226
    public function testNewUserGroupCreateStructSetsContentType($groupCreate)
227
    {
228
        $this->assertInstanceOf(
229
            '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType',
230
            $groupCreate->contentType
231
        );
232
    }
233
234
    /**
235
     * Test for the newUserGroupCreateStruct() method.
236
     *
237
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct($mainLanguageCode, $contentType)
238
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
239
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
240
     */
241 View Code Duplication
    public function testNewUserGroupCreateStructWithSecondParameter()
242
    {
243
        if ($this->isVersion4()) {
244
            $this->markTestSkipped('This test is only relevant for eZ Publish versions > 4');
245
        }
246
247
        $repository = $this->getRepository();
248
249
        /* BEGIN: Use Case */
250
        $contentTypeService = $repository->getContentTypeService();
251
        $userService = $repository->getUserService();
252
253
        // Load the default ContentType for user groups
254
        $groupType = $contentTypeService->loadContentTypeByIdentifier('user_group');
255
256
        // Instantiate a new group create struct
257
        $groupCreate = $userService->newUserGroupCreateStruct(
258
            'eng-US',
259
            $groupType
260
        );
261
        /* END: Use Case */
262
263
        $this->assertSame($groupType, $groupCreate->contentType);
264
    }
265
266
    /**
267
     * Test for the createUserGroup() method.
268
     *
269
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
270
     *
271
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
272
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
273
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
274
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
275
     */
276
    public function testCreateUserGroup()
277
    {
278
        /* BEGIN: Use Case */
279
        $userGroup = $this->createUserGroupVersion1();
280
        /* END: Use Case */
281
282
        $this->assertInstanceOf(
283
            UserGroup::class,
284
            $userGroup
285
        );
286
287
        $versionInfo = $userGroup->getVersionInfo();
288
289
        $this->assertEquals(APIVersionInfo::STATUS_PUBLISHED, $versionInfo->status);
290
        $this->assertEquals(1, $versionInfo->versionNo);
291
292
        return $userGroup;
293
    }
294
295
    /**
296
     * Test for the createUserGroup() method.
297
     *
298
     * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup
299
     *
300
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
301
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
302
     */
303
    public function testCreateUserGroupSetsExpectedProperties($userGroup)
304
    {
305
        $this->assertEquals(
306
            [
307
                'parentId' => $this->generateId('group', 4),
308
            ],
309
            [
310
                'parentId' => $userGroup->parentId,
311
            ]
312
        );
313
    }
314
315
    /**
316
     * Test for the createUserGroup() method.
317
     *
318
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
319
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
320
     */
321 View Code Duplication
    public function testCreateUserGroupThrowsInvalidArgumentException()
322
    {
323
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\InvalidArgumentException::class);
324
325
        $repository = $this->getRepository();
326
327
        $mainGroupId = $this->generateId('group', 4);
328
        /* BEGIN: Use Case */
329
        // $mainGroupId is the ID of the main "Users" group
330
331
        $userService = $repository->getUserService();
332
333
        // Load main group
334
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
335
336
        // Instantiate a new create struct
337
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
338
        $userGroupCreate->setField('name', 'Example Group');
339
        $userGroupCreate->remoteId = '5f7f0bdb3381d6a461d8c29ff53d908f';
340
341
        // This call will fail with an "InvalidArgumentException", because the
342
        // specified remoteId is already used for the "Members" user group.
343
        $userService->createUserGroup(
344
            $userGroupCreate,
345
            $parentUserGroup
346
        );
347
        /* END: Use Case */
348
    }
349
350
    /**
351
     * Test for the createUserGroup() method.
352
     *
353
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
354
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
355
     */
356
    public function testCreateUserGroupThrowsInvalidArgumentExceptionFieldTypeNotAccept()
357
    {
358
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\InvalidArgumentException::class);
359
360
        $repository = $this->getRepository();
361
362
        $mainGroupId = $this->generateId('group', 4);
363
        /* BEGIN: Use Case */
364
        // $mainGroupId is the ID of the main "Users" group
365
366
        $userService = $repository->getUserService();
367
368
        // Load main group
369
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
370
371
        // Instantiate a new create struct
372
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
373
        $userGroupCreate->setField('name', new \stdClass());
374
375
        // This call will fail with an "InvalidArgumentException", because the
376
        // specified remoteId is already used for the "Members" user group.
377
        $userService->createUserGroup(
378
            $userGroupCreate,
379
            $parentUserGroup
380
        );
381
        /* END: Use Case */
382
    }
383
384
    /**
385
     * Test for the createUserGroup() method.
386
     *
387
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
388
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
389
     */
390
    public function testCreateUserGroupWhenMissingField()
391
    {
392
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException::class);
393
394
        $repository = $this->getRepository();
395
396
        $mainGroupId = $this->generateId('group', 4);
397
        /* BEGIN: Use Case */
398
        // $mainGroupId is the ID of the main "Users" group
399
400
        $userService = $repository->getUserService();
401
402
        // Load main group
403
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
404
405
        // Instantiate a new create struct
406
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
407
408
        // This call will fail with a "ContentFieldValidationException", because the
409
        // only mandatory field "name" is not set.
410
        $userService->createUserGroup($userGroupCreate, $parentUserGroup);
411
        /* END: Use Case */
412
    }
413
414
    /**
415
     * Test for the createUserGroup() method.
416
     *
417
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
418
     *
419
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
420
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
421
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
422
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
423
     */
424
    public function testCreateUserGroupInTransactionWithRollback()
425
    {
426
        $repository = $this->getRepository();
427
428
        $mainGroupId = $this->generateId('group', 4);
429
        /* BEGIN: Use Case */
430
        // $mainGroupId is the ID of the main "Users" group
431
432
        $userService = $repository->getUserService();
433
434
        $repository->beginTransaction();
435
436
        try {
437
            // Load main group
438
            $parentUserGroup = $userService->loadUserGroup($mainGroupId);
439
440
            // Instantiate a new create struct
441
            $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
442
            $userGroupCreate->setField('name', 'Example Group');
443
444
            // Create the new user group
445
            $createdUserGroupId = $userService->createUserGroup(
446
                $userGroupCreate,
447
                $parentUserGroup
448
            )->id;
449
        } catch (Exception $e) {
450
            // Cleanup hanging transaction on error
451
            $repository->rollback();
452
            throw $e;
453
        }
454
455
        $repository->rollback();
456
457
        try {
458
            // Throws exception since creation of user group was rolled back
459
            $loadedGroup = $userService->loadUserGroup($createdUserGroupId);
0 ignored issues
show
Unused Code introduced by
$loadedGroup 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...
460
        } catch (NotFoundException $e) {
461
            return;
462
        }
463
        /* END: Use Case */
464
465
        $this->fail('User group object still exists after rollback.');
466
    }
467
468
    /**
469
     * Test for the deleteUserGroup() method.
470
     *
471
     * @see \eZ\Publish\API\Repository\UserService::deleteUserGroup()
472
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
473
     */
474 View Code Duplication
    public function testDeleteUserGroup()
475
    {
476
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
477
478
        $repository = $this->getRepository();
479
        $userService = $repository->getUserService();
480
481
        /* BEGIN: Use Case */
482
        $userGroup = $this->createUserGroupVersion1();
483
484
        // Delete the currently created user group again
485
        $userService->deleteUserGroup($userGroup);
486
        /* END: Use Case */
487
488
        // We use the NotFoundException here for verification
489
        $userService->loadUserGroup($userGroup->id);
490
    }
491
492
    /**
493
     * Test deleting user group throwing NotFoundException.
494
     *
495
     * @covers \eZ\Publish\API\Repository\UserService::deleteUserGroup
496
     */
497 View Code Duplication
    public function testDeleteUserGroupThrowsNotFoundException()
498
    {
499
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
500
501
        $repository = $this->getRepository();
502
        $userService = $repository->getUserService();
503
504
        $userGroup = new UserGroup(
505
            [
506
                'content' => new Content(
507
                    [
508
                        'versionInfo' => new VersionInfo(
509
                            ['contentInfo' => new ContentInfo(['id' => 123456])]
510
                        ),
511
                        'internalFields' => [],
512
                    ]
513
                ),
514
            ]
515
        );
516
        $userService->deleteUserGroup($userGroup);
517
    }
518
519
    /**
520
     * Test for the moveUserGroup() method.
521
     *
522
     * @see \eZ\Publish\API\Repository\UserService::moveUserGroup()
523
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
524
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadSubUserGroups
525
     */
526
    public function testMoveUserGroup()
527
    {
528
        $repository = $this->getRepository();
529
        $userService = $repository->getUserService();
530
531
        $membersGroupId = $this->generateId('group', 13);
532
        /* BEGIN: Use Case */
533
        // $membersGroupId is the ID of the "Members" user group in an eZ
534
        // Publish demo installation
535
536
        $userGroup = $this->createUserGroupVersion1();
537
538
        // Load the new parent group
539
        $membersUserGroup = $userService->loadUserGroup($membersGroupId);
540
541
        // Move user group from "Users" to "Members"
542
        $userService->moveUserGroup($userGroup, $membersUserGroup);
543
544
        // Reload the user group to get an updated $parentId
545
        $userGroup = $userService->loadUserGroup($userGroup->id);
546
547
        $this->refreshSearch($repository);
548
549
        // The returned array will no contain $userGroup
550
        $subUserGroups = $userService->loadSubUserGroups(
551
            $membersUserGroup
552
        );
553
        /* END: Use Case */
554
555
        $subUserGroupIds = array_map(
556
            function ($content) {
557
                return $content->id;
558
            },
559
            $subUserGroups
560
        );
561
562
        $this->assertEquals($membersGroupId, $userGroup->parentId);
563
        $this->assertEquals([$userGroup->id], $subUserGroupIds);
564
    }
565
566
    /**
567
     * Test moving a user group below another group throws NotFoundException.
568
     *
569
     * @covers \eZ\Publish\API\Repository\UserService::moveUserGroup
570
     */
571
    public function testMoveUserGroupThrowsNotFoundException()
572
    {
573
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
574
575
        $repository = $this->getRepository();
576
        $userService = $repository->getUserService();
577
578
        $userGroupToMove = new UserGroup(
579
            [
580
                'content' => new Content(
581
                    [
582
                        'versionInfo' => new VersionInfo(
583
                            ['contentInfo' => new ContentInfo(['id' => 123456])]
584
                        ),
585
                        'internalFields' => [],
586
                    ]
587
                ),
588
            ]
589
        );
590
        $parentUserGroup = new UserGroup(
591
            [
592
                'content' => new Content(
593
                    [
594
                        'versionInfo' => new VersionInfo(
595
                            ['contentInfo' => new ContentInfo(['id' => 123455])]
596
                        ),
597
                        'internalFields' => [],
598
                    ]
599
                ),
600
            ]
601
        );
602
        $userService->moveUserGroup($userGroupToMove, $parentUserGroup);
603
    }
604
605
    /**
606
     * Test for the newUserGroupUpdateStruct() method.
607
     *
608
     * @covers \eZ\Publish\API\Repository\UserService::newUserGroupUpdateStruct
609
     */
610
    public function testNewUserGroupUpdateStruct()
611
    {
612
        $repository = $this->getRepository();
613
614
        /* BEGIN: Use Case */
615
        $userService = $repository->getUserService();
616
617
        $groupUpdate = $userService->newUserGroupUpdateStruct();
618
        /* END: Use Case */
619
620
        $this->assertInstanceOf(
621
            UserGroupUpdateStruct::class,
622
            $groupUpdate
623
        );
624
625
        $this->assertNull($groupUpdate->contentUpdateStruct);
626
        $this->assertNull($groupUpdate->contentMetadataUpdateStruct);
627
    }
628
629
    /**
630
     * Test for the updateUserGroup() method.
631
     *
632
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
633
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
634
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupUpdateStruct
635
     */
636
    public function testUpdateUserGroup()
637
    {
638
        $repository = $this->getRepository();
639
        $userService = $repository->getUserService();
640
641
        /* BEGIN: Use Case */
642
        $userGroup = $this->createUserGroupVersion1();
643
644
        // Create a group update struct and change nothing
645
        $groupUpdate = $userService->newUserGroupUpdateStruct();
646
647
        // This update will do nothing
648
        $userGroup = $userService->updateUserGroup(
649
            $userGroup,
650
            $groupUpdate
651
        );
652
        /* END: Use Case */
653
654
        $this->assertInstanceOf(
655
            UserGroup::class,
656
            $userGroup
657
        );
658
659
        $this->assertEquals(1, $userGroup->getVersionInfo()->versionNo);
660
    }
661
662
    /**
663
     * Test for the updateUserGroup() method.
664
     *
665
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
666
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
667
     */
668 View Code Duplication
    public function testUpdateUserGroupWithSubContentUpdateStruct()
669
    {
670
        $repository = $this->getRepository();
671
        $userService = $repository->getUserService();
672
673
        /* BEGIN: Use Case */
674
        $userGroup = $this->createUserGroupVersion1();
675
676
        // Load the content service
677
        $contentService = $repository->getContentService();
678
679
        // Create a content update struct and update the group name
680
        $contentUpdate = $contentService->newContentUpdateStruct();
681
        $contentUpdate->setField('name', 'Sindelfingen', 'eng-US');
682
683
        // Create a group update struct and set content update struct
684
        $groupUpdate = $userService->newUserGroupUpdateStruct();
685
        $groupUpdate->contentUpdateStruct = $contentUpdate;
686
687
        // This will update the name and the increment the group version number
688
        $userGroup = $userService->updateUserGroup(
689
            $userGroup,
690
            $groupUpdate
691
        );
692
        /* END: Use Case */
693
694
        $this->assertEquals('Sindelfingen', $userGroup->getFieldValue('name', 'eng-US'));
695
696
        $versionInfo = $userGroup->getVersionInfo();
697
698
        $this->assertEquals(APIVersionInfo::STATUS_PUBLISHED, $versionInfo->status);
699
        $this->assertEquals(2, $versionInfo->versionNo);
700
    }
701
702
    /**
703
     * Test for the updateUserGroup() method.
704
     *
705
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
706
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
707
     */
708
    public function testUpdateUserGroupWithSubContentMetadataUpdateStruct()
709
    {
710
        $repository = $this->getRepository();
711
        $userService = $repository->getUserService();
712
713
        /* BEGIN: Use Case */
714
        $userGroup = $this->createUserGroupVersion1();
715
716
        // Load the content service
717
        $contentService = $repository->getContentService();
718
719
        // Create a metadata update struct and change the remoteId
720
        $metadataUpdate = $contentService->newContentMetadataUpdateStruct();
721
        $metadataUpdate->remoteId = '3c61299780663bafa3af2101e52125da';
722
723
        // Create a group update struct and set content update struct
724
        $groupUpdate = $userService->newUserGroupUpdateStruct();
725
        $groupUpdate->contentMetadataUpdateStruct = $metadataUpdate;
726
727
        // This will update the name and the increment the group version number
728
        $userGroup = $userService->updateUserGroup(
729
            $userGroup,
730
            $groupUpdate
731
        );
732
        /* END: Use Case */
733
734
        $this->assertEquals(
735
            '3c61299780663bafa3af2101e52125da',
736
            $userGroup->contentInfo->remoteId
737
        );
738
739
        $versionInfo = $userGroup->getVersionInfo();
740
741
        $this->assertEquals(APIVersionInfo::STATUS_PUBLISHED, $versionInfo->status);
742
        $this->assertEquals(1, $versionInfo->versionNo);
743
    }
744
745
    /**
746
     * Test for the updateUserGroup() method.
747
     *
748
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
749
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
750
     */
751 View Code Duplication
    public function testUpdateUserGroupThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
752
    {
753
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\InvalidArgumentException::class);
754
755
        $repository = $this->getRepository();
756
        $userService = $repository->getUserService();
757
758
        /* BEGIN: Use Case */
759
        $userGroup = $this->createUserGroupVersion1();
760
761
        // Load the content service
762
        $contentService = $repository->getContentService();
763
764
        // Create a content update struct and update the group name
765
        $contentUpdate = $contentService->newContentUpdateStruct();
766
        // An object of stdClass is not accepted as a value by the field "name"
767
        $contentUpdate->setField('name', new \stdClass(), 'eng-US');
768
769
        // Create a group update struct and set content update struct
770
        $groupUpdate = $userService->newUserGroupUpdateStruct();
771
        $groupUpdate->contentUpdateStruct = $contentUpdate;
772
773
        // This call will fail with an InvalidArgumentException, because the
774
        // field "name" does not accept the given value
775
        $userService->updateUserGroup($userGroup, $groupUpdate);
776
        /* END: Use Case */
777
    }
778
779
    /**
780
     * Test for the newUserCreateStruct() method.
781
     *
782
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct()
783
     */
784
    public function testNewUserCreateStruct()
785
    {
786
        $repository = $this->getRepository();
787
788
        /* BEGIN: Use Case */
789
        $userService = $repository->getUserService();
790
791
        $userCreate = $userService->newUserCreateStruct(
792
            'user',
793
            '[email protected]',
794
            'secret',
795
            'eng-US'
796
        );
797
        /* END: Use Case */
798
799
        $this->assertInstanceOf(
800
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserCreateStruct',
801
            $userCreate
802
        );
803
804
        return $userCreate;
805
    }
806
807
    /**
808
     * Test updating a user group throws ContentFieldValidationException.
809
     *
810
     * @covers \eZ\Publish\API\Repository\UserService::updateUserGroup
811
     */
812
    public function testUpdateUserGroupThrowsContentFieldValidationExceptionOnRequiredFieldEmpty()
813
    {
814
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException::class);
815
816
        $repository = $this->getRepository();
817
        $userService = $repository->getUserService();
818
        $contentService = $repository->getContentService();
819
820
        $userGroup = $userService->loadUserGroup(42);
821
        $userGroupUpdateStruct = $userService->newUserGroupUpdateStruct();
822
        $userGroupUpdateStruct->contentUpdateStruct = $contentService->newContentUpdateStruct();
823
        $userGroupUpdateStruct->contentUpdateStruct->setField('name', '', 'eng-US');
824
825
        $userService->updateUserGroup($userGroup, $userGroupUpdateStruct);
826
    }
827
828
    /**
829
     * Test for the newUserCreateStruct() method.
830
     *
831
     * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreate
832
     *
833
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct()
834
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
835
     */
836
    public function testNewUserCreateStructSetsExpectedProperties($userCreate)
837
    {
838
        $this->assertEquals(
839
            [
840
                'login' => 'user',
841
                'email' => '[email protected]',
842
                'password' => 'secret',
843
                'mainLanguageCode' => 'eng-US',
844
            ],
845
            [
846
                'login' => $userCreate->login,
847
                'email' => $userCreate->email,
848
                'password' => $userCreate->password,
849
                'mainLanguageCode' => $userCreate->mainLanguageCode,
850
            ]
851
        );
852
    }
853
854
    /**
855
     * Test for the newUserCreateStruct() method.
856
     *
857
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct($login, $email, $password, $mainLanguageCode, $contentType)
858
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
859
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
860
     */
861 View Code Duplication
    public function testNewUserCreateStructWithFifthParameter()
862
    {
863
        if ($this->isVersion4()) {
864
            $this->markTestSkipped('This test is only relevant for eZ Publish versions > 4');
865
        }
866
867
        $repository = $this->getRepository();
868
869
        /* BEGIN: Use Case */
870
        $contentTypeService = $repository->getContentTypeService();
871
        $userService = $repository->getUserService();
872
873
        $userType = $contentTypeService->loadContentTypeByIdentifier('user');
874
875
        $userCreate = $userService->newUserCreateStruct(
876
            'user',
877
            '[email protected]',
878
            'secret',
879
            'eng-US',
880
            $userType
881
        );
882
        /* END: Use Case */
883
884
        $this->assertSame($userType, $userCreate->contentType);
885
    }
886
887
    /**
888
     * Test for creating user with Active Directory login name.
889
     */
890 View Code Duplication
    public function testNewUserWithDomainName()
891
    {
892
        $repository = $this->getRepository();
893
        $userService = $repository->getUserService();
894
        $createdUser = $this->createUserVersion1('ez-user-Domain\username-by-login');
895
        $loadedUser = $userService->loadUserByLogin('ez-user-Domain\username-by-login');
896
897
        $this->assertEquals($createdUser, $loadedUser);
898
    }
899
900
    /**
901
     * Test for the createUser() method.
902
     *
903
     * @return \eZ\Publish\API\Repository\Values\User\User
904
     *
905
     * @see \eZ\Publish\API\Repository\UserService::createUser()
906
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
907
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
908
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
909
     */
910
    public function testCreateUser()
911
    {
912
        /* BEGIN: Use Case */
913
        $user = $this->createUserVersion1();
914
        /* END: Use Case */
915
916
        $this->assertInstanceOf(
917
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\User',
918
            $user
919
        );
920
921
        return $user;
922
    }
923
924
    /**
925
     * Test for the createUser() method.
926
     *
927
     * @param \eZ\Publish\API\Repository\Values\User\User $user
928
     *
929
     * @see \eZ\Publish\API\Repository\UserService::createUser()
930
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
931
     */
932
    public function testCreateUserSetsExpectedProperties(User $user)
933
    {
934
        $this->assertEquals(
935
            [
936
                'login' => 'user',
937
                'email' => '[email protected]',
938
                'mainLanguageCode' => 'eng-US',
939
            ],
940
            [
941
                'login' => $user->login,
942
                'email' => $user->email,
943
                'mainLanguageCode' => $user->contentInfo->mainLanguageCode,
944
            ]
945
        );
946
    }
947
948
    /**
949
     * Test for the createUser() method.
950
     *
951
     * @see \eZ\Publish\API\Repository\UserService::createUser()
952
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
953
     */
954 View Code Duplication
    public function testCreateUserWhenMissingField()
955
    {
956
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException::class);
957
958
        $repository = $this->getRepository();
959
960
        $editorsGroupId = $this->generateId('group', 13);
961
        /* BEGIN: Use Case */
962
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
963
        // Publish demo installation
964
965
        $userService = $repository->getUserService();
966
967
        // Instantiate a create struct with mandatory properties
968
        $userCreate = $userService->newUserCreateStruct(
969
            'user',
970
            '[email protected]',
971
            'secret',
972
            'eng-US'
973
        );
974
975
        // Do not set the mandatory fields "first_name" and "last_name"
976
        //$userCreate->setField( 'first_name', 'Example' );
977
        //$userCreate->setField( 'last_name', 'User' );
978
979
        // Load parent group for the user
980
        $group = $userService->loadUserGroup($editorsGroupId);
981
982
        // This call will fail with a "ContentFieldValidationException", because the
983
        // mandatory fields "first_name" and "last_name" are not set.
984
        $userService->createUser($userCreate, [$group]);
985
        /* END: Use Case */
986
    }
987
988
    /**
989
     * Test for the createUser() method.
990
     *
991
     * @see \eZ\Publish\API\Repository\UserService::createUser()
992
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
993
     */
994 View Code Duplication
    public function testCreateUserThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
995
    {
996
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\InvalidArgumentException::class);
997
998
        $repository = $this->getRepository();
999
1000
        $editorsGroupId = $this->generateId('group', 13);
1001
        /* BEGIN: Use Case */
1002
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
1003
        // Publish demo installation
1004
1005
        $userService = $repository->getUserService();
1006
1007
        // Instantiate a create struct with mandatory properties
1008
        $userCreate = $userService->newUserCreateStruct(
1009
            'user',
1010
            '[email protected]',
1011
            'secret',
1012
            'eng-US'
1013
        );
1014
1015
        // An object of stdClass is not a valid value for the field first_name
1016
        $userCreate->setField('first_name', new \stdClass());
1017
        $userCreate->setField('last_name', 'User');
1018
1019
        // Load parent group for the user
1020
        $group = $userService->loadUserGroup($editorsGroupId);
1021
1022
        // This call will fail with an "InvalidArgumentException", because the
1023
        // value for the firled "first_name" is not accepted by the field type.
1024
        $userService->createUser($userCreate, [$group]);
1025
        /* END: Use Case */
1026
    }
1027
1028
    /**
1029
     * Test for the createUser() method.
1030
     *
1031
     * @covers \eZ\Publish\API\Repository\UserService::createUser
1032
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1033
     */
1034 View Code Duplication
    public function testCreateUserThrowsInvalidArgumentException()
1035
    {
1036
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\InvalidArgumentException::class);
1037
        $this->expectExceptionMessage('Argument \'userCreateStruct\' is invalid: User with provided login already exists');
1038
1039
        $repository = $this->getRepository();
1040
1041
        $editorsGroupId = $this->generateId('group', 13);
1042
        /* BEGIN: Use Case */
1043
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
1044
        // Publish demo installation
1045
1046
        $userService = $repository->getUserService();
1047
1048
        // Instantiate a create struct with mandatory properties
1049
        $userCreate = $userService->newUserCreateStruct(
1050
            // admin is an existing login
1051
            'admin',
1052
            '[email protected]',
1053
            'secret',
1054
            'eng-US'
1055
        );
1056
1057
        $userCreate->setField('first_name', 'Example');
1058
        $userCreate->setField('last_name', 'User');
1059
1060
        // Load parent group for the user
1061
        $group = $userService->loadUserGroup($editorsGroupId);
1062
1063
        // This call will fail with a "InvalidArgumentException", because the
1064
        // user with "admin" login already exists.
1065
        $userService->createUser($userCreate, [$group]);
1066
        /* END: Use Case */
1067
    }
1068
1069
    /**
1070
     * Test for the createUser() method.
1071
     *
1072
     * @return \eZ\Publish\API\Repository\Values\User\User
1073
     *
1074
     * @see \eZ\Publish\API\Repository\UserService::createUser()
1075
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
1076
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
1077
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
1078
     */
1079
    public function testCreateUserInTransactionWithRollback()
1080
    {
1081
        $repository = $this->getRepository();
1082
        $userService = $repository->getUserService();
1083
1084
        /* BEGIN: Use Case */
1085
        $repository->beginTransaction();
1086
1087
        try {
1088
            $user = $this->createUserVersion1();
1089
        } catch (Exception $e) {
1090
            // Cleanup hanging transaction on error
1091
            $repository->rollback();
1092
            throw $e;
1093
        }
1094
1095
        $repository->rollback();
1096
1097
        try {
1098
            // Throws exception since creation of user was rolled back
1099
            $loadedUser = $userService->loadUser($user->id);
0 ignored issues
show
Unused Code introduced by
$loadedUser 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...
1100
        } catch (NotFoundException $e) {
1101
            return;
1102
        }
1103
        /* END: Use Case */
1104
1105
        $this->fail('User object still exists after rollback.');
1106
    }
1107
1108
    /**
1109
     * Test creating a user throwing NotFoundException.
1110
     *
1111
     * @covers \eZ\Publish\API\Repository\UserService::createUser
1112
     */
1113
    public function testCreateUserThrowsNotFoundException()
1114
    {
1115
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
1116
1117
        $repository = $this->getRepository();
1118
        $userService = $repository->getUserService();
1119
1120
        $userCreateStruct = $userService->newUserCreateStruct('new_user', '[email protected]', 'password', 'eng-GB');
1121
        $userCreateStruct->setField('first_name', 'New');
1122
        $userCreateStruct->setField('last_name', 'User');
1123
1124
        $parentGroup = new UserGroup(
1125
            [
1126
                'content' => new Content(
1127
                    [
1128
                        'versionInfo' => new VersionInfo(
1129
                            [
1130
                                'contentInfo' => new ContentInfo(['id' => 123456]),
1131
                            ]
1132
                        ),
1133
                        'internalFields' => [],
1134
                    ]
1135
                ),
1136
            ]
1137
        );
1138
        $userService->createUser($userCreateStruct, [$parentGroup]);
1139
    }
1140
1141
    /**
1142
     * Test creating a user throwing UserPasswordValidationException when password doesn't follow specific rules.
1143
     *
1144
     * @covers \eZ\Publish\API\Repository\UserService::createUser
1145
     */
1146
    public function testCreateUserWithWeakPasswordThrowsUserPasswordValidationException()
1147
    {
1148
        $this->expectException(\eZ\Publish\Core\Base\Exceptions\UserPasswordValidationException::class);
1149
        $this->expectExceptionMessage('Argument \'password\' is invalid: Password doesn\'t match the following rules: User password must be at least 8 characters long, User password must include at least one upper case letter, User password must include at least one number, User password must include at least one special character');
1150
1151
        $userContentType = $this->createUserWithStrongPasswordContentType();
1152
1153
        /* BEGIN: Use Case */
1154
        // This call will fail with a "UserPasswordValidationException" because the
1155
        // the password does not follow specified rules.
1156
        $this->createUserWithPassword('pass', $userContentType);
1157
        /* END: Use Case */
1158
    }
1159
1160
    /**
1161
     * Opposite test case for testCreateUserWithWeakPasswordThrowsUserPasswordValidationException.
1162
     *
1163
     * @covers \eZ\Publish\API\Repository\UserService::createUser
1164
     */
1165
    public function testCreateUserWithStrongPassword()
1166
    {
1167
        $userContentType = $this->createUserWithStrongPasswordContentType();
1168
1169
        /* BEGIN: Use Case */
1170
        $user = $this->createUserWithPassword('H@xxi0r!', $userContentType);
1171
        /* END: Use Case */
1172
1173
        $this->assertInstanceOf(User::class, $user);
1174
    }
1175
1176
    /**
1177
     * Test for the loadUser() method.
1178
     *
1179
     * @see \eZ\Publish\API\Repository\UserService::loadUser()
1180
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1181
     */
1182
    public function testLoadUser()
1183
    {
1184
        $repository = $this->getRepository();
1185
1186
        $userService = $repository->getUserService();
1187
1188
        /* BEGIN: Use Case */
1189
        $user = $this->createUserVersion1();
1190
1191
        // Load the newly created user
1192
        $userReloaded = $userService->loadUser($user->id);
1193
        /* END: Use Case */
1194
1195
        $this->assertEquals($user, $userReloaded);
1196
1197
        // User happens to also be a Content; isUser() should be true and isUserGroup() should be false
1198
        $this->assertTrue($userService->isUser($user), 'isUser() => false on a user');
1199
        $this->assertFalse($userService->isUserGroup($user), 'isUserGroup() => true on a user group');
1200
    }
1201
1202
    /**
1203
     * Test for the loadUser() method.
1204
     *
1205
     * @see \eZ\Publish\API\Repository\UserService::loadUser()
1206
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser
1207
     */
1208 View Code Duplication
    public function testLoadUserThrowsNotFoundException()
1209
    {
1210
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
1211
1212
        $repository = $this->getRepository();
1213
1214
        $nonExistingUserId = $this->generateId('user', self::DB_INT_MAX);
1215
        /* BEGIN: Use Case */
1216
        $userService = $repository->getUserService();
1217
1218
        // This call will fail with a "NotFoundException", because no user with
1219
        // an id equal to self::DB_INT_MAX should exist.
1220
        $userService->loadUser($nonExistingUserId);
1221
        /* END: Use Case */
1222
    }
1223
1224
    /**
1225
     * Test for the loadAnonymousUser() method.
1226
     *
1227
     * @see \eZ\Publish\API\Repository\UserService::loadAnonymousUser()
1228
     */
1229
    public function testLoadAnonymousUser()
1230
    {
1231
        $repository = $this->getRepository();
1232
1233
        $anonymousUserId = $this->generateId('user', 10);
1234
        /* BEGIN: Use Case */
1235
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
1236
        // Publish demo installation.
1237
        $userService = $repository->getUserService();
1238
1239
        // Load default anonymous user available in each eZ Publish installation
1240
        $anonymousUser = $userService->loadUser($anonymousUserId);
1241
        /* END: Use Case */
1242
1243
        $this->assertInstanceOf(
1244
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\User',
1245
            $anonymousUser
1246
        );
1247
1248
        $this->assertEquals('anonymous', $anonymousUser->login);
1249
    }
1250
1251
    /**
1252
     * Test for the loadUserByCredentials() method.
1253
     *
1254
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1255
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1256
     */
1257
    public function testLoadUserByCredentials()
1258
    {
1259
        $repository = $this->getRepository();
1260
1261
        $userService = $repository->getUserService();
1262
1263
        /* BEGIN: Use Case */
1264
        $user = $this->createUserVersion1();
1265
1266
        // Load the newly created user
1267
        $userReloaded = $userService->loadUserByCredentials('user', 'secret');
1268
        /* END: Use Case */
1269
1270
        $this->assertEquals($user, $userReloaded);
1271
    }
1272
1273
    /**
1274
     * Test for the loadUserByCredentials() method.
1275
     *
1276
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1277
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1278
     */
1279 View Code Duplication
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownPassword()
1280
    {
1281
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
1282
1283
        $repository = $this->getRepository();
1284
1285
        $userService = $repository->getUserService();
1286
1287
        /* BEGIN: Use Case */
1288
        $this->createUserVersion1();
1289
1290
        // This call will fail with a "NotFoundException", because the given
1291
        // login/password combination does not exist.
1292
        $userService->loadUserByCredentials('user', 'SeCrEt');
1293
        /* END: Use Case */
1294
    }
1295
1296
    /**
1297
     * Test for the loadUserByCredentials() method.
1298
     *
1299
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1300
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1301
     */
1302 View Code Duplication
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownPasswordEmtpy()
1303
    {
1304
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
1305
1306
        $repository = $this->getRepository();
1307
1308
        $userService = $repository->getUserService();
1309
1310
        /* BEGIN: Use Case */
1311
        $this->createUserVersion1();
1312
1313
        // This call will fail with a "NotFoundException", because the given
1314
        // login/password combination does not exist.
1315
        $userService->loadUserByCredentials('user', '');
1316
        /* END: Use Case */
1317
    }
1318
1319
    /**
1320
     * Test for the loadUserByCredentials() method.
1321
     *
1322
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1323
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1324
     */
1325 View Code Duplication
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownLogin()
1326
    {
1327
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
1328
1329
        $repository = $this->getRepository();
1330
1331
        $userService = $repository->getUserService();
1332
1333
        /* BEGIN: Use Case */
1334
        $this->createUserVersion1();
1335
1336
        // This call will fail with a "NotFoundException", because the given
1337
        // login/password combination does not exist.
1338
        $userService->loadUserByCredentials('üser', 'secret');
1339
        /* END: Use Case */
1340
    }
1341
1342
    /**
1343
     * Test for the loadUserByCredentials() method.
1344
     *
1345
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1346
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1347
     */
1348 View Code Duplication
    public function testLoadUserByCredentialsThrowsInvalidArgumentValueForEmptyLogin()
1349
    {
1350
        $this->expectException(\eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue::class);
1351
1352
        $repository = $this->getRepository();
1353
1354
        $userService = $repository->getUserService();
1355
1356
        /* BEGIN: Use Case */
1357
        $this->createUserVersion1();
1358
1359
        // This call will fail with a "InvalidArgumentValue", because the given
1360
        // login is empty.
1361
        $userService->loadUserByCredentials('', 'secret');
1362
        /* END: Use Case */
1363
    }
1364
1365
    /**
1366
     * Test for the loadUserByLogin() method.
1367
     *
1368
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1369
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1370
     */
1371 View Code Duplication
    public function testLoadUserByLogin()
1372
    {
1373
        $repository = $this->getRepository();
1374
1375
        $userService = $repository->getUserService();
1376
1377
        /* BEGIN: Use Case */
1378
        $user = $this->createUserVersion1('User');
1379
1380
        // Load the newly created user
1381
        $userReloaded = $userService->loadUserByLogin('User');
1382
        /* END: Use Case */
1383
1384
        $this->assertPropertiesCorrect(
1385
            [
1386
                'login' => $user->login,
1387
                'email' => $user->email,
1388
                'passwordHash' => $user->passwordHash,
1389
                'hashAlgorithm' => $user->hashAlgorithm,
1390
                'enabled' => $user->enabled,
1391
                'maxLogin' => $user->maxLogin,
1392
                'id' => $user->id,
1393
                'contentInfo' => $user->contentInfo,
1394
                'versionInfo' => $user->versionInfo,
1395
                'fields' => $user->fields,
1396
            ],
1397
            $userReloaded
1398
        );
1399
    }
1400
1401
    /**
1402
     * Test for the loadUserByLogin() method.
1403
     *
1404
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1405
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByLogin
1406
     */
1407 View Code Duplication
    public function testLoadUserByLoginThrowsNotFoundExceptionForUnknownLogin()
1408
    {
1409
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
1410
1411
        $repository = $this->getRepository();
1412
1413
        $userService = $repository->getUserService();
1414
1415
        /* BEGIN: Use Case */
1416
        $this->createUserVersion1();
1417
1418
        // This call will fail with a "NotFoundException", because the given
1419
        // login/password combination does not exist.
1420
        $userService->loadUserByLogin('user42');
1421
        /* END: Use Case */
1422
    }
1423
1424
    /**
1425
     * Test for the loadUserByLogin() method.
1426
     *
1427
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1428
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByLogin
1429
     */
1430 View Code Duplication
    public function testLoadUserByLoginWorksForLoginWithWrongCase()
1431
    {
1432
        $repository = $this->getRepository();
1433
1434
        $userService = $repository->getUserService();
1435
1436
        /* BEGIN: Use Case */
1437
        $user = $this->createUserVersion1();
1438
1439
        // Lookup by user login should ignore casing
1440
        $userReloaded = $userService->loadUserByLogin('USER');
1441
        /* END: Use Case */
1442
1443
        $this->assertPropertiesCorrect(
1444
            [
1445
                'login' => $user->login,
1446
                'email' => $user->email,
1447
                'passwordHash' => $user->passwordHash,
1448
                'hashAlgorithm' => $user->hashAlgorithm,
1449
                'enabled' => $user->enabled,
1450
                'maxLogin' => $user->maxLogin,
1451
                'id' => $user->id,
1452
                'contentInfo' => $user->contentInfo,
1453
                'versionInfo' => $user->versionInfo,
1454
                'fields' => $user->fields,
1455
            ],
1456
            $userReloaded
1457
        );
1458
    }
1459
1460
    /**
1461
     * Test for the loadUserByLogin() method.
1462
     *
1463
     * In some cases people use email as login name, make sure system works as exepcted when asking for user by email.
1464
     *
1465
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1466
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByLogin
1467
     */
1468 View Code Duplication
    public function testLoadUserByLoginThrowsNotFoundExceptionForUnknownLoginByEmail()
1469
    {
1470
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
1471
1472
        $repository = $this->getRepository();
1473
1474
        $userService = $repository->getUserService();
1475
1476
        /* BEGIN: Use Case */
1477
        $user = $this->createUserVersion1();
0 ignored issues
show
Unused Code introduced by
$user 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...
1478
1479
        // Lookup by user login by email should behave as normal
1480
        $userService->loadUserByLogin('[email protected]');
1481
        /* END: Use Case */
1482
    }
1483
1484
    /**
1485
     * Test for the loadUsersByEmail() method.
1486
     *
1487
     * @see \eZ\Publish\API\Repository\UserService::loadUsersByEmail()
1488
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1489
     */
1490 View Code Duplication
    public function testLoadUserByEmail()
1491
    {
1492
        $repository = $this->getRepository();
1493
1494
        $userService = $repository->getUserService();
1495
1496
        /* BEGIN: Use Case */
1497
        $user = $this->createUserVersion1();
1498
1499
        // Load the newly created user
1500
        $usersReloaded = $userService->loadUsersByEmail('[email protected]');
1501
        /* END: Use Case */
1502
1503
        $this->assertEquals([$user], $usersReloaded);
1504
    }
1505
1506
    /**
1507
     * Test for the loadUsersByEmail() method.
1508
     *
1509
     * @see \eZ\Publish\API\Repository\UserService::loadUsersByEmail()
1510
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByEmail
1511
     */
1512 View Code Duplication
    public function testLoadUserByEmailReturnsEmptyInUnknownEmail()
1513
    {
1514
        $repository = $this->getRepository();
1515
1516
        $userService = $repository->getUserService();
1517
1518
        /* BEGIN: Use Case */
1519
        $this->createUserVersion1();
1520
1521
        // This call will return empty array, because the given
1522
        // login/password combination does not exist.
1523
        $emptyUserList = $userService->loadUsersByEmail('[email protected]');
1524
        /* END: Use Case */
1525
1526
        $this->assertEquals([], $emptyUserList);
1527
    }
1528
1529
    /**
1530
     * Test for the deleteUser() method.
1531
     *
1532
     * @see \eZ\Publish\API\Repository\UserService::deleteUser()
1533
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1534
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser
1535
     */
1536 View Code Duplication
    public function testDeleteUser()
1537
    {
1538
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\NotFoundException::class);
1539
1540
        $repository = $this->getRepository();
1541
1542
        $userService = $repository->getUserService();
1543
1544
        /* BEGIN: Use Case */
1545
        $user = $this->createUserVersion1();
1546
1547
        // Delete the currently created user
1548
        $userService->deleteUser($user);
1549
        /* END: Use Case */
1550
1551
        // We use the NotFoundException here to verify that the user not exists
1552
        $userService->loadUser($user->id);
1553
    }
1554
1555
    /**
1556
     * Test for the deleteUser() method.
1557
     *
1558
     * @covers  \eZ\Publish\API\Repository\UserService::deleteUser()
1559
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1560
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser
1561
     */
1562
    public function testDeleteUserDeletesRelatedBookmarks()
1563
    {
1564
        $repository = $this->getRepository();
1565
1566
        $userService = $repository->getUserService();
1567
        $locationService = $repository->getLocationService();
1568
        $bookmarkService = $repository->getBookmarkService();
1569
        /* BEGIN: Use Case */
1570
        $admin = $repository->getPermissionResolver()->getCurrentUserReference();
1571
1572
        $user = $this->createUserVersion1();
1573
1574
        $repository->getPermissionResolver()->setCurrentUserReference($user);
1575
1576
        $bookmarkService->createBookmark(
1577
            $locationService->loadLocation($this->generateId('location', 43))
1578
        );
1579
1580
        $repository->getPermissionResolver()->setCurrentUserReference($admin);
1581
        // Delete the currently created user
1582
        $userService->deleteUser($user);
1583
1584
        $repository->getPermissionResolver()->setCurrentUserReference($user);
1585
        /* END: Use Case */
1586
1587
        $this->assertEquals(0, $bookmarkService->loadBookmarks(0, 9999)->totalCount);
1588
    }
1589
1590
    /**
1591
     * Test for the newUserUpdateStruct() method.
1592
     *
1593
     * @see \eZ\Publish\API\Repository\UserService::newUserUpdateStruct()
1594
     */
1595
    public function testNewUserUpdateStruct()
1596
    {
1597
        $repository = $this->getRepository();
1598
1599
        /* BEGIN: Use Case */
1600
        $userService = $repository->getUserService();
1601
1602
        // Create a new update struct instance
1603
        $userUpdate = $userService->newUserUpdateStruct();
1604
        /* END: Use Case */
1605
1606
        $this->assertInstanceOf(
1607
            UserUpdateStruct::class,
1608
            $userUpdate
1609
        );
1610
1611
        $this->assertNull($userUpdate->contentUpdateStruct);
1612
        $this->assertNull($userUpdate->contentMetadataUpdateStruct);
1613
1614
        $this->assertPropertiesCorrect(
1615
            [
1616
                'email' => null,
1617
                'password' => null,
1618
                'enabled' => null,
1619
                'maxLogin' => null,
1620
            ],
1621
            $userUpdate
1622
        );
1623
    }
1624
1625
    /**
1626
     * Test for the updateUser() method.
1627
     *
1628
     * @return \eZ\Publish\API\Repository\Values\User\User
1629
     *
1630
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1631
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1632
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserUpdateStruct
1633
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent
1634
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata
1635
     */
1636
    public function testUpdateUser()
1637
    {
1638
        $repository = $this->getRepository();
1639
1640
        $userService = $repository->getUserService();
1641
1642
        /* BEGIN: Use Case */
1643
        $user = $this->createUserVersion1();
1644
1645
        // Create a new update struct instance
1646
        $userUpdate = $userService->newUserUpdateStruct();
1647
1648
        // Set new values for password and maxLogin
1649
        $userUpdate->password = 'my-new-password';
1650
        $userUpdate->maxLogin = 42;
1651
        $userUpdate->enabled = false;
1652
1653
        // Updated the user record.
1654
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1655
        /* END: Use Case */
1656
1657
        $this->assertInstanceOf(User::class, $userVersion2);
1658
1659
        return $userVersion2;
1660
    }
1661
1662
    /**
1663
     * Test for the updateUser() and loadUsersByEmail() method on change to email.
1664
     */
1665
    public function testUpdateUserEmail(): void
1666
    {
1667
        $repository = $this->getRepository();
1668
        $userService = $repository->getUserService();
1669
1670
        // Create a user
1671
        $user = $this->createUserVersion1();
1672
1673
        // Check we get what we expect (and implicit warmup any kind of cache)
1674
        $users = $userService->loadUsersByEmail('[email protected]');
1675
        $this->assertCount(0, $users);
1676
1677
        // Update user with the given email address
1678
        $userUpdate = $userService->newUserUpdateStruct();
1679
        $userUpdate->email = '[email protected]';
1680
        $updatedUser = $userService->updateUser($user, $userUpdate);
1681
        $this->assertInstanceOf(User::class, $updatedUser);
1682
1683
        // Check that we can load user by email
1684
        $users = $userService->loadUsersByEmail('[email protected]');
1685
        $this->assertCount(1, $users);
1686
        $this->assertInstanceOf(User::class, $users[0]);
1687
    }
1688
1689
    /**
1690
     * Test for the updateUser() method.
1691
     *
1692
     * @return \eZ\Publish\API\Repository\Values\User\User
1693
     *
1694
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1695
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1696
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserUpdateStruct
1697
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent
1698
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata
1699
     */
1700
    public function testUpdateUserNoPassword()
1701
    {
1702
        $repository = $this->getRepository();
1703
        $eventUserService = $repository->getUserService();
1704
1705
        $eventUserServiceReflection = new ReflectionClass($eventUserService);
1706
        $userServiceProperty = $eventUserServiceReflection->getProperty('innerService');
1707
        $userServiceProperty->setAccessible(true);
1708
        $userService = $userServiceProperty->getValue($eventUserService);
1709
1710
        $userServiceReflection = new ReflectionClass($userService);
1711
        $settingsProperty = $userServiceReflection->getProperty('settings');
1712
        $settingsProperty->setAccessible(true);
1713
        $settingsProperty->setValue(
1714
            $userService,
1715
            [
1716
                'hashType' => User::PASSWORD_HASH_MD5_USER,
0 ignored issues
show
Deprecated Code introduced by
The constant eZ\Publish\API\Repositor...:PASSWORD_HASH_MD5_USER has been deprecated with message: since 6.13

This class constant 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 constant will be removed from the class and what other constant to use instead.

Loading history...
1717
            ] + $settingsProperty->getValue($userService)
1718
        );
1719
1720
        /* BEGIN: Use Case */
1721
        $user = $this->createUserVersion1();
1722
1723
        $settingsProperty->setValue(
1724
            $userService,
1725
            [
1726
                'hashType' => User::PASSWORD_HASH_PHP_DEFAULT,
1727
            ] + $settingsProperty->getValue($userService)
1728
        );
1729
1730
        // Create a new update struct instance
1731
        $userUpdate = $userService->newUserUpdateStruct();
1732
1733
        // Set new values for maxLogin, don't change password
1734
        $userUpdate->maxLogin = 43;
1735
        $userUpdate->enabled = false;
1736
1737
        // Updated the user record.
1738
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1739
        /* END: Use Case */
1740
1741
        $this->assertInstanceOf(User::class, $user);
1742
1743
        $this->assertEquals(
1744
            [
1745
                'login' => $user->login,
1746
                'email' => $user->email,
1747
                'passwordHash' => $user->passwordHash,
1748
                'hashAlgorithm' => $user->hashAlgorithm,
1749
                'maxLogin' => 43,
1750
                'enabled' => false,
1751
            ],
1752
            [
1753
                'login' => $userVersion2->login,
1754
                'email' => $userVersion2->email,
1755
                'passwordHash' => $userVersion2->passwordHash,
1756
                'hashAlgorithm' => $userVersion2->hashAlgorithm,
1757
                'maxLogin' => $userVersion2->maxLogin,
1758
                'enabled' => $userVersion2->enabled,
1759
            ]
1760
        );
1761
    }
1762
1763
    /**
1764
     * Test for the updateUser() method.
1765
     *
1766
     * @param \eZ\Publish\API\Repository\Values\User\User $user
1767
     *
1768
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1769
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1770
     */
1771
    public function testUpdateUserUpdatesExpectedProperties(User $user)
1772
    {
1773
        $this->assertEquals(
1774
            [
1775
                'login' => 'user',
1776
                'email' => '[email protected]',
1777
                'maxLogin' => 42,
1778
                'enabled' => false,
1779
            ],
1780
            [
1781
                'login' => $user->login,
1782
                'email' => $user->email,
1783
                'maxLogin' => $user->maxLogin,
1784
                'enabled' => $user->enabled,
1785
            ]
1786
        );
1787
    }
1788
1789
    /**
1790
     * Test for the updateUser() method.
1791
     *
1792
     * @param \eZ\Publish\API\Repository\Values\User\User $user
1793
     *
1794
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1795
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1796
     */
1797
    public function testUpdateUserReturnsPublishedVersion(User $user)
1798
    {
1799
        $this->assertEquals(
1800
            APIVersionInfo::STATUS_PUBLISHED,
1801
            $user->getVersionInfo()->status
1802
        );
1803
    }
1804
1805
    /**
1806
     * Test for the updateUser() method.
1807
     *
1808
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1809
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1810
     */
1811
    public function testUpdateUserWithContentMetadataUpdateStruct()
1812
    {
1813
        $repository = $this->getRepository();
1814
1815
        $userService = $repository->getUserService();
1816
1817
        /* BEGIN: Use Case */
1818
        $user = $this->createUserVersion1();
1819
1820
        // Get the ContentService implementation
1821
        $contentService = $repository->getContentService();
1822
1823
        // Create a metadata update struct and change the remote id.
1824
        $metadataUpdate = $contentService->newContentMetadataUpdateStruct();
1825
        $metadataUpdate->remoteId = '85e10037d1ac0a00aa75443ced483e08';
1826
1827
        // Create a new update struct instance
1828
        $userUpdate = $userService->newUserUpdateStruct();
1829
1830
        // Set the metadata update struct.
1831
        $userUpdate->contentMetadataUpdateStruct = $metadataUpdate;
1832
1833
        // Updated the user record.
1834
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1835
1836
        // The contentInfo->remoteId will be changed now.
1837
        $remoteId = $userVersion2->contentInfo->remoteId;
1838
        /* END: Use Case */
1839
1840
        $this->assertEquals('85e10037d1ac0a00aa75443ced483e08', $remoteId);
1841
    }
1842
1843
    /**
1844
     * Test for the updateUser() method.
1845
     *
1846
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1847
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1848
     */
1849
    public function testUpdateUserWithContentUpdateStruct()
1850
    {
1851
        $repository = $this->getRepository();
1852
1853
        $userService = $repository->getUserService();
1854
1855
        /* BEGIN: Use Case */
1856
        $user = $this->createUserVersion1();
1857
1858
        // Get the ContentService implementation
1859
        $contentService = $repository->getContentService();
1860
1861
        // Create a content update struct and change the remote id.
1862
        $contentUpdate = $contentService->newContentUpdateStruct();
1863
        $contentUpdate->setField('first_name', 'Hello', 'eng-US');
1864
        $contentUpdate->setField('last_name', 'World', 'eng-US');
1865
1866
        // Create a new update struct instance
1867
        $userUpdate = $userService->newUserUpdateStruct();
1868
1869
        // Set the content update struct.
1870
        $userUpdate->contentUpdateStruct = $contentUpdate;
1871
1872
        // Updated the user record.
1873
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1874
1875
        $name = sprintf(
1876
            '%s %s',
1877
            $userVersion2->getFieldValue('first_name'),
1878
            $userVersion2->getFieldValue('last_name')
1879
        );
1880
        /* END: Use Case */
1881
1882
        $this->assertEquals('Hello World', $name);
1883
    }
1884
1885
    /**
1886
     * Test for the updateUser() method.
1887
     *
1888
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1889
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1890
     */
1891 View Code Duplication
    public function testUpdateUserWhenMissingField()
1892
    {
1893
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException::class);
1894
1895
        $repository = $this->getRepository();
1896
1897
        $userService = $repository->getUserService();
1898
1899
        /* BEGIN: Use Case */
1900
        $user = $this->createUserVersion1();
1901
1902
        // Get the ContentService implementation
1903
        $contentService = $repository->getContentService();
1904
1905
        // Create a content update struct and change the remote id.
1906
        $contentUpdate = $contentService->newContentUpdateStruct();
1907
        $contentUpdate->setField('first_name', null, 'eng-US');
1908
1909
        // Create a new update struct instance
1910
        $userUpdate = $userService->newUserUpdateStruct();
1911
1912
        // Set the content update struct.
1913
        $userUpdate->contentUpdateStruct = $contentUpdate;
1914
1915
        // This call will fail with a "ContentFieldValidationException" because the
1916
        // mandatory field "first_name" is set to an empty value.
1917
        $userService->updateUser($user, $userUpdate);
1918
1919
        /* END: Use Case */
1920
    }
1921
1922
    /**
1923
     * Test for the updateUser() method.
1924
     *
1925
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1926
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1927
     */
1928 View Code Duplication
    public function testUpdateUserThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
1929
    {
1930
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\InvalidArgumentException::class);
1931
1932
        $repository = $this->getRepository();
1933
1934
        $userService = $repository->getUserService();
1935
1936
        /* BEGIN: Use Case */
1937
        $user = $this->createUserVersion1();
1938
1939
        // Get the ContentService implementation
1940
        $contentService = $repository->getContentService();
1941
1942
        $contentUpdate = $contentService->newContentUpdateStruct();
1943
        // An object of stdClass is not valid for the field first_name
1944
        $contentUpdate->setField('first_name', new \stdClass(), 'eng-US');
1945
1946
        // Create a new update struct instance
1947
        $userUpdate = $userService->newUserUpdateStruct();
1948
1949
        // Set the content update struct.
1950
        $userUpdate->contentUpdateStruct = $contentUpdate;
1951
1952
        // This call will fail with a "InvalidArgumentException" because the
1953
        // the field "first_name" does not accept the given value.
1954
        $userService->updateUser($user, $userUpdate);
1955
1956
        /* END: Use Case */
1957
    }
1958
1959
    /**
1960
     * Test updating a user throwing UserPasswordValidationException when password doesn't follow specified rules.
1961
     *
1962
     * @covers \eZ\Publish\API\Repository\UserService::updateUser
1963
     */
1964
    public function testUpdateUserWithWeakPasswordThrowsUserPasswordValidationException()
1965
    {
1966
        $this->expectException(\eZ\Publish\Core\Base\Exceptions\UserPasswordValidationException::class);
1967
        $this->expectExceptionMessage('Argument \'password\' is invalid: Password doesn\'t match the following rules: User password must be at least 8 characters long, User password must include at least one upper case letter, User password must include at least one number, User password must include at least one special character');
1968
1969
        $userService = $this->getRepository()->getUserService();
1970
1971
        $user = $this->createUserWithPassword('H@xxxiR!_1', $this->createUserWithStrongPasswordContentType());
1972
1973
        /* BEGIN: Use Case */
1974
        // Create a new update struct instance
1975
        $userUpdate = $userService->newUserUpdateStruct();
1976
        $userUpdate->password = 'pass';
1977
1978
        // This call will fail with a "UserPasswordValidationException" because the
1979
        // the password does not follow specified rules
1980
        $userService->updateUser($user, $userUpdate);
1981
        /* END: Use Case */
1982
    }
1983
1984
    /**
1985
     * Opposite test case for testUpdateUserWithWeakPasswordThrowsUserPasswordValidationException.
1986
     *
1987
     * @covers \eZ\Publish\API\Repository\UserService::updateUser
1988
     */
1989
    public function testUpdateUserWithStrongPassword()
1990
    {
1991
        $userService = $this->getRepository()->getUserService();
1992
1993
        $user = $this->createUserWithPassword('H@xxxiR!_1', $this->createUserWithStrongPasswordContentType());
1994
1995
        /* BEGIN: Use Case */
1996
        // Create a new update struct instance
1997
        $userUpdate = $userService->newUserUpdateStruct();
1998
        $userUpdate->password = 'H@xxxiR!_2';
1999
2000
        $user = $userService->updateUser($user, $userUpdate);
2001
        /* END: Use Case */
2002
2003
        $this->assertInstanceOf(User::class, $user);
2004
    }
2005
2006
    /**
2007
     * Test for the loadUserGroupsOfUser() method.
2008
     *
2009
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser
2010
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
2011
     */
2012
    public function testLoadUserGroupsOfUser()
2013
    {
2014
        $repository = $this->getRepository();
2015
2016
        $userService = $repository->getUserService();
2017
2018
        /* BEGIN: Use Case */
2019
        $user = $this->createUserVersion1();
2020
2021
        // This array will contain the "Editors" user group name
2022
        $userGroupNames = [];
2023
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
2024
            $this->assertInstanceOf(UserGroup::class, $userGroup);
2025
            $userGroupNames[] = $userGroup->getFieldValue('name');
2026
        }
2027
        /* END: Use Case */
2028
2029
        $this->assertEquals(['Editors'], $userGroupNames);
2030
    }
2031
2032
    /**
2033
     * Test for the loadUsersOfUserGroup() method.
2034
     *
2035
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup
2036
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
2037
     */
2038
    public function testLoadUsersOfUserGroup()
2039
    {
2040
        $repository = $this->getRepository();
2041
        $userService = $repository->getUserService();
2042
2043
        $group = $userService->loadUserGroup($this->generateId('group', 13));
2044
2045
        /* BEGIN: Use Case */
2046
        $this->createUserVersion1();
2047
2048
        $this->refreshSearch($repository);
2049
2050
        // This array will contain the email of the newly created "Editor" user
2051
        $email = [];
2052
        foreach ($userService->loadUsersOfUserGroup($group) as $user) {
2053
            $this->assertInstanceOf(User::class, $user);
2054
            $email[] = $user->email;
2055
        }
2056
        /* END: Use Case */
2057
        $this->assertEquals(['[email protected]'], $email);
2058
    }
2059
2060
    /**
2061
     * Test for the assignUserToUserGroup() method.
2062
     *
2063
     * @see \eZ\Publish\API\Repository\UserService::assignUserToUserGroup()
2064
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser
2065
     */
2066
    public function testAssignUserToUserGroup()
2067
    {
2068
        $repository = $this->getRepository();
2069
        $userService = $repository->getUserService();
2070
2071
        $administratorGroupId = $this->generateId('group', 12);
2072
        /* BEGIN: Use Case */
2073
        // $administratorGroupId is the ID of the "Administrator" group in an
2074
        // eZ Publish demo installation
2075
2076
        $user = $this->createUserVersion1();
2077
2078
        // Assign group to newly created user
2079
        $userService->assignUserToUserGroup(
2080
            $user,
2081
            $userService->loadUserGroup($administratorGroupId)
2082
        );
2083
2084
        // This array will contain "Editors" and "Administrator users"
2085
        $userGroupNames = [];
2086
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
2087
            $userGroupNames[] = $userGroup->getFieldValue('name');
2088
        }
2089
        /* END: Use Case */
2090
2091
        sort($userGroupNames, SORT_STRING);
2092
2093
        $this->assertEquals(
2094
            [
2095
                'Administrator users',
2096
                'Editors',
2097
            ],
2098
            $userGroupNames
2099
        );
2100
    }
2101
2102
    /**
2103
     * Test for the assignUserToUserGroup() method.
2104
     *
2105
     * @covers \eZ\Publish\API\Repository\UserService::assignUserToUserGroup
2106
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testAssignUserToUserGroup
2107
     */
2108 View Code Duplication
    public function testAssignUserToUserGroupThrowsInvalidArgumentException()
2109
    {
2110
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\InvalidArgumentException::class);
2111
        $this->expectExceptionMessage('Argument \'user\' is invalid: user is already in the given user group');
2112
2113
        $repository = $this->getRepository();
2114
        $userService = $repository->getUserService();
2115
2116
        $editorsGroupId = $this->generateId('group', 13);
2117
        /* BEGIN: Use Case */
2118
        $user = $this->createUserVersion1();
2119
        // $editorsGroupId is the ID of the "Editors" group in an
2120
        // eZ Publish demo installation
2121
2122
        // This call will fail with an "InvalidArgumentException", because the
2123
        // user is already assigned to the "Editors" group
2124
        $userService->assignUserToUserGroup(
2125
            $user,
2126
            $userService->loadUserGroup($editorsGroupId)
2127
        );
2128
        /* END: Use Case */
2129
    }
2130
2131
    /**
2132
     * Test for the unAssignUssrFromUserGroup() method.
2133
     *
2134
     * @see \eZ\Publish\API\Repository\UserService::unAssignUssrFromUserGroup()
2135
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser
2136
     */
2137
    public function testUnAssignUserFromUserGroup()
2138
    {
2139
        $repository = $this->getRepository();
2140
        $userService = $repository->getUserService();
2141
2142
        $editorsGroupId = $this->generateId('group', 13);
2143
        $anonymousGroupId = $this->generateId('group', 42);
2144
2145
        /* BEGIN: Use Case */
2146
        // $anonymousGroupId is the ID of the "Anonymous Users" group in an eZ
2147
        // Publish demo installation
2148
2149
        $user = $this->createUserVersion1();
2150
2151
        // Assign group to newly created user
2152
        $userService->assignUserToUserGroup(
2153
            $user,
2154
            $userService->loadUserGroup($anonymousGroupId)
2155
        );
2156
2157
        // Unassign user from "Editors" group
2158
        $userService->unAssignUserFromUserGroup(
2159
            $user,
2160
            $userService->loadUserGroup($editorsGroupId)
2161
        );
2162
2163
        // This array will contain "Anonymous Users"
2164
        $userGroupNames = [];
2165
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
2166
            $userGroupNames[] = $userGroup->getFieldValue('name');
2167
        }
2168
        /* END: Use Case */
2169
2170
        $this->assertEquals(['Anonymous Users'], $userGroupNames);
2171
    }
2172
2173
    /**
2174
     * Test for the unAssignUserFromUserGroup() method.
2175
     *
2176
     * @see \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup()
2177
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup
2178
     */
2179
    public function testUnAssignUserFromUserGroupThrowsInvalidArgumentException()
2180
    {
2181
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\InvalidArgumentException::class);
2182
2183
        $repository = $this->getRepository();
2184
        $userService = $repository->getUserService();
2185
2186
        $administratorGroupId = $this->generateId('group', 12);
2187
        /* BEGIN: Use Case */
2188
        $user = $this->createUserVersion1();
2189
        // $administratorGroupId is the ID of the "Administrator" group in an
2190
        // eZ Publish demo installation
2191
2192
        // This call will fail with an "InvalidArgumentException", because the
2193
        // user is not assigned to the "Administrator" group
2194
        $userService->unAssignUserFromUserGroup(
2195
            $user,
2196
            $userService->loadUserGroup($administratorGroupId)
2197
        );
2198
        /* END: Use Case */
2199
    }
2200
2201
    /**
2202
     * Test for the unAssignUserFromUserGroup() method removing user from the last group.
2203
     *
2204
     * @covers \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup
2205
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup
2206
     */
2207 View Code Duplication
    public function testUnAssignUserFromUserGroupThrowsBadStateArgumentException()
2208
    {
2209
        $this->expectException(\eZ\Publish\API\Repository\Exceptions\BadStateException::class);
2210
        $this->expectExceptionMessage('Argument \'user\' has a bad state: user only has one user group, cannot unassign from last group');
2211
2212
        $repository = $this->getRepository();
2213
        $userService = $repository->getUserService();
2214
2215
        $editorsGroupId = $this->generateId('group', 13);
2216
        /* BEGIN: Use Case */
2217
        $user = $this->createUserVersion1();
2218
2219
        // This call will fail with an "BadStateException", because the
2220
        // user has to be assigned to at least one group
2221
        $userService->unAssignUserFromUserGroup(
2222
            $user,
2223
            $userService->loadUserGroup($editorsGroupId)
2224
        );
2225
        /* END: Use Case */
2226
    }
2227
2228
    /**
2229
     * Test that multi-language logic for the loadUserGroup method respects prioritized language list.
2230
     *
2231
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2232
     * @dataProvider getPrioritizedLanguageList
2233
     * @param string[] $prioritizedLanguages
2234
     * @param string|null $expectedLanguageCode language code of expected translation
2235
     */
2236
    public function testLoadUserGroupWithPrioritizedLanguagesList(
2237
        array $prioritizedLanguages,
2238
        $expectedLanguageCode
2239
    ) {
2240
        $repository = $this->getRepository();
2241
        $userService = $repository->getUserService();
2242
2243
        $userGroup = $this->createMultiLanguageUserGroup();
2244
        if ($expectedLanguageCode === null) {
2245
            $expectedLanguageCode = $userGroup->contentInfo->mainLanguageCode;
2246
        }
2247
2248
        $loadedUserGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2249
2250
        self::assertEquals(
2251
            $loadedUserGroup->getName($expectedLanguageCode),
2252
            $loadedUserGroup->getName()
2253
        );
2254
        self::assertEquals(
2255
            $loadedUserGroup->getFieldValue('description', $expectedLanguageCode),
2256
            $loadedUserGroup->getFieldValue('description')
2257
        );
2258
    }
2259
2260
    /**
2261
     * Test that multi-language logic works correctly after updating user group main language.
2262
     *
2263
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2264
     * @dataProvider getPrioritizedLanguageList
2265
     * @param string[] $prioritizedLanguages
2266
     * @param string|null $expectedLanguageCode language code of expected translation
2267
     */
2268
    public function testLoadUserGroupWithPrioritizedLanguagesListAfterMainLanguageUpdate(
2269
        array $prioritizedLanguages,
2270
        $expectedLanguageCode
2271
    ) {
2272
        $repository = $this->getRepository();
2273
        $userService = $repository->getUserService();
2274
        $contentService = $repository->getContentService();
2275
2276
        $userGroup = $this->createMultiLanguageUserGroup();
2277
2278
        $userGroupUpdateStruct = $userService->newUserGroupUpdateStruct();
2279
        $userGroupUpdateStruct->contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct();
2280
        $userGroupUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode = 'eng-GB';
2281
        $userService->updateUserGroup($userGroup, $userGroupUpdateStruct);
2282
2283
        if ($expectedLanguageCode === null) {
2284
            $expectedLanguageCode = 'eng-GB';
2285
        }
2286
2287
        $loadedUserGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2288
2289
        self::assertEquals(
2290
            $loadedUserGroup->getName($expectedLanguageCode),
2291
            $loadedUserGroup->getName()
2292
        );
2293
        self::assertEquals(
2294
            $loadedUserGroup->getFieldValue('description', $expectedLanguageCode),
2295
            $loadedUserGroup->getFieldValue('description')
2296
        );
2297
    }
2298
2299
    /**
2300
     * Test that multi-language logic for the loadSubUserGroups method respects prioritized language list.
2301
     *
2302
     * @covers \eZ\Publish\API\Repository\UserService::loadSubUserGroups
2303
     * @dataProvider getPrioritizedLanguageList
2304
     * @param string[] $prioritizedLanguages
2305
     * @param string|null $expectedLanguageCode language code of expected translation
2306
     */
2307
    public function testLoadSubUserGroupsWithPrioritizedLanguagesList(
2308
        array $prioritizedLanguages,
2309
        $expectedLanguageCode
2310
    ) {
2311
        $repository = $this->getRepository();
2312
        $userService = $repository->getUserService();
2313
2314
        // create main group for subgroups
2315
        $userGroup = $this->createMultiLanguageUserGroup(4);
2316
        if ($expectedLanguageCode === null) {
2317
            $expectedLanguageCode = $userGroup->contentInfo->mainLanguageCode;
2318
        }
2319
2320
        // create subgroups
2321
        $this->createMultiLanguageUserGroup($userGroup->id);
2322
        $this->createMultiLanguageUserGroup($userGroup->id);
2323
2324
        $userGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2325
2326
        $subUserGroups = $userService->loadSubUserGroups($userGroup, 0, 2, $prioritizedLanguages);
2327
        foreach ($subUserGroups as $subUserGroup) {
2328
            self::assertEquals(
2329
                $subUserGroup->getName($expectedLanguageCode),
2330
                $subUserGroup->getName()
2331
            );
2332
            self::assertEquals(
2333
                $subUserGroup->getFieldValue('description', $expectedLanguageCode),
2334
                $subUserGroup->getFieldValue('description')
2335
            );
2336
        }
2337
    }
2338
2339
    /**
2340
     * Test that multi-language logic for the loadUser method respects prioritized language list.
2341
     *
2342
     * @covers \eZ\Publish\API\Repository\UserService::loadUser
2343
     * @dataProvider getPrioritizedLanguageList
2344
     * @param string[] $prioritizedLanguages
2345
     * @param string|null $expectedLanguageCode language code of expected translation
2346
     */
2347 View Code Duplication
    public function testLoadUserWithPrioritizedLanguagesList(
2348
        array $prioritizedLanguages,
2349
        $expectedLanguageCode
2350
    ) {
2351
        $repository = $this->getRepository();
2352
        $userService = $repository->getUserService();
2353
2354
        $user = $this->createMultiLanguageUser();
2355
        if ($expectedLanguageCode === null) {
2356
            $expectedLanguageCode = $user->contentInfo->mainLanguageCode;
2357
        }
2358
2359
        $loadedUser = $userService->loadUser($user->id, $prioritizedLanguages);
2360
2361
        self::assertEquals(
2362
            $loadedUser->getName($expectedLanguageCode),
2363
            $loadedUser->getName()
2364
        );
2365
2366
        foreach (['fist_name', 'last_name', 'signature'] as $fieldIdentifier) {
2367
            self::assertEquals(
2368
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2369
                $loadedUser->getFieldValue($fieldIdentifier)
2370
            );
2371
        }
2372
    }
2373
2374
    /**
2375
     * Test that multi-language logic for the loadUser method works correctly after updating
2376
     * user content main language.
2377
     *
2378
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2379
     * @dataProvider getPrioritizedLanguageList
2380
     * @param string[] $prioritizedLanguages
2381
     * @param string|null $expectedLanguageCode language code of expected translation
2382
     */
2383
    public function testLoadUserWithPrioritizedLanguagesListAfterMainLanguageUpdate(
2384
        array $prioritizedLanguages,
2385
        $expectedLanguageCode
2386
    ) {
2387
        $repository = $this->getRepository();
2388
        $userService = $repository->getUserService();
2389
        $contentService = $repository->getContentService();
2390
2391
        $user = $this->createMultiLanguageUser();
2392
        // sanity check
2393
        self::assertEquals($user->contentInfo->mainLanguageCode, 'eng-US');
2394
2395
        $userUpdateStruct = $userService->newUserUpdateStruct();
2396
        $userUpdateStruct->contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct();
2397
        $userUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode = 'eng-GB';
2398
        $userService->updateUser($user, $userUpdateStruct);
2399
        if ($expectedLanguageCode === null) {
2400
            $expectedLanguageCode = 'eng-GB';
2401
        }
2402
2403
        $loadedUser = $userService->loadUser($user->id, $prioritizedLanguages);
2404
2405
        self::assertEquals(
2406
            $loadedUser->getName($expectedLanguageCode),
2407
            $loadedUser->getName()
2408
        );
2409
2410
        foreach (['fist_name', 'last_name', 'signature'] as $fieldIdentifier) {
2411
            self::assertEquals(
2412
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2413
                $loadedUser->getFieldValue($fieldIdentifier)
2414
            );
2415
        }
2416
    }
2417
2418
    /**
2419
     * Test that multi-language logic for the loadUserByLogin method respects prioritized language list.
2420
     *
2421
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByLogin
2422
     * @dataProvider getPrioritizedLanguageList
2423
     * @param string[] $prioritizedLanguages
2424
     * @param string|null $expectedLanguageCode language code of expected translation
2425
     */
2426 View Code Duplication
    public function testLoadUserByLoginWithPrioritizedLanguagesList(
2427
        array $prioritizedLanguages,
2428
        $expectedLanguageCode
2429
    ) {
2430
        $repository = $this->getRepository();
2431
        $userService = $repository->getUserService();
2432
        $user = $this->createMultiLanguageUser();
2433
2434
        // load, with prioritized languages, the newly created user
2435
        $loadedUser = $userService->loadUserByLogin($user->login, $prioritizedLanguages);
2436
        if ($expectedLanguageCode === null) {
2437
            $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2438
        }
2439
2440
        self::assertEquals(
2441
            $loadedUser->getName($expectedLanguageCode),
2442
            $loadedUser->getName()
2443
        );
2444
2445
        foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2446
            self::assertEquals(
2447
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2448
                $loadedUser->getFieldValue($fieldIdentifier)
2449
            );
2450
        }
2451
    }
2452
2453
    /**
2454
     * Test that multi-language logic for the loadUserByCredentials method respects
2455
     * prioritized language list.
2456
     *
2457
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByCredentials
2458
     * @dataProvider getPrioritizedLanguageList
2459
     * @param string[] $prioritizedLanguages
2460
     * @param string|null $expectedLanguageCode language code of expected translation
2461
     */
2462 View Code Duplication
    public function testLoadUserByCredentialsWithPrioritizedLanguagesList(
2463
        array $prioritizedLanguages,
2464
        $expectedLanguageCode
2465
    ) {
2466
        $repository = $this->getRepository();
2467
        $userService = $repository->getUserService();
2468
        $user = $this->createMultiLanguageUser();
2469
2470
        // load, with prioritized languages, the newly created user
2471
        $loadedUser = $userService->loadUserByCredentials(
2472
            $user->login,
2473
            'secret',
2474
            $prioritizedLanguages
2475
        );
2476
        if ($expectedLanguageCode === null) {
2477
            $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2478
        }
2479
2480
        self::assertEquals(
2481
            $loadedUser->getName($expectedLanguageCode),
2482
            $loadedUser->getName()
2483
        );
2484
2485
        foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2486
            self::assertEquals(
2487
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2488
                $loadedUser->getFieldValue($fieldIdentifier)
2489
            );
2490
        }
2491
    }
2492
2493
    /**
2494
     * Test that multi-language logic for the loadUsersByEmail method respects
2495
     * prioritized language list.
2496
     *
2497
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersByEmail
2498
     * @dataProvider getPrioritizedLanguageList
2499
     * @param string[] $prioritizedLanguages
2500
     * @param string|null $expectedLanguageCode language code of expected translation
2501
     */
2502 View Code Duplication
    public function testLoadUsersByEmailWithPrioritizedLanguagesList(
2503
        array $prioritizedLanguages,
2504
        $expectedLanguageCode
2505
    ) {
2506
        $repository = $this->getRepository();
2507
        $userService = $repository->getUserService();
2508
        $user = $this->createMultiLanguageUser();
2509
2510
        // load, with prioritized languages, users by email
2511
        $loadedUsers = $userService->loadUsersByEmail($user->email, $prioritizedLanguages);
2512
2513
        foreach ($loadedUsers as $loadedUser) {
2514
            if ($expectedLanguageCode === null) {
2515
                $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2516
            }
2517
            self::assertEquals(
2518
                $loadedUser->getName($expectedLanguageCode),
2519
                $loadedUser->getName()
2520
            );
2521
2522
            foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2523
                self::assertEquals(
2524
                    $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2525
                    $loadedUser->getFieldValue($fieldIdentifier)
2526
                );
2527
            }
2528
        }
2529
    }
2530
2531
    /**
2532
     * Test that multi-language logic for the loadUserGroupsOfUser method respects
2533
     * prioritized language list.
2534
     *
2535
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser
2536
     * @dataProvider getPrioritizedLanguageList
2537
     * @param string[] $prioritizedLanguages
2538
     * @param string|null $expectedLanguageCode language code of expected translation
2539
     */
2540
    public function testLoadUserGroupsOfUserWithPrioritizedLanguagesList(
2541
        array $prioritizedLanguages,
2542
        $expectedLanguageCode
2543
    ) {
2544
        $repository = $this->getRepository();
2545
        $userService = $repository->getUserService();
2546
        $userGroup = $this->createMultiLanguageUserGroup();
2547
        $user = $this->createMultiLanguageUser($userGroup->id);
2548
2549
        $userGroups = $userService->loadUserGroupsOfUser($user, 0, 25, $prioritizedLanguages);
2550
        foreach ($userGroups as $userGroup) {
2551
            self::assertEquals(
2552
                $userGroup->getName($expectedLanguageCode),
2553
                $userGroup->getName()
2554
            );
2555
            self::assertEquals(
2556
                $userGroup->getFieldValue('description', $expectedLanguageCode),
2557
                $userGroup->getFieldValue('description')
2558
            );
2559
        }
2560
    }
2561
2562
    /**
2563
     * Test that multi-language logic for the loadUsersOfUserGroup method respects
2564
     * prioritized language list.
2565
     *
2566
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup
2567
     * @dataProvider getPrioritizedLanguageList
2568
     * @param string[] $prioritizedLanguages
2569
     * @param string|null $expectedLanguageCode language code of expected translation
2570
     */
2571
    public function testLoadUsersOfUserGroupWithPrioritizedLanguagesList(
2572
        array $prioritizedLanguages,
2573
        $expectedLanguageCode
2574
    ) {
2575
        $repository = $this->getRepository();
2576
        $userService = $repository->getUserService();
2577
2578
        // create parent user group
2579
        $userGroup = $this->createMultiLanguageUserGroup();
2580
        // add two users to the created parent user group
2581
        $this->createMultiLanguageUser($userGroup->id);
2582
        $this->createMultiLanguageUser($userGroup->id);
2583
2584
        // test loading of users via user group with prioritized languages list
2585
        $users = $userService->loadUsersOfUserGroup($userGroup, 0, 25, $prioritizedLanguages);
2586
        foreach ($users as $user) {
2587
            if ($expectedLanguageCode === null) {
2588
                $expectedLanguageCode = $user->contentInfo->mainLanguageCode;
2589
            }
2590
            self::assertEquals(
2591
                $user->getName($expectedLanguageCode),
2592
                $user->getName()
2593
            );
2594
2595
            foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2596
                self::assertEquals(
2597
                    $user->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2598
                    $user->getFieldValue($fieldIdentifier)
2599
                );
2600
            }
2601
        }
2602
    }
2603
2604
    /**
2605
     * Get prioritized languages list data.
2606
     *
2607
     * Test cases using this data provider should expect the following arguments:
2608
     * <code>
2609
     *   array $prioritizedLanguagesList
2610
     *   string $expectedLanguage (if null - use main language)
2611
     * </code>
2612
     *
2613
     * @return array
2614
     */
2615 View Code Duplication
    public function getPrioritizedLanguageList()
2616
    {
2617
        return [
2618
            [[], null],
2619
            [['eng-US'], 'eng-US'],
2620
            [['eng-GB'], 'eng-GB'],
2621
            [['eng-US', 'eng-GB'], 'eng-US'],
2622
            [['eng-GB', 'eng-US'], 'eng-GB'],
2623
            // use non-existent group as the first one
2624
            [['ger-DE'], null],
2625
            [['ger-DE', 'eng-GB'], 'eng-GB'],
2626
        ];
2627
    }
2628
2629
    /**
2630
     * @param int $parentGroupId
2631
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
2632
     */
2633
    private function createMultiLanguageUserGroup($parentGroupId = 4)
2634
    {
2635
        $repository = $this->getRepository();
2636
        $userService = $repository->getUserService();
2637
2638
        // create user group with multiple translations
2639
        $parentGroupId = $this->generateId('group', $parentGroupId);
2640
        $parentGroup = $userService->loadUserGroup($parentGroupId);
2641
2642
        $userGroupCreateStruct = $userService->newUserGroupCreateStruct('eng-US');
2643
        $userGroupCreateStruct->setField('name', 'US user group', 'eng-US');
2644
        $userGroupCreateStruct->setField('name', 'GB user group', 'eng-GB');
2645
        $userGroupCreateStruct->setField('description', 'US user group description', 'eng-US');
2646
        $userGroupCreateStruct->setField('description', 'GB user group description', 'eng-GB');
2647
        $userGroupCreateStruct->alwaysAvailable = true;
2648
2649
        return $userService->createUserGroup($userGroupCreateStruct, $parentGroup);
2650
    }
2651
2652
    /**
2653
     * Create a user group fixture in a variable named <b>$userGroup</b>,.
2654
     *
2655
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
2656
     */
2657 View Code Duplication
    private function createUserGroupVersion1()
2658
    {
2659
        $repository = $this->getRepository();
2660
2661
        $mainGroupId = $this->generateId('group', 4);
2662
        /* BEGIN: Inline */
2663
        // $mainGroupId is the ID of the main "Users" group
2664
2665
        $userService = $repository->getUserService();
2666
2667
        // Load main group
2668
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
2669
2670
        // Instantiate a new create struct
2671
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
2672
        $userGroupCreate->setField('name', 'Example Group');
2673
2674
        // Create the new user group
2675
        $userGroup = $userService->createUserGroup(
2676
            $userGroupCreate,
2677
            $parentUserGroup
2678
        );
2679
        /* END: Inline */
2680
2681
        return $userGroup;
2682
    }
2683
2684
    /**
2685
     * Create user with multiple translations of User Content fields.
2686
     *
2687
     * @param int $userGroupId User group ID (default 13 - Editors)
2688
     *
2689
     * @return \eZ\Publish\API\Repository\Values\User\User
2690
     */
2691
    private function createMultiLanguageUser($userGroupId = 13)
2692
    {
2693
        $repository = $this->getRepository();
2694
        $userService = $repository->getUserService();
2695
2696
        // Instantiate a create struct with mandatory properties
2697
        $randomLogin = md5(mt_rand() . time());
2698
        $userCreateStruct = $userService->newUserCreateStruct(
2699
            $randomLogin,
2700
            "{$randomLogin}@example.com",
2701
            'secret',
2702
            'eng-US'
2703
        );
2704
        $userCreateStruct->enabled = true;
2705
        $userCreateStruct->alwaysAvailable = true;
2706
2707
        // set field for each language
2708
        foreach (['eng-US', 'eng-GB'] as $languageCode) {
2709
            $userCreateStruct->setField('first_name', "{$languageCode} Example", $languageCode);
2710
            $userCreateStruct->setField('last_name', "{$languageCode} User", $languageCode);
2711
            $userCreateStruct->setField('signature', "{$languageCode} signature", $languageCode);
2712
        }
2713
2714
        // Load parent group for the user
2715
        $group = $userService->loadUserGroup($userGroupId);
2716
2717
        // Create a new user
2718
        return $userService->createUser($userCreateStruct, [$group]);
2719
    }
2720
2721
    /**
2722
     * Test for the createUser() method.
2723
     *
2724
     * @see \eZ\Publish\API\Repository\UserService::createUser()
2725
     */
2726
    public function testCreateUserInvalidPasswordHashTypeThrowsException()
2727
    {
2728
        $this->expectException(InvalidArgumentException::class);
2729
        $this->expectExceptionMessage("Argument 'type' is invalid: Password hash type '42424242' is not recognized");
2730
2731
        $repository = $this->getRepository();
2732
        $eventUserService = $repository->getUserService();
2733
2734
        $eventUserServiceReflection = new ReflectionClass($eventUserService);
2735
        $userServiceProperty = $eventUserServiceReflection->getProperty('innerService');
2736
        $userServiceProperty->setAccessible(true);
2737
        $userService = $userServiceProperty->getValue($eventUserService);
2738
2739
        $userServiceReflection = new ReflectionClass($userService);
2740
        $settingsProperty = $userServiceReflection->getProperty('settings');
2741
        $settingsProperty->setAccessible(true);
2742
2743
        $defaultUserServiceSettings = $settingsProperty->getValue($userService);
2744
2745
        /* BEGIN: Use Case */
2746
        $settingsProperty->setValue(
2747
            $userService,
2748
            [
2749
                'hashType' => 42424242, // Non-existing hash type
2750
            ] + $settingsProperty->getValue($userService)
2751
        );
2752
2753
        try {
2754
            $this->createUserVersion1();
2755
        } catch (InvalidArgumentException $e) {
2756
            // Reset to default settings, so we don't break other tests
2757
            $settingsProperty->setValue($userService, $defaultUserServiceSettings);
2758
2759
            throw $e;
2760
        }
2761
        /* END: Use Case */
2762
2763
        // Reset to default settings, so we don't break other tests
2764
        $settingsProperty->setValue($userService, $defaultUserServiceSettings);
2765
    }
2766
2767
    /**
2768
     * Test loading User by Token.
2769
     *
2770
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByToken
2771
     */
2772 View Code Duplication
    public function testLoadUserByToken()
2773
    {
2774
        $repository = $this->getRepository();
2775
        $userService = $repository->getUserService();
2776
2777
        $user = $this->createUserVersion1();
2778
2779
        $userTokenUpdateStruct = new UserTokenUpdateStruct();
2780
        $userTokenUpdateStruct->hashKey = md5('hash');
2781
        $userTokenUpdateStruct->time = new DateTime();
2782
2783
        $userService->updateUserToken($user, $userTokenUpdateStruct);
2784
2785
        $loadedUser = $userService->loadUserByToken($userTokenUpdateStruct->hashKey);
2786
        self::assertEquals($user, $loadedUser);
2787
2788
        return $userTokenUpdateStruct->hashKey;
2789
    }
2790
2791
    /**
2792
     * Test trying to load User by invalid Token.
2793
     *
2794
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByToken
2795
     */
2796
    public function testLoadUserByTokenThrowsNotFoundException()
2797
    {
2798
        $this->expectException(NotFoundException::class);
2799
2800
        $repository = $this->getRepository();
2801
        $userService = $repository->getUserService();
2802
2803
        $user = $this->createUserVersion1();
2804
2805
        $userTokenUpdateStruct = new UserTokenUpdateStruct();
2806
        $userTokenUpdateStruct->hashKey = md5('hash');
2807
        $userTokenUpdateStruct->time = new DateTime();
2808
2809
        $userService->updateUserToken($user, $userTokenUpdateStruct);
2810
2811
        $userService->loadUserByToken('not_existing_token');
2812
    }
2813
2814
    /**
2815
     * Test updating User Token.
2816
     *
2817
     * @covers  \eZ\Publish\API\Repository\UserService::updateUserToken()
2818
     *
2819
     * @depends testLoadUserByToken
2820
     *
2821
     * @param string $originalUserToken
2822
     */
2823 View Code Duplication
    public function testUpdateUserToken($originalUserToken)
2824
    {
2825
        $repository = $this->getRepository(false);
2826
        $userService = $repository->getUserService();
2827
2828
        $user = $userService->loadUserByToken($originalUserToken);
2829
2830
        $userTokenUpdateStruct = new UserTokenUpdateStruct();
2831
        $userTokenUpdateStruct->hashKey = md5('my_updated_hash');
2832
        $userTokenUpdateStruct->time = new DateTime();
2833
2834
        $userService->updateUserToken($user, $userTokenUpdateStruct);
2835
2836
        $loadedUser = $userService->loadUserByToken($userTokenUpdateStruct->hashKey);
2837
        self::assertEquals($user, $loadedUser);
2838
    }
2839
2840
    /**
2841
     * Test invalidating (expiring) User Token.
2842
     *
2843
     * @covers \eZ\Publish\API\Repository\UserService::expireUserToken()
2844
     *
2845
     * @depends testLoadUserByToken
2846
     *
2847
     * @param string $userToken
2848
     */
2849
    public function testExpireUserToken($userToken)
2850
    {
2851
        $this->expectException(NotFoundException::class);
2852
2853
        $repository = $this->getRepository(false);
2854
        $userService = $repository->getUserService();
2855
2856
        // sanity check
2857
        $userService->loadUserByToken($userToken);
2858
2859
        $userService->expireUserToken($userToken);
2860
2861
        // should throw NotFoundException now
2862
        $userService->loadUserByToken($userToken);
2863
    }
2864
2865
    /**
2866
     * @covers \eZ\Publish\API\Repository\UserService::validatePassword()
2867
     */
2868
    public function testValidatePasswordWithDefaultContext()
2869
    {
2870
        $userService = $this->getRepository()->getUserService();
2871
2872
        /* BEGIN: Use Case */
2873
        $errors = $userService->validatePassword('pass');
2874
        /* END: Use Case */
2875
2876
        $this->assertEmpty($errors);
2877
    }
2878
2879
    /**
2880
     * @covers \eZ\Publish\API\Repository\UserService::validatePassword()
2881
     * @dataProvider dataProviderForValidatePassword
2882
     */
2883
    public function testValidatePassword(string $password, array $expectedErrorr)
2884
    {
2885
        $userService = $this->getRepository()->getUserService();
2886
        $contentType = $this->createUserWithStrongPasswordContentType();
2887
2888
        /* BEGIN: Use Case */
2889
        $context = new PasswordValidationContext([
2890
            'contentType' => $contentType,
2891
        ]);
2892
2893
        $actualErrors = $userService->validatePassword($password, $context);
2894
        /* END: Use Case */
2895
2896
        $this->assertEquals($expectedErrorr, $actualErrors);
2897
    }
2898
2899
    /**
2900
     * Data provider for testValidatePassword.
2901
     *
2902
     * @return array
2903
     */
2904
    public function dataProviderForValidatePassword(): array
2905
    {
2906
        return [
2907
            [
2908
                'pass',
2909
                [
2910
                    new ValidationError('User password must be at least %length% characters long', null, [
2911
                        '%length%' => 8,
2912
                    ], 'password'),
2913
                    new ValidationError('User password must include at least one upper case letter', null, [], 'password'),
2914
                    new ValidationError('User password must include at least one number', null, [], 'password'),
2915
                    new ValidationError('User password must include at least one special character', null, [], 'password'),
2916
                ],
2917
            ],
2918
            [
2919
                'H@xxxi0R!!!',
2920
                [],
2921
            ],
2922
        ];
2923
    }
2924
2925
    /**
2926
     * Creates a user with given password.
2927
     *
2928
     * @param string $password
2929
     * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType
2930
     *
2931
     * @return \eZ\Publish\API\Repository\Values\User\User
2932
     */
2933 View Code Duplication
    private function createUserWithPassword(string $password, ContentType $contentType): User
2934
    {
2935
        $userService = $this->getRepository()->getUserService();
2936
        // ID of the "Editors" user group in an eZ Publish demo installation
2937
        $editorsGroupId = 13;
2938
2939
        // Instantiate a create struct with mandatory properties
2940
        $userCreate = $userService->newUserCreateStruct(
2941
            'johndoe',
2942
            '[email protected]',
2943
            $password,
2944
            'eng-US',
2945
            $contentType
2946
        );
2947
        $userCreate->enabled = true;
2948
        $userCreate->setField('first_name', 'John');
2949
        $userCreate->setField('last_name', 'Doe');
2950
2951
        return $userService->createUser($userCreate, [
2952
            $userService->loadUserGroup($editorsGroupId),
2953
        ]);
2954
    }
2955
2956
    /**
2957
     * Creates the User Content Type with password constraints.
2958
     *
2959
     * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType
2960
     */
2961
    private function createUserWithStrongPasswordContentType(): ContentType
2962
    {
2963
        $repository = $this->getRepository();
2964
2965
        $contentTypeService = $repository->getContentTypeService();
2966
2967
        $typeCreate = $contentTypeService->newContentTypeCreateStruct('user-with-strong-password');
2968
        $typeCreate->mainLanguageCode = 'eng-GB';
2969
        $typeCreate->remoteId = '384b94a1bd6bc06826410e284dd9684887bf56fc';
2970
        $typeCreate->urlAliasSchema = 'url|scheme';
2971
        $typeCreate->nameSchema = 'name|scheme';
2972
        $typeCreate->names = [
2973
            'eng-GB' => 'User with strong password',
2974
        ];
2975
        $typeCreate->descriptions = [
2976
            'eng-GB' => '',
2977
        ];
2978
        $typeCreate->creatorId = $this->generateId('user', $repository->getCurrentUser()->id);
0 ignored issues
show
Deprecated Code introduced by
The method eZ\Publish\API\Repositor...itory::getCurrentUser() has been deprecated with message: since 6.6, to be removed. Use PermissionResolver::getCurrentUserReference() instead. Get current user. Loads the full user object if not already loaded, if you only need to know user id use {@see getCurrentUserReference()}

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...
2979
        $typeCreate->creationDate = $this->createDateTime();
2980
2981
        $firstNameFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct('first_name', 'ezstring');
2982
        $firstNameFieldCreate->names = [
2983
            'eng-GB' => 'First name',
2984
        ];
2985
        $firstNameFieldCreate->descriptions = [
2986
            'eng-GB' => '',
2987
        ];
2988
        $firstNameFieldCreate->fieldGroup = 'default';
2989
        $firstNameFieldCreate->position = 1;
2990
        $firstNameFieldCreate->isTranslatable = false;
2991
        $firstNameFieldCreate->isRequired = true;
2992
        $firstNameFieldCreate->isInfoCollector = false;
2993
        $firstNameFieldCreate->validatorConfiguration = [
2994
            'StringLengthValidator' => [
2995
                'minStringLength' => 0,
2996
                'maxStringLength' => 0,
2997
            ],
2998
        ];
2999
        $firstNameFieldCreate->fieldSettings = [];
3000
        $firstNameFieldCreate->isSearchable = true;
3001
        $firstNameFieldCreate->defaultValue = '';
3002
3003
        $typeCreate->addFieldDefinition($firstNameFieldCreate);
3004
3005
        $lastNameFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct('last_name', 'ezstring');
3006
        $lastNameFieldCreate->names = [
3007
            'eng-GB' => 'Last name',
3008
        ];
3009
        $lastNameFieldCreate->descriptions = [
3010
            'eng-GB' => '',
3011
        ];
3012
        $lastNameFieldCreate->fieldGroup = 'default';
3013
        $lastNameFieldCreate->position = 2;
3014
        $lastNameFieldCreate->isTranslatable = false;
3015
        $lastNameFieldCreate->isRequired = true;
3016
        $lastNameFieldCreate->isInfoCollector = false;
3017
        $lastNameFieldCreate->validatorConfiguration = [
3018
            'StringLengthValidator' => [
3019
                'minStringLength' => 0,
3020
                'maxStringLength' => 0,
3021
            ],
3022
        ];
3023
        $lastNameFieldCreate->fieldSettings = [];
3024
        $lastNameFieldCreate->isSearchable = true;
3025
        $lastNameFieldCreate->defaultValue = '';
3026
3027
        $typeCreate->addFieldDefinition($lastNameFieldCreate);
3028
3029
        $accountFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct('account', 'ezuser');
3030
        $accountFieldCreate->names = [
3031
            'eng-GB' => 'User account',
3032
        ];
3033
        $accountFieldCreate->descriptions = [
3034
            'eng-GB' => '',
3035
        ];
3036
        $accountFieldCreate->fieldGroup = 'default';
3037
        $accountFieldCreate->position = 3;
3038
        $accountFieldCreate->isTranslatable = false;
3039
        $accountFieldCreate->isRequired = true;
3040
        $accountFieldCreate->isInfoCollector = false;
3041
        $accountFieldCreate->validatorConfiguration = [
3042
            'PasswordValueValidator' => [
3043
                'requireAtLeastOneUpperCaseCharacter' => 1,
3044
                'requireAtLeastOneLowerCaseCharacter' => 1,
3045
                'requireAtLeastOneNumericCharacter' => 1,
3046
                'requireAtLeastOneNonAlphanumericCharacter' => 1,
3047
                'minLength' => 8,
3048
            ],
3049
        ];
3050
        $accountFieldCreate->fieldSettings = [];
3051
        $accountFieldCreate->isSearchable = false;
3052
        $accountFieldCreate->defaultValue = null;
3053
3054
        $typeCreate->addFieldDefinition($accountFieldCreate);
3055
3056
        $contentTypeDraft = $contentTypeService->createContentType($typeCreate, [
3057
            $contentTypeService->loadContentTypeGroupByIdentifier('Users'),
3058
        ]);
3059
        $contentTypeService->publishContentTypeDraft($contentTypeDraft);
3060
3061
        return $contentTypeService->loadContentTypeByIdentifier('user-with-strong-password');
3062
    }
3063
}
3064