Completed
Push — EZP-30807 ( bb4c29 )
by
unknown
22:04
created

UserServiceTest::testUpdateUserNoPassword()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 62

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 62
rs 8.829
c 0
b 0
f 0

How to fix   Long Method   

Long Method

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

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

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * File 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('\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup', $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('\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup', $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->assertNull($userGroup->parentId, 'parentId should be null a when user has no access to it');
99
    }
100
101
    /**
102
     * Test for the loadUserGroup() method.
103
     *
104
     * @see \eZ\Publish\API\Repository\UserService::loadUserGroup()
105
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
106
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
107
     */
108
    public function testLoadUserGroupThrowsNotFoundException()
109
    {
110
        $repository = $this->getRepository();
111
112
        $nonExistingGroupId = $this->generateId('group', self::DB_INT_MAX);
113
        /* BEGIN: Use Case */
114
        $userService = $repository->getUserService();
115
116
        // This call will fail with a NotFoundException
117
        $userService->loadUserGroup($nonExistingGroupId);
118
        /* END: Use Case */
119
    }
120
121
    /**
122
     * Test for the loadSubUserGroups() method.
123
     *
124
     * @see \eZ\Publish\API\Repository\UserService::loadSubUserGroups()
125
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
126
     */
127
    public function testLoadSubUserGroups()
128
    {
129
        $repository = $this->getRepository();
130
131
        $mainGroupId = $this->generateId('group', 4);
132
        /* BEGIN: Use Case */
133
        // $mainGroupId is the ID of the main "Users" group
134
135
        $userService = $repository->getUserService();
136
137
        $userGroup = $userService->loadUserGroup($mainGroupId);
138
139
        $subUserGroups = $userService->loadSubUserGroups($userGroup);
140
        foreach ($subUserGroups as $subUserGroup) {
141
            // Do something with the $subUserGroup
142
            $this->assertInstanceOf('\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup', $subUserGroup);
143
        }
144
        /* END: Use Case */
145
    }
146
147
    /**
148
     * Test loading sub groups throwing NotFoundException.
149
     *
150
     * @covers \eZ\Publish\API\Repository\UserService::loadSubUserGroups
151
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
152
     */
153 View Code Duplication
    public function testLoadSubUserGroupsThrowsNotFoundException()
154
    {
155
        $repository = $this->getRepository();
156
        $userService = $repository->getUserService();
157
158
        $parentGroup = new UserGroup(
159
            [
160
                'content' => new Content(
161
                    [
162
                        'versionInfo' => new VersionInfo(
163
                            [
164
                                'contentInfo' => new ContentInfo(
165
                                ['id' => 123456]
166
                            ),
167
                            ]
168
                        ),
169
                        'internalFields' => [],
170
                    ]
171
                ),
172
            ]
173
        );
174
        $userService->loadSubUserGroups($parentGroup);
175
    }
176
177
    /**
178
     * Test for the newUserGroupCreateStruct() method.
179
     *
180
     * @return \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct
181
     *
182
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
183
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
184
     */
185
    public function testNewUserGroupCreateStruct()
186
    {
187
        $repository = $this->getRepository();
188
189
        /* BEGIN: Use Case */
190
        $userService = $repository->getUserService();
191
192
        $groupCreate = $userService->newUserGroupCreateStruct('eng-US');
193
        /* END: Use Case */
194
195
        $this->assertInstanceOf(
196
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroupCreateStruct',
197
            $groupCreate
198
        );
199
200
        return $groupCreate;
201
    }
202
203
    /**
204
     * Test for the newUserGroupCreateStruct() method.
205
     *
206
     * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $groupCreate
207
     *
208
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
209
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
210
     */
211
    public function testNewUserGroupCreateStructSetsMainLanguageCode($groupCreate)
212
    {
213
        $this->assertEquals('eng-US', $groupCreate->mainLanguageCode);
214
    }
215
216
    /**
217
     * Test for the newUserGroupCreateStruct() method.
218
     *
219
     * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $groupCreate
220
     *
221
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
222
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
223
     */
224
    public function testNewUserGroupCreateStructSetsContentType($groupCreate)
225
    {
226
        $this->assertInstanceOf(
227
            '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType',
228
            $groupCreate->contentType
229
        );
230
    }
231
232
    /**
233
     * Test for the newUserGroupCreateStruct() method.
234
     *
235
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct($mainLanguageCode, $contentType)
236
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
237
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
238
     */
239 View Code Duplication
    public function testNewUserGroupCreateStructWithSecondParameter()
240
    {
241
        if ($this->isVersion4()) {
242
            $this->markTestSkipped('This test is only relevant for eZ Publish versions > 4');
243
        }
244
245
        $repository = $this->getRepository();
246
247
        /* BEGIN: Use Case */
248
        $contentTypeService = $repository->getContentTypeService();
249
        $userService = $repository->getUserService();
250
251
        // Load the default ContentType for user groups
252
        $groupType = $contentTypeService->loadContentTypeByIdentifier('user_group');
253
254
        // Instantiate a new group create struct
255
        $groupCreate = $userService->newUserGroupCreateStruct(
256
            'eng-US',
257
            $groupType
258
        );
259
        /* END: Use Case */
260
261
        $this->assertSame($groupType, $groupCreate->contentType);
262
    }
263
264
    /**
265
     * Test for the createUserGroup() method.
266
     *
267
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
268
     *
269
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
270
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
271
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
272
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
273
     */
274
    public function testCreateUserGroup()
275
    {
276
        /* BEGIN: Use Case */
277
        $userGroup = $this->createUserGroupVersion1();
278
        /* END: Use Case */
279
280
        $this->assertInstanceOf(
281
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup',
282
            $userGroup
283
        );
284
285
        $versionInfo = $userGroup->getVersionInfo();
286
287
        $this->assertEquals(APIVersionInfo::STATUS_PUBLISHED, $versionInfo->status);
288
        $this->assertEquals(1, $versionInfo->versionNo);
289
290
        return $userGroup;
291
    }
292
293
    /**
294
     * Test for the createUserGroup() method.
295
     *
296
     * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup
297
     *
298
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
299
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
300
     */
301
    public function testCreateUserGroupSetsExpectedProperties($userGroup)
302
    {
303
        $this->assertEquals(
304
            [
305
                'parentId' => $this->generateId('group', 4),
306
            ],
307
            [
308
                'parentId' => $userGroup->parentId,
309
            ]
310
        );
311
    }
312
313
    /**
314
     * Test for the createUserGroup() method.
315
     *
316
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
317
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
318
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
319
     */
320
    public function testCreateUserGroupThrowsInvalidArgumentException()
321
    {
322
        $repository = $this->getRepository();
323
324
        $mainGroupId = $this->generateId('group', 4);
325
        /* BEGIN: Use Case */
326
        // $mainGroupId is the ID of the main "Users" group
327
328
        $userService = $repository->getUserService();
329
330
        // Load main group
331
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
332
333
        // Instantiate a new create struct
334
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
335
        $userGroupCreate->setField('name', 'Example Group');
336
        $userGroupCreate->remoteId = '5f7f0bdb3381d6a461d8c29ff53d908f';
337
338
        // This call will fail with an "InvalidArgumentException", because the
339
        // specified remoteId is already used for the "Members" user group.
340
        $userService->createUserGroup(
341
            $userGroupCreate,
342
            $parentUserGroup
343
        );
344
        /* END: Use Case */
345
    }
346
347
    /**
348
     * Test for the createUserGroup() method.
349
     *
350
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
351
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
352
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
353
     */
354
    public function testCreateUserGroupThrowsInvalidArgumentExceptionFieldTypeNotAccept()
355
    {
356
        $repository = $this->getRepository();
357
358
        $mainGroupId = $this->generateId('group', 4);
359
        /* BEGIN: Use Case */
360
        // $mainGroupId is the ID of the main "Users" group
361
362
        $userService = $repository->getUserService();
363
364
        // Load main group
365
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
366
367
        // Instantiate a new create struct
368
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
369
        $userGroupCreate->setField('name', new \stdClass());
370
371
        // This call will fail with an "InvalidArgumentException", because the
372
        // specified remoteId is already used for the "Members" user group.
373
        $userService->createUserGroup(
374
            $userGroupCreate,
375
            $parentUserGroup
376
        );
377
        /* END: Use Case */
378
    }
379
380
    /**
381
     * Test for the createUserGroup() method.
382
     *
383
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
384
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException
385
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
386
     */
387 View Code Duplication
    public function testCreateUserGroupWhenMissingField()
388
    {
389
        $repository = $this->getRepository();
390
391
        $mainGroupId = $this->generateId('group', 4);
392
        /* BEGIN: Use Case */
393
        // $mainGroupId is the ID of the main "Users" group
394
395
        $userService = $repository->getUserService();
396
397
        // Load main group
398
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
399
400
        // Instantiate a new create struct
401
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
402
403
        // This call will fail with a "ContentFieldValidationException", because the
404
        // only mandatory field "name" is not set.
405
        $userService->createUserGroup($userGroupCreate, $parentUserGroup);
406
        /* END: Use Case */
407
    }
408
409
    /**
410
     * Test for the createUserGroup() method.
411
     *
412
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
413
     *
414
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
415
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
416
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
417
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
418
     */
419
    public function testCreateUserGroupInTransactionWithRollback()
420
    {
421
        $repository = $this->getRepository();
422
423
        $mainGroupId = $this->generateId('group', 4);
424
        /* BEGIN: Use Case */
425
        // $mainGroupId is the ID of the main "Users" group
426
427
        $userService = $repository->getUserService();
428
429
        $repository->beginTransaction();
430
431
        try {
432
            // Load main group
433
            $parentUserGroup = $userService->loadUserGroup($mainGroupId);
434
435
            // Instantiate a new create struct
436
            $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
437
            $userGroupCreate->setField('name', 'Example Group');
438
439
            // Create the new user group
440
            $createdUserGroupId = $userService->createUserGroup(
441
                $userGroupCreate,
442
                $parentUserGroup
443
            )->id;
444
        } catch (Exception $e) {
445
            // Cleanup hanging transaction on error
446
            $repository->rollback();
447
            throw $e;
448
        }
449
450
        $repository->rollback();
451
452
        try {
453
            // Throws exception since creation of user group was rolled back
454
            $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...
455
        } catch (NotFoundException $e) {
456
            return;
457
        }
458
        /* END: Use Case */
459
460
        $this->fail('User group object still exists after rollback.');
461
    }
462
463
    /**
464
     * Test for the deleteUserGroup() method.
465
     *
466
     * @see \eZ\Publish\API\Repository\UserService::deleteUserGroup()
467
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
468
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
469
     */
470
    public function testDeleteUserGroup()
471
    {
472
        $repository = $this->getRepository();
473
        $userService = $repository->getUserService();
474
475
        /* BEGIN: Use Case */
476
        $userGroup = $this->createUserGroupVersion1();
477
478
        // Delete the currently created user group again
479
        $userService->deleteUserGroup($userGroup);
480
        /* END: Use Case */
481
482
        // We use the NotFoundException here for verification
483
        $userService->loadUserGroup($userGroup->id);
484
    }
485
486
    /**
487
     * Test deleting user group throwing NotFoundException.
488
     *
489
     * @covers \eZ\Publish\API\Repository\UserService::deleteUserGroup
490
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
491
     */
492 View Code Duplication
    public function testDeleteUserGroupThrowsNotFoundException()
493
    {
494
        $repository = $this->getRepository();
495
        $userService = $repository->getUserService();
496
497
        $userGroup = new UserGroup(
498
            [
499
                'content' => new Content(
500
                    [
501
                        'versionInfo' => new VersionInfo(
502
                            ['contentInfo' => new ContentInfo(['id' => 123456])]
503
                        ),
504
                        'internalFields' => [],
505
                    ]
506
                ),
507
            ]
508
        );
509
        $userService->deleteUserGroup($userGroup);
510
    }
511
512
    /**
513
     * Test for the moveUserGroup() method.
514
     *
515
     * @see \eZ\Publish\API\Repository\UserService::moveUserGroup()
516
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
517
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadSubUserGroups
518
     */
519
    public function testMoveUserGroup()
520
    {
521
        $repository = $this->getRepository();
522
        $userService = $repository->getUserService();
523
524
        $membersGroupId = $this->generateId('group', 13);
525
        /* BEGIN: Use Case */
526
        // $membersGroupId is the ID of the "Members" user group in an eZ
527
        // Publish demo installation
528
529
        $userGroup = $this->createUserGroupVersion1();
530
531
        // Load the new parent group
532
        $membersUserGroup = $userService->loadUserGroup($membersGroupId);
533
534
        // Move user group from "Users" to "Members"
535
        $userService->moveUserGroup($userGroup, $membersUserGroup);
536
537
        // Reload the user group to get an updated $parentId
538
        $userGroup = $userService->loadUserGroup($userGroup->id);
539
540
        $this->refreshSearch($repository);
541
542
        // The returned array will no contain $userGroup
543
        $subUserGroups = $userService->loadSubUserGroups(
544
            $membersUserGroup
545
        );
546
        /* END: Use Case */
547
548
        $subUserGroupIds = array_map(
549
            function ($content) {
550
                return $content->id;
551
            },
552
            $subUserGroups
553
        );
554
555
        $this->assertEquals($membersGroupId, $userGroup->parentId);
556
        $this->assertEquals([$userGroup->id], $subUserGroupIds);
557
    }
558
559
    /**
560
     * Test moving a user group below another group throws NotFoundException.
561
     *
562
     * @covers \eZ\Publish\API\Repository\UserService::moveUserGroup
563
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
564
     */
565
    public function testMoveUserGroupThrowsNotFoundException()
566
    {
567
        $repository = $this->getRepository();
568
        $userService = $repository->getUserService();
569
570
        $userGroupToMove = new UserGroup(
571
            [
572
                'content' => new Content(
573
                    [
574
                        'versionInfo' => new VersionInfo(
575
                            ['contentInfo' => new ContentInfo(['id' => 123456])]
576
                        ),
577
                        'internalFields' => [],
578
                    ]
579
                ),
580
            ]
581
        );
582
        $parentUserGroup = new UserGroup(
583
            [
584
                'content' => new Content(
585
                    [
586
                        'versionInfo' => new VersionInfo(
587
                            ['contentInfo' => new ContentInfo(['id' => 123455])]
588
                        ),
589
                        'internalFields' => [],
590
                    ]
591
                ),
592
            ]
593
        );
594
        $userService->moveUserGroup($userGroupToMove, $parentUserGroup);
595
    }
596
597
    /**
598
     * Test for the newUserGroupUpdateStruct() method.
599
     *
600
     * @covers \eZ\Publish\API\Repository\UserService::newUserGroupUpdateStruct
601
     */
602
    public function testNewUserGroupUpdateStruct()
603
    {
604
        $repository = $this->getRepository();
605
606
        /* BEGIN: Use Case */
607
        $userService = $repository->getUserService();
608
609
        $groupUpdate = $userService->newUserGroupUpdateStruct();
610
        /* END: Use Case */
611
612
        $this->assertInstanceOf(
613
            UserGroupUpdateStruct::class,
614
            $groupUpdate
615
        );
616
617
        $this->assertNull($groupUpdate->contentUpdateStruct);
618
        $this->assertNull($groupUpdate->contentMetadataUpdateStruct);
619
    }
620
621
    /**
622
     * Test for the updateUserGroup() method.
623
     *
624
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
625
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
626
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupUpdateStruct
627
     */
628
    public function testUpdateUserGroup()
629
    {
630
        $repository = $this->getRepository();
631
        $userService = $repository->getUserService();
632
633
        /* BEGIN: Use Case */
634
        $userGroup = $this->createUserGroupVersion1();
635
636
        // Create a group update struct and change nothing
637
        $groupUpdate = $userService->newUserGroupUpdateStruct();
638
639
        // This update will do nothing
640
        $userGroup = $userService->updateUserGroup(
641
            $userGroup,
642
            $groupUpdate
643
        );
644
        /* END: Use Case */
645
646
        $this->assertInstanceOf(
647
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup',
648
            $userGroup
649
        );
650
651
        $this->assertEquals(1, $userGroup->getVersionInfo()->versionNo);
652
    }
653
654
    /**
655
     * Test for the updateUserGroup() method.
656
     *
657
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
658
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
659
     */
660 View Code Duplication
    public function testUpdateUserGroupWithSubContentUpdateStruct()
661
    {
662
        $repository = $this->getRepository();
663
        $userService = $repository->getUserService();
664
665
        /* BEGIN: Use Case */
666
        $userGroup = $this->createUserGroupVersion1();
667
668
        // Load the content service
669
        $contentService = $repository->getContentService();
670
671
        // Create a content update struct and update the group name
672
        $contentUpdate = $contentService->newContentUpdateStruct();
673
        $contentUpdate->setField('name', 'Sindelfingen', 'eng-US');
674
675
        // Create a group update struct and set content update struct
676
        $groupUpdate = $userService->newUserGroupUpdateStruct();
677
        $groupUpdate->contentUpdateStruct = $contentUpdate;
678
679
        // This will update the name and the increment the group version number
680
        $userGroup = $userService->updateUserGroup(
681
            $userGroup,
682
            $groupUpdate
683
        );
684
        /* END: Use Case */
685
686
        $this->assertEquals('Sindelfingen', $userGroup->getFieldValue('name', 'eng-US'));
687
688
        $versionInfo = $userGroup->getVersionInfo();
689
690
        $this->assertEquals(APIVersionInfo::STATUS_PUBLISHED, $versionInfo->status);
691
        $this->assertEquals(2, $versionInfo->versionNo);
692
    }
693
694
    /**
695
     * Test for the updateUserGroup() method.
696
     *
697
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
698
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
699
     */
700
    public function testUpdateUserGroupWithSubContentMetadataUpdateStruct()
701
    {
702
        $repository = $this->getRepository();
703
        $userService = $repository->getUserService();
704
705
        /* BEGIN: Use Case */
706
        $userGroup = $this->createUserGroupVersion1();
707
708
        // Load the content service
709
        $contentService = $repository->getContentService();
710
711
        // Create a metadata update struct and change the remoteId
712
        $metadataUpdate = $contentService->newContentMetadataUpdateStruct();
713
        $metadataUpdate->remoteId = '3c61299780663bafa3af2101e52125da';
714
715
        // Create a group update struct and set content update struct
716
        $groupUpdate = $userService->newUserGroupUpdateStruct();
717
        $groupUpdate->contentMetadataUpdateStruct = $metadataUpdate;
718
719
        // This will update the name and the increment the group version number
720
        $userGroup = $userService->updateUserGroup(
721
            $userGroup,
722
            $groupUpdate
723
        );
724
        /* END: Use Case */
725
726
        $this->assertEquals(
727
            '3c61299780663bafa3af2101e52125da',
728
            $userGroup->contentInfo->remoteId
729
        );
730
731
        $versionInfo = $userGroup->getVersionInfo();
732
733
        $this->assertEquals(APIVersionInfo::STATUS_PUBLISHED, $versionInfo->status);
734
        $this->assertEquals(1, $versionInfo->versionNo);
735
    }
736
737
    /**
738
     * Test for the updateUserGroup() method.
739
     *
740
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
741
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
742
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
743
     */
744 View Code Duplication
    public function testUpdateUserGroupThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
745
    {
746
        $repository = $this->getRepository();
747
        $userService = $repository->getUserService();
748
749
        /* BEGIN: Use Case */
750
        $userGroup = $this->createUserGroupVersion1();
751
752
        // Load the content service
753
        $contentService = $repository->getContentService();
754
755
        // Create a content update struct and update the group name
756
        $contentUpdate = $contentService->newContentUpdateStruct();
757
        // An object of stdClass is not accepted as a value by the field "name"
758
        $contentUpdate->setField('name', new \stdClass(), 'eng-US');
759
760
        // Create a group update struct and set content update struct
761
        $groupUpdate = $userService->newUserGroupUpdateStruct();
762
        $groupUpdate->contentUpdateStruct = $contentUpdate;
763
764
        // This call will fail with an InvalidArgumentException, because the
765
        // field "name" does not accept the given value
766
        $userService->updateUserGroup($userGroup, $groupUpdate);
767
        /* END: Use Case */
768
    }
769
770
    /**
771
     * Test for the newUserCreateStruct() method.
772
     *
773
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct()
774
     */
775
    public function testNewUserCreateStruct()
776
    {
777
        $repository = $this->getRepository();
778
779
        /* BEGIN: Use Case */
780
        $userService = $repository->getUserService();
781
782
        $userCreate = $userService->newUserCreateStruct(
783
            'user',
784
            '[email protected]',
785
            'secret',
786
            'eng-US'
787
        );
788
        /* END: Use Case */
789
790
        $this->assertInstanceOf(
791
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserCreateStruct',
792
            $userCreate
793
        );
794
795
        return $userCreate;
796
    }
797
798
    /**
799
     * Test updating a user group throws ContentFieldValidationException.
800
     *
801
     * @covers \eZ\Publish\API\Repository\UserService::updateUserGroup
802
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException
803
     */
804
    public function testUpdateUserGroupThrowsContentFieldValidationExceptionOnRequiredFieldEmpty()
805
    {
806
        $repository = $this->getRepository();
807
        $userService = $repository->getUserService();
808
        $contentService = $repository->getContentService();
809
810
        $userGroup = $userService->loadUserGroup(42);
811
        $userGroupUpdateStruct = $userService->newUserGroupUpdateStruct();
812
        $userGroupUpdateStruct->contentUpdateStruct = $contentService->newContentUpdateStruct();
813
        $userGroupUpdateStruct->contentUpdateStruct->setField('name', '', 'eng-US');
814
815
        $userService->updateUserGroup($userGroup, $userGroupUpdateStruct);
816
    }
817
818
    /**
819
     * Test for the newUserCreateStruct() method.
820
     *
821
     * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreate
822
     *
823
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct()
824
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
825
     */
826
    public function testNewUserCreateStructSetsExpectedProperties($userCreate)
827
    {
828
        $this->assertEquals(
829
            [
830
                'login' => 'user',
831
                'email' => '[email protected]',
832
                'password' => 'secret',
833
                'mainLanguageCode' => 'eng-US',
834
            ],
835
            [
836
                'login' => $userCreate->login,
837
                'email' => $userCreate->email,
838
                'password' => $userCreate->password,
839
                'mainLanguageCode' => $userCreate->mainLanguageCode,
840
            ]
841
        );
842
    }
843
844
    /**
845
     * Test for the newUserCreateStruct() method.
846
     *
847
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct($login, $email, $password, $mainLanguageCode, $contentType)
848
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
849
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
850
     */
851 View Code Duplication
    public function testNewUserCreateStructWithFifthParameter()
852
    {
853
        if ($this->isVersion4()) {
854
            $this->markTestSkipped('This test is only relevant for eZ Publish versions > 4');
855
        }
856
857
        $repository = $this->getRepository();
858
859
        /* BEGIN: Use Case */
860
        $contentTypeService = $repository->getContentTypeService();
861
        $userService = $repository->getUserService();
862
863
        $userType = $contentTypeService->loadContentTypeByIdentifier('user');
864
865
        $userCreate = $userService->newUserCreateStruct(
866
            'user',
867
            '[email protected]',
868
            'secret',
869
            'eng-US',
870
            $userType
871
        );
872
        /* END: Use Case */
873
874
        $this->assertSame($userType, $userCreate->contentType);
875
    }
876
877
    /**
878
     * Test for creating user with Active Directory login name.
879
     */
880 View Code Duplication
    public function testNewUserWithDomainName()
881
    {
882
        $repository = $this->getRepository();
883
        $userService = $repository->getUserService();
884
        $createdUser = $this->createUserVersion1('ez-user-Domain\username-by-login');
885
        $loadedUser = $userService->loadUserByLogin('ez-user-Domain\username-by-login');
886
887
        $this->assertEquals($createdUser, $loadedUser);
888
    }
889
890
    /**
891
     * Test for the createUser() method.
892
     *
893
     * @return \eZ\Publish\API\Repository\Values\User\User
894
     *
895
     * @see \eZ\Publish\API\Repository\UserService::createUser()
896
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
897
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
898
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
899
     */
900
    public function testCreateUser()
901
    {
902
        /* BEGIN: Use Case */
903
        $user = $this->createUserVersion1();
904
        /* END: Use Case */
905
906
        $this->assertInstanceOf(
907
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\User',
908
            $user
909
        );
910
911
        return $user;
912
    }
913
914
    /**
915
     * Test for the createUser() method.
916
     *
917
     * @param \eZ\Publish\API\Repository\Values\User\User $user
918
     *
919
     * @see \eZ\Publish\API\Repository\UserService::createUser()
920
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
921
     */
922
    public function testCreateUserSetsExpectedProperties(User $user)
923
    {
924
        $this->assertEquals(
925
            [
926
                'login' => 'user',
927
                'email' => '[email protected]',
928
                'mainLanguageCode' => 'eng-US',
929
            ],
930
            [
931
                'login' => $user->login,
932
                'email' => $user->email,
933
                'mainLanguageCode' => $user->contentInfo->mainLanguageCode,
934
            ]
935
        );
936
    }
937
938
    /**
939
     * Test for the createUser() method.
940
     *
941
     * @see \eZ\Publish\API\Repository\UserService::createUser()
942
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException
943
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
944
     */
945
    public function testCreateUserWhenMissingField()
946
    {
947
        $repository = $this->getRepository();
948
949
        $editorsGroupId = $this->generateId('group', 13);
950
        /* BEGIN: Use Case */
951
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
952
        // Publish demo installation
953
954
        $userService = $repository->getUserService();
955
956
        // Instantiate a create struct with mandatory properties
957
        $userCreate = $userService->newUserCreateStruct(
958
            'user',
959
            '[email protected]',
960
            'secret',
961
            'eng-US'
962
        );
963
964
        // Do not set the mandatory fields "first_name" and "last_name"
965
        //$userCreate->setField( 'first_name', 'Example' );
966
        //$userCreate->setField( 'last_name', 'User' );
967
968
        // Load parent group for the user
969
        $group = $userService->loadUserGroup($editorsGroupId);
970
971
        // This call will fail with a "ContentFieldValidationException", because the
972
        // mandatory fields "first_name" and "last_name" are not set.
973
        $userService->createUser($userCreate, [$group]);
974
        /* END: Use Case */
975
    }
976
977
    /**
978
     * Test for the createUser() method.
979
     *
980
     * @see \eZ\Publish\API\Repository\UserService::createUser()
981
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
982
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
983
     */
984 View Code Duplication
    public function testCreateUserThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
985
    {
986
        $repository = $this->getRepository();
987
988
        $editorsGroupId = $this->generateId('group', 13);
989
        /* BEGIN: Use Case */
990
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
991
        // Publish demo installation
992
993
        $userService = $repository->getUserService();
994
995
        // Instantiate a create struct with mandatory properties
996
        $userCreate = $userService->newUserCreateStruct(
997
            'user',
998
            '[email protected]',
999
            'secret',
1000
            'eng-US'
1001
        );
1002
1003
        // An object of stdClass is not a valid value for the field first_name
1004
        $userCreate->setField('first_name', new \stdClass());
1005
        $userCreate->setField('last_name', 'User');
1006
1007
        // Load parent group for the user
1008
        $group = $userService->loadUserGroup($editorsGroupId);
1009
1010
        // This call will fail with an "InvalidArgumentException", because the
1011
        // value for the firled "first_name" is not accepted by the field type.
1012
        $userService->createUser($userCreate, [$group]);
1013
        /* END: Use Case */
1014
    }
1015
1016
    /**
1017
     * Test for the createUser() method.
1018
     *
1019
     * @covers \eZ\Publish\API\Repository\UserService::createUser
1020
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1021
     * @expectedExceptionMessage Argument 'userCreateStruct' is invalid: User with provided login already exists
1022
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1023
     */
1024 View Code Duplication
    public function testCreateUserThrowsInvalidArgumentException()
1025
    {
1026
        $repository = $this->getRepository();
1027
1028
        $editorsGroupId = $this->generateId('group', 13);
1029
        /* BEGIN: Use Case */
1030
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
1031
        // Publish demo installation
1032
1033
        $userService = $repository->getUserService();
1034
1035
        // Instantiate a create struct with mandatory properties
1036
        $userCreate = $userService->newUserCreateStruct(
1037
            // admin is an existing login
1038
            'admin',
1039
            '[email protected]',
1040
            'secret',
1041
            'eng-US'
1042
        );
1043
1044
        $userCreate->setField('first_name', 'Example');
1045
        $userCreate->setField('last_name', 'User');
1046
1047
        // Load parent group for the user
1048
        $group = $userService->loadUserGroup($editorsGroupId);
1049
1050
        // This call will fail with a "InvalidArgumentException", because the
1051
        // user with "admin" login already exists.
1052
        $userService->createUser($userCreate, [$group]);
1053
        /* END: Use Case */
1054
    }
1055
1056
    /**
1057
     * Test for the createUser() method.
1058
     *
1059
     * @return \eZ\Publish\API\Repository\Values\User\User
1060
     *
1061
     * @see \eZ\Publish\API\Repository\UserService::createUser()
1062
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
1063
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
1064
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
1065
     */
1066
    public function testCreateUserInTransactionWithRollback()
1067
    {
1068
        $repository = $this->getRepository();
1069
        $userService = $repository->getUserService();
1070
1071
        /* BEGIN: Use Case */
1072
        $repository->beginTransaction();
1073
1074
        try {
1075
            $user = $this->createUserVersion1();
1076
        } catch (Exception $e) {
1077
            // Cleanup hanging transaction on error
1078
            $repository->rollback();
1079
            throw $e;
1080
        }
1081
1082
        $repository->rollback();
1083
1084
        try {
1085
            // Throws exception since creation of user was rolled back
1086
            $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...
1087
        } catch (NotFoundException $e) {
1088
            return;
1089
        }
1090
        /* END: Use Case */
1091
1092
        $this->fail('User object still exists after rollback.');
1093
    }
1094
1095
    /**
1096
     * Test creating a user throwing NotFoundException.
1097
     *
1098
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1099
     * @covers \eZ\Publish\API\Repository\UserService::createUser
1100
     */
1101
    public function testCreateUserThrowsNotFoundException()
1102
    {
1103
        $repository = $this->getRepository();
1104
        $userService = $repository->getUserService();
1105
1106
        $userCreateStruct = $userService->newUserCreateStruct('new_user', '[email protected]', 'password', 'eng-GB');
1107
        $userCreateStruct->setField('first_name', 'New');
1108
        $userCreateStruct->setField('last_name', 'User');
1109
1110
        $parentGroup = new UserGroup(
1111
            [
1112
                'content' => new Content(
1113
                    [
1114
                        'versionInfo' => new VersionInfo(
1115
                            [
1116
                                'contentInfo' => new ContentInfo(['id' => 123456]),
1117
                            ]
1118
                        ),
1119
                        'internalFields' => [],
1120
                    ]
1121
                ),
1122
            ]
1123
        );
1124
        $userService->createUser($userCreateStruct, [$parentGroup]);
1125
    }
1126
1127
    /**
1128
     * Test creating a user throwing UserPasswordValidationException when password doesn't follow specific rules.
1129
     *
1130
     * @expectedException \eZ\Publish\Core\Base\Exceptions\UserPasswordValidationException
1131
     * @expectedExceptionMessage 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
1132
     * @covers \eZ\Publish\API\Repository\UserService::createUser
1133
     */
1134
    public function testCreateUserWithWeakPasswordThrowsUserPasswordValidationException()
1135
    {
1136
        $userContentType = $this->createUserWithStrongPasswordContentType();
1137
1138
        /* BEGIN: Use Case */
1139
        // This call will fail with a "UserPasswordValidationException" because the
1140
        // the password does not follow specified rules.
1141
        $this->createUserWithPassword('pass', $userContentType);
1142
        /* END: Use Case */
1143
    }
1144
1145
    /**
1146
     * Opposite test case for testCreateUserWithWeakPasswordThrowsUserPasswordValidationException.
1147
     *
1148
     * @covers \eZ\Publish\API\Repository\UserService::createUser
1149
     */
1150
    public function testCreateUserWithStrongPassword()
1151
    {
1152
        $userContentType = $this->createUserWithStrongPasswordContentType();
1153
1154
        /* BEGIN: Use Case */
1155
        $user = $this->createUserWithPassword('H@xxi0r!', $userContentType);
1156
        /* END: Use Case */
1157
1158
        $this->assertInstanceOf(User::class, $user);
1159
    }
1160
1161
    /**
1162
     * Test for the loadUser() method.
1163
     *
1164
     * @see \eZ\Publish\API\Repository\UserService::loadUser()
1165
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1166
     */
1167
    public function testLoadUser()
1168
    {
1169
        $repository = $this->getRepository();
1170
1171
        $userService = $repository->getUserService();
1172
1173
        /* BEGIN: Use Case */
1174
        $user = $this->createUserVersion1();
1175
1176
        // Load the newly created user
1177
        $userReloaded = $userService->loadUser($user->id);
1178
        /* END: Use Case */
1179
1180
        $this->assertEquals($user, $userReloaded);
1181
1182
        // User happens to also be a Content; isUser() should be true and isUserGroup() should be false
1183
        $this->assertTrue($userService->isUser($user), 'isUser() => false on a user');
1184
        $this->assertFalse($userService->isUserGroup($user), 'isUserGroup() => true on a user group');
1185
    }
1186
1187
    /**
1188
     * Test for the loadUser() method.
1189
     *
1190
     * @see \eZ\Publish\API\Repository\UserService::loadUser()
1191
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1192
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser
1193
     */
1194
    public function testLoadUserThrowsNotFoundException()
1195
    {
1196
        $repository = $this->getRepository();
1197
1198
        $nonExistingUserId = $this->generateId('user', self::DB_INT_MAX);
1199
        /* BEGIN: Use Case */
1200
        $userService = $repository->getUserService();
1201
1202
        // This call will fail with a "NotFoundException", because no user with
1203
        // an id equal to self::DB_INT_MAX should exist.
1204
        $userService->loadUser($nonExistingUserId);
1205
        /* END: Use Case */
1206
    }
1207
1208
    /**
1209
     * Test for the loadAnonymousUser() method.
1210
     *
1211
     * @see \eZ\Publish\API\Repository\UserService::loadAnonymousUser()
1212
     */
1213
    public function testLoadAnonymousUser()
1214
    {
1215
        $repository = $this->getRepository();
1216
1217
        $anonymousUserId = $this->generateId('user', 10);
1218
        /* BEGIN: Use Case */
1219
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
1220
        // Publish demo installation.
1221
        $userService = $repository->getUserService();
1222
1223
        // Load default anonymous user available in each eZ Publish installation
1224
        $anonymousUser = $userService->loadUser($anonymousUserId);
1225
        /* END: Use Case */
1226
1227
        $this->assertInstanceOf(
1228
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\User',
1229
            $anonymousUser
1230
        );
1231
1232
        $this->assertEquals('anonymous', $anonymousUser->login);
1233
    }
1234
1235
    /**
1236
     * Test for the loadUserByCredentials() method.
1237
     *
1238
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1239
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1240
     */
1241
    public function testLoadUserByCredentials()
1242
    {
1243
        $repository = $this->getRepository();
1244
1245
        $userService = $repository->getUserService();
1246
1247
        /* BEGIN: Use Case */
1248
        $user = $this->createUserVersion1();
1249
1250
        // Load the newly created user
1251
        $userReloaded = $userService->loadUserByCredentials('user', 'secret');
1252
        /* END: Use Case */
1253
1254
        $this->assertEquals($user, $userReloaded);
1255
    }
1256
1257
    /**
1258
     * Test for the loadUserByCredentials() method.
1259
     *
1260
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1261
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1262
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1263
     */
1264
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownPassword()
1265
    {
1266
        $repository = $this->getRepository();
1267
1268
        $userService = $repository->getUserService();
1269
1270
        /* BEGIN: Use Case */
1271
        $this->createUserVersion1();
1272
1273
        // This call will fail with a "NotFoundException", because the given
1274
        // login/password combination does not exist.
1275
        $userService->loadUserByCredentials('user', 'SeCrEt');
1276
        /* END: Use Case */
1277
    }
1278
1279
    /**
1280
     * Test for the loadUserByCredentials() method.
1281
     *
1282
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1283
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1284
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1285
     */
1286
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownPasswordEmtpy()
1287
    {
1288
        $repository = $this->getRepository();
1289
1290
        $userService = $repository->getUserService();
1291
1292
        /* BEGIN: Use Case */
1293
        $this->createUserVersion1();
1294
1295
        // This call will fail with a "NotFoundException", because the given
1296
        // login/password combination does not exist.
1297
        $userService->loadUserByCredentials('user', '');
1298
        /* END: Use Case */
1299
    }
1300
1301
    /**
1302
     * Test for the loadUserByCredentials() method.
1303
     *
1304
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1305
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1306
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1307
     */
1308
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownLogin()
1309
    {
1310
        $repository = $this->getRepository();
1311
1312
        $userService = $repository->getUserService();
1313
1314
        /* BEGIN: Use Case */
1315
        $this->createUserVersion1();
1316
1317
        // This call will fail with a "NotFoundException", because the given
1318
        // login/password combination does not exist.
1319
        $userService->loadUserByCredentials('üser', 'secret');
1320
        /* END: Use Case */
1321
    }
1322
1323
    /**
1324
     * Test for the loadUserByCredentials() method.
1325
     *
1326
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1327
     * @expectedException \eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue
1328
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1329
     */
1330
    public function testLoadUserByCredentialsThrowsInvalidArgumentValueForEmptyLogin()
1331
    {
1332
        $repository = $this->getRepository();
1333
1334
        $userService = $repository->getUserService();
1335
1336
        /* BEGIN: Use Case */
1337
        $this->createUserVersion1();
1338
1339
        // This call will fail with a "InvalidArgumentValue", because the given
1340
        // login is empty.
1341
        $userService->loadUserByCredentials('', 'secret');
1342
        /* END: Use Case */
1343
    }
1344
1345
    /**
1346
     * Test for the loadUserByLogin() method.
1347
     *
1348
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1349
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1350
     */
1351 View Code Duplication
    public function testLoadUserByLogin()
1352
    {
1353
        $repository = $this->getRepository();
1354
1355
        $userService = $repository->getUserService();
1356
1357
        /* BEGIN: Use Case */
1358
        $user = $this->createUserVersion1('User');
1359
1360
        // Load the newly created user
1361
        $userReloaded = $userService->loadUserByLogin('User');
1362
        /* END: Use Case */
1363
1364
        $this->assertPropertiesCorrect(
1365
            [
1366
                'login' => $user->login,
1367
                'email' => $user->email,
1368
                'passwordHash' => $user->passwordHash,
1369
                'hashAlgorithm' => $user->hashAlgorithm,
1370
                'enabled' => $user->enabled,
1371
                'maxLogin' => $user->maxLogin,
1372
                'id' => $user->id,
1373
                'contentInfo' => $user->contentInfo,
1374
                'versionInfo' => $user->versionInfo,
1375
                'fields' => $user->fields,
1376
            ],
1377
            $userReloaded
1378
        );
1379
    }
1380
1381
    /**
1382
     * Test for the loadUserByLogin() method.
1383
     *
1384
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1385
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1386
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByLogin
1387
     */
1388
    public function testLoadUserByLoginThrowsNotFoundExceptionForUnknownLogin()
1389
    {
1390
        $repository = $this->getRepository();
1391
1392
        $userService = $repository->getUserService();
1393
1394
        /* BEGIN: Use Case */
1395
        $this->createUserVersion1();
1396
1397
        // This call will fail with a "NotFoundException", because the given
1398
        // login/password combination does not exist.
1399
        $userService->loadUserByLogin('user42');
1400
        /* END: Use Case */
1401
    }
1402
1403
    /**
1404
     * Test for the loadUserByLogin() method.
1405
     *
1406
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1407
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByLogin
1408
     */
1409 View Code Duplication
    public function testLoadUserByLoginWorksForLoginWithWrongCase()
1410
    {
1411
        $repository = $this->getRepository();
1412
1413
        $userService = $repository->getUserService();
1414
1415
        /* BEGIN: Use Case */
1416
        $user = $this->createUserVersion1();
1417
1418
        // Lookup by user login should ignore casing
1419
        $userReloaded = $userService->loadUserByLogin('USER');
1420
        /* END: Use Case */
1421
1422
        $this->assertPropertiesCorrect(
1423
            [
1424
                'login' => $user->login,
1425
                'email' => $user->email,
1426
                'passwordHash' => $user->passwordHash,
1427
                'hashAlgorithm' => $user->hashAlgorithm,
1428
                'enabled' => $user->enabled,
1429
                'maxLogin' => $user->maxLogin,
1430
                'id' => $user->id,
1431
                'contentInfo' => $user->contentInfo,
1432
                'versionInfo' => $user->versionInfo,
1433
                'fields' => $user->fields,
1434
            ],
1435
            $userReloaded
1436
        );
1437
    }
1438
1439
    /**
1440
     * Test for the loadUserByLogin() method.
1441
     *
1442
     * In some cases people use email as login name, make sure system works as exepcted when asking for user by email.
1443
     *
1444
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1445
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1446
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByLogin
1447
     */
1448
    public function testLoadUserByLoginThrowsNotFoundExceptionForUnknownLoginByEmail()
1449
    {
1450
        $repository = $this->getRepository();
1451
1452
        $userService = $repository->getUserService();
1453
1454
        /* BEGIN: Use Case */
1455
        $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...
1456
1457
        // Lookup by user login by email should behave as normal
1458
        $userService->loadUserByLogin('[email protected]');
1459
        /* END: Use Case */
1460
    }
1461
1462
    /**
1463
     * Test for the loadUsersByEmail() method.
1464
     *
1465
     * @see \eZ\Publish\API\Repository\UserService::loadUsersByEmail()
1466
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1467
     */
1468 View Code Duplication
    public function testLoadUserByEmail()
1469
    {
1470
        $repository = $this->getRepository();
1471
1472
        $userService = $repository->getUserService();
1473
1474
        /* BEGIN: Use Case */
1475
        $user = $this->createUserVersion1();
1476
1477
        // Load the newly created user
1478
        $usersReloaded = $userService->loadUsersByEmail('[email protected]');
1479
        /* END: Use Case */
1480
1481
        $this->assertEquals([$user], $usersReloaded);
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::testLoadUserByEmail
1489
     */
1490 View Code Duplication
    public function testLoadUserByEmailReturnsEmptyInUnknownEmail()
1491
    {
1492
        $repository = $this->getRepository();
1493
1494
        $userService = $repository->getUserService();
1495
1496
        /* BEGIN: Use Case */
1497
        $this->createUserVersion1();
1498
1499
        // This call will return empty array, because the given
1500
        // login/password combination does not exist.
1501
        $emptyUserList = $userService->loadUsersByEmail('[email protected]');
1502
        /* END: Use Case */
1503
1504
        $this->assertEquals([], $emptyUserList);
1505
    }
1506
1507
    /**
1508
     * Test for the deleteUser() method.
1509
     *
1510
     * @see \eZ\Publish\API\Repository\UserService::deleteUser()
1511
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1512
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1513
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser
1514
     */
1515 View Code Duplication
    public function testDeleteUser()
1516
    {
1517
        $repository = $this->getRepository();
1518
1519
        $userService = $repository->getUserService();
1520
1521
        /* BEGIN: Use Case */
1522
        $user = $this->createUserVersion1();
1523
1524
        // Delete the currently created user
1525
        $userService->deleteUser($user);
1526
        /* END: Use Case */
1527
1528
        // We use the NotFoundException here to verify that the user not exists
1529
        $userService->loadUser($user->id);
1530
    }
1531
1532
    /**
1533
     * Test for the deleteUser() method.
1534
     *
1535
     * @covers  \eZ\Publish\API\Repository\UserService::deleteUser()
1536
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1537
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser
1538
     */
1539
    public function testDeleteUserDeletesRelatedBookmarks()
1540
    {
1541
        $repository = $this->getRepository();
1542
1543
        $userService = $repository->getUserService();
1544
        $locationService = $repository->getLocationService();
1545
        $bookmarkService = $repository->getBookmarkService();
1546
        /* BEGIN: Use Case */
1547
        $admin = $repository->getPermissionResolver()->getCurrentUserReference();
1548
1549
        $user = $this->createUserVersion1();
1550
1551
        $repository->getPermissionResolver()->setCurrentUserReference($user);
1552
1553
        $bookmarkService->createBookmark(
1554
            $locationService->loadLocation($this->generateId('location', 43))
1555
        );
1556
1557
        $repository->getPermissionResolver()->setCurrentUserReference($admin);
1558
        // Delete the currently created user
1559
        $userService->deleteUser($user);
1560
1561
        $repository->getPermissionResolver()->setCurrentUserReference($user);
1562
        /* END: Use Case */
1563
1564
        $this->assertEquals(0, $bookmarkService->loadBookmarks(0, 9999)->totalCount);
1565
    }
1566
1567
    /**
1568
     * Test for the newUserUpdateStruct() method.
1569
     *
1570
     * @see \eZ\Publish\API\Repository\UserService::newUserUpdateStruct()
1571
     */
1572
    public function testNewUserUpdateStruct()
1573
    {
1574
        $repository = $this->getRepository();
1575
1576
        /* BEGIN: Use Case */
1577
        $userService = $repository->getUserService();
1578
1579
        // Create a new update struct instance
1580
        $userUpdate = $userService->newUserUpdateStruct();
1581
        /* END: Use Case */
1582
1583
        $this->assertInstanceOf(
1584
            UserUpdateStruct::class,
1585
            $userUpdate
1586
        );
1587
1588
        $this->assertNull($userUpdate->contentUpdateStruct);
1589
        $this->assertNull($userUpdate->contentMetadataUpdateStruct);
1590
1591
        $this->assertPropertiesCorrect(
1592
            [
1593
                'email' => null,
1594
                'password' => null,
1595
                'enabled' => null,
1596
                'maxLogin' => null,
1597
            ],
1598
            $userUpdate
1599
        );
1600
    }
1601
1602
    /**
1603
     * Test for the updateUser() method.
1604
     *
1605
     * @return \eZ\Publish\API\Repository\Values\User\User
1606
     *
1607
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1608
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1609
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserUpdateStruct
1610
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent
1611
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata
1612
     */
1613
    public function testUpdateUser()
1614
    {
1615
        $repository = $this->getRepository();
1616
1617
        $userService = $repository->getUserService();
1618
1619
        /* BEGIN: Use Case */
1620
        $user = $this->createUserVersion1();
1621
1622
        // Create a new update struct instance
1623
        $userUpdate = $userService->newUserUpdateStruct();
1624
1625
        // Set new values for password and maxLogin
1626
        $userUpdate->password = 'my-new-password';
1627
        $userUpdate->maxLogin = 42;
1628
        $userUpdate->enabled = false;
1629
1630
        // Updated the user record.
1631
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1632
        /* END: Use Case */
1633
1634
        $this->assertInstanceOf(User::class, $userVersion2);
1635
1636
        return $userVersion2;
1637
    }
1638
1639
    /**
1640
     * Test for the updateUser() and loadUsersByEmail() method on change to email.
1641
     */
1642
    public function testUpdateUserEmail(): void
1643
    {
1644
        $repository = $this->getRepository();
1645
        $userService = $repository->getUserService();
1646
1647
        // Create a user
1648
        $user = $this->createUserVersion1();
1649
1650
        // Check we get what we expect (and implicit warmup any kind of cache)
1651
        $users = $userService->loadUsersByEmail('[email protected]');
1652
        $this->assertCount(0, $users);
1653
1654
        // Update user with the given email address
1655
        $userUpdate = $userService->newUserUpdateStruct();
1656
        $userUpdate->email = '[email protected]';
1657
        $updatedUser = $userService->updateUser($user, $userUpdate);
1658
        $this->assertInstanceOf(User::class, $updatedUser);
1659
1660
        // Check that we can load user by email
1661
        $users = $userService->loadUsersByEmail('[email protected]');
1662
        $this->assertCount(1, $users);
1663
        $this->assertInstanceOf(User::class, $users[0]);
1664
    }
1665
1666
    /**
1667
     * Test for the updateUser() method.
1668
     *
1669
     * @return \eZ\Publish\API\Repository\Values\User\User
1670
     *
1671
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1672
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1673
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserUpdateStruct
1674
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent
1675
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata
1676
     */
1677
    public function testUpdateUserNoPassword()
1678
    {
1679
        $repository = $this->getRepository();
1680
        $signalSlotUserService = $repository->getUserService();
1681
1682
        $signalSlotUserServiceReflection = new ReflectionClass($signalSlotUserService);
1683
        $userServiceProperty = $signalSlotUserServiceReflection->getProperty('service');
1684
        $userServiceProperty->setAccessible(true);
1685
        $userService = $userServiceProperty->getValue($signalSlotUserService);
1686
1687
        $userServiceReflection = new ReflectionClass($userService);
1688
        $settingsProperty = $userServiceReflection->getProperty('settings');
1689
        $settingsProperty->setAccessible(true);
1690
        $settingsProperty->setValue(
1691
            $userService,
1692
            [
1693
                '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...
1694
            ] + $settingsProperty->getValue($userService)
1695
        );
1696
1697
        /* BEGIN: Use Case */
1698
        $user = $this->createUserVersion1();
1699
1700
        $settingsProperty->setValue(
1701
            $userService,
1702
            [
1703
                'hashType' => User::PASSWORD_HASH_PHP_DEFAULT,
1704
            ] + $settingsProperty->getValue($userService)
1705
        );
1706
1707
        // Create a new update struct instance
1708
        $userUpdate = $userService->newUserUpdateStruct();
1709
1710
        // Set new values for maxLogin, don't change password
1711
        $userUpdate->maxLogin = 43;
1712
        $userUpdate->enabled = false;
1713
1714
        // Updated the user record.
1715
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1716
        /* END: Use Case */
1717
1718
        $this->assertInstanceOf(User::class, $user);
1719
1720
        $this->assertEquals(
1721
            [
1722
                'login' => $user->login,
1723
                'email' => $user->email,
1724
                'passwordHash' => $user->passwordHash,
1725
                'hashAlgorithm' => $user->hashAlgorithm,
1726
                'maxLogin' => 43,
1727
                'enabled' => false,
1728
            ],
1729
            [
1730
                'login' => $userVersion2->login,
1731
                'email' => $userVersion2->email,
1732
                'passwordHash' => $userVersion2->passwordHash,
1733
                'hashAlgorithm' => $userVersion2->hashAlgorithm,
1734
                'maxLogin' => $userVersion2->maxLogin,
1735
                'enabled' => $userVersion2->enabled,
1736
            ]
1737
        );
1738
    }
1739
1740
    /**
1741
     * Test for the updateUser() method.
1742
     *
1743
     * @param \eZ\Publish\API\Repository\Values\User\User $user
1744
     *
1745
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1746
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1747
     */
1748
    public function testUpdateUserUpdatesExpectedProperties(User $user)
1749
    {
1750
        $this->assertEquals(
1751
            [
1752
                'login' => 'user',
1753
                'email' => '[email protected]',
1754
                'maxLogin' => 42,
1755
                'enabled' => false,
1756
            ],
1757
            [
1758
                'login' => $user->login,
1759
                'email' => $user->email,
1760
                'maxLogin' => $user->maxLogin,
1761
                'enabled' => $user->enabled,
1762
            ]
1763
        );
1764
    }
1765
1766
    /**
1767
     * Test for the updateUser() method.
1768
     *
1769
     * @param \eZ\Publish\API\Repository\Values\User\User $user
1770
     *
1771
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1772
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1773
     */
1774
    public function testUpdateUserReturnsPublishedVersion(User $user)
1775
    {
1776
        $this->assertEquals(
1777
            APIVersionInfo::STATUS_PUBLISHED,
1778
            $user->getVersionInfo()->status
1779
        );
1780
    }
1781
1782
    /**
1783
     * Test for the updateUser() method.
1784
     *
1785
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1786
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1787
     */
1788
    public function testUpdateUserWithContentMetadataUpdateStruct()
1789
    {
1790
        $repository = $this->getRepository();
1791
1792
        $userService = $repository->getUserService();
1793
1794
        /* BEGIN: Use Case */
1795
        $user = $this->createUserVersion1();
1796
1797
        // Get the ContentService implementation
1798
        $contentService = $repository->getContentService();
1799
1800
        // Create a metadata update struct and change the remote id.
1801
        $metadataUpdate = $contentService->newContentMetadataUpdateStruct();
1802
        $metadataUpdate->remoteId = '85e10037d1ac0a00aa75443ced483e08';
1803
1804
        // Create a new update struct instance
1805
        $userUpdate = $userService->newUserUpdateStruct();
1806
1807
        // Set the metadata update struct.
1808
        $userUpdate->contentMetadataUpdateStruct = $metadataUpdate;
1809
1810
        // Updated the user record.
1811
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1812
1813
        // The contentInfo->remoteId will be changed now.
1814
        $remoteId = $userVersion2->contentInfo->remoteId;
1815
        /* END: Use Case */
1816
1817
        $this->assertEquals('85e10037d1ac0a00aa75443ced483e08', $remoteId);
1818
    }
1819
1820
    /**
1821
     * Test for the updateUser() method.
1822
     *
1823
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1824
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1825
     */
1826
    public function testUpdateUserWithContentUpdateStruct()
1827
    {
1828
        $repository = $this->getRepository();
1829
1830
        $userService = $repository->getUserService();
1831
1832
        /* BEGIN: Use Case */
1833
        $user = $this->createUserVersion1();
1834
1835
        // Get the ContentService implementation
1836
        $contentService = $repository->getContentService();
1837
1838
        // Create a content update struct and change the remote id.
1839
        $contentUpdate = $contentService->newContentUpdateStruct();
1840
        $contentUpdate->setField('first_name', 'Hello', 'eng-US');
1841
        $contentUpdate->setField('last_name', 'World', 'eng-US');
1842
1843
        // Create a new update struct instance
1844
        $userUpdate = $userService->newUserUpdateStruct();
1845
1846
        // Set the content update struct.
1847
        $userUpdate->contentUpdateStruct = $contentUpdate;
1848
1849
        // Updated the user record.
1850
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1851
1852
        $name = sprintf(
1853
            '%s %s',
1854
            $userVersion2->getFieldValue('first_name'),
1855
            $userVersion2->getFieldValue('last_name')
1856
        );
1857
        /* END: Use Case */
1858
1859
        $this->assertEquals('Hello World', $name);
1860
    }
1861
1862
    /**
1863
     * Test for the updateUser() method.
1864
     *
1865
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1866
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException
1867
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1868
     */
1869 View Code Duplication
    public function testUpdateUserWhenMissingField()
1870
    {
1871
        $repository = $this->getRepository();
1872
1873
        $userService = $repository->getUserService();
1874
1875
        /* BEGIN: Use Case */
1876
        $user = $this->createUserVersion1();
1877
1878
        // Get the ContentService implementation
1879
        $contentService = $repository->getContentService();
1880
1881
        // Create a content update struct and change the remote id.
1882
        $contentUpdate = $contentService->newContentUpdateStruct();
1883
        $contentUpdate->setField('first_name', null, 'eng-US');
1884
1885
        // Create a new update struct instance
1886
        $userUpdate = $userService->newUserUpdateStruct();
1887
1888
        // Set the content update struct.
1889
        $userUpdate->contentUpdateStruct = $contentUpdate;
1890
1891
        // This call will fail with a "ContentFieldValidationException" because the
1892
        // mandatory field "first_name" is set to an empty value.
1893
        $userService->updateUser($user, $userUpdate);
1894
1895
        /* END: Use Case */
1896
    }
1897
1898
    /**
1899
     * Test for the updateUser() method.
1900
     *
1901
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1902
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1903
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1904
     */
1905 View Code Duplication
    public function testUpdateUserThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
1906
    {
1907
        $repository = $this->getRepository();
1908
1909
        $userService = $repository->getUserService();
1910
1911
        /* BEGIN: Use Case */
1912
        $user = $this->createUserVersion1();
1913
1914
        // Get the ContentService implementation
1915
        $contentService = $repository->getContentService();
1916
1917
        $contentUpdate = $contentService->newContentUpdateStruct();
1918
        // An object of stdClass is not valid for the field first_name
1919
        $contentUpdate->setField('first_name', new \stdClass(), 'eng-US');
1920
1921
        // Create a new update struct instance
1922
        $userUpdate = $userService->newUserUpdateStruct();
1923
1924
        // Set the content update struct.
1925
        $userUpdate->contentUpdateStruct = $contentUpdate;
1926
1927
        // This call will fail with a "InvalidArgumentException" because the
1928
        // the field "first_name" does not accept the given value.
1929
        $userService->updateUser($user, $userUpdate);
1930
1931
        /* END: Use Case */
1932
    }
1933
1934
    /**
1935
     * Test updating a user throwing UserPasswordValidationException when password doesn't follow specified rules.
1936
     *
1937
     * @expectedException \eZ\Publish\Core\Base\Exceptions\UserPasswordValidationException
1938
     * @expectedExceptionMessage 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
1939
     * @covers \eZ\Publish\API\Repository\UserService::updateUser
1940
     */
1941 View Code Duplication
    public function testUpdateUserWithWeakPasswordThrowsUserPasswordValidationException()
1942
    {
1943
        $userService = $this->getRepository()->getUserService();
1944
1945
        $user = $this->createUserWithPassword('H@xxxiR!_1', $this->createUserWithStrongPasswordContentType());
1946
1947
        /* BEGIN: Use Case */
1948
        // Create a new update struct instance
1949
        $userUpdate = $userService->newUserUpdateStruct();
1950
        $userUpdate->password = 'pass';
1951
1952
        // This call will fail with a "UserPasswordValidationException" because the
1953
        // the password does not follow specified rules
1954
        $userService->updateUser($user, $userUpdate);
1955
        /* END: Use Case */
1956
    }
1957
1958
    /**
1959
     * Opposite test case for testUpdateUserWithWeakPasswordThrowsUserPasswordValidationException.
1960
     *
1961
     * @covers \eZ\Publish\API\Repository\UserService::updateUser
1962
     */
1963 View Code Duplication
    public function testUpdateUserWithStrongPassword()
1964
    {
1965
        $userService = $this->getRepository()->getUserService();
1966
1967
        $user = $this->createUserWithPassword('H@xxxiR!_1', $this->createUserWithStrongPasswordContentType());
1968
1969
        /* BEGIN: Use Case */
1970
        // Create a new update struct instance
1971
        $userUpdate = $userService->newUserUpdateStruct();
1972
        $userUpdate->password = 'H@xxxiR!_2';
1973
1974
        $user = $userService->updateUser($user, $userUpdate);
1975
        /* END: Use Case */
1976
1977
        $this->assertInstanceOf(User::class, $user);
1978
    }
1979
1980
    /**
1981
     * Test for the loadUserGroupsOfUser() method.
1982
     *
1983
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser
1984
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1985
     */
1986
    public function testLoadUserGroupsOfUser()
1987
    {
1988
        $repository = $this->getRepository();
1989
1990
        $userService = $repository->getUserService();
1991
1992
        /* BEGIN: Use Case */
1993
        $user = $this->createUserVersion1();
1994
1995
        // This array will contain the "Editors" user group name
1996
        $userGroupNames = [];
1997
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
1998
            $this->assertInstanceOf(UserGroup::class, $userGroup);
1999
            $userGroupNames[] = $userGroup->getFieldValue('name');
2000
        }
2001
        /* END: Use Case */
2002
2003
        $this->assertEquals(['Editors'], $userGroupNames);
2004
    }
2005
2006
    /**
2007
     * Test for the loadUsersOfUserGroup() method.
2008
     *
2009
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup
2010
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
2011
     */
2012
    public function testLoadUsersOfUserGroup()
2013
    {
2014
        $repository = $this->getRepository();
2015
        $userService = $repository->getUserService();
2016
2017
        $group = $userService->loadUserGroup($this->generateId('group', 13));
2018
2019
        /* BEGIN: Use Case */
2020
        $this->createUserVersion1();
2021
2022
        $this->refreshSearch($repository);
2023
2024
        // This array will contain the email of the newly created "Editor" user
2025
        $email = [];
2026
        foreach ($userService->loadUsersOfUserGroup($group) as $user) {
2027
            $this->assertInstanceOf(User::class, $user);
2028
            $email[] = $user->email;
2029
        }
2030
        /* END: Use Case */
2031
        $this->assertEquals(['[email protected]'], $email);
2032
    }
2033
2034
    /**
2035
     * Test for the assignUserToUserGroup() method.
2036
     *
2037
     * @see \eZ\Publish\API\Repository\UserService::assignUserToUserGroup()
2038
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser
2039
     */
2040
    public function testAssignUserToUserGroup()
2041
    {
2042
        $repository = $this->getRepository();
2043
        $userService = $repository->getUserService();
2044
2045
        $administratorGroupId = $this->generateId('group', 12);
2046
        /* BEGIN: Use Case */
2047
        // $administratorGroupId is the ID of the "Administrator" group in an
2048
        // eZ Publish demo installation
2049
2050
        $user = $this->createUserVersion1();
2051
2052
        // Assign group to newly created user
2053
        $userService->assignUserToUserGroup(
2054
            $user,
2055
            $userService->loadUserGroup($administratorGroupId)
2056
        );
2057
2058
        // This array will contain "Editors" and "Administrator users"
2059
        $userGroupNames = [];
2060
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
2061
            $userGroupNames[] = $userGroup->getFieldValue('name');
2062
        }
2063
        /* END: Use Case */
2064
2065
        sort($userGroupNames, SORT_STRING);
2066
2067
        $this->assertEquals(
2068
            [
2069
                'Administrator users',
2070
                'Editors',
2071
            ],
2072
            $userGroupNames
2073
        );
2074
    }
2075
2076
    /**
2077
     * Test for the assignUserToUserGroup() method.
2078
     *
2079
     * @covers \eZ\Publish\API\Repository\UserService::assignUserToUserGroup
2080
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
2081
     * @expectedExceptionMessage Argument 'user' is invalid: user is already in the given user group
2082
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testAssignUserToUserGroup
2083
     */
2084 View Code Duplication
    public function testAssignUserToUserGroupThrowsInvalidArgumentException()
2085
    {
2086
        $repository = $this->getRepository();
2087
        $userService = $repository->getUserService();
2088
2089
        $editorsGroupId = $this->generateId('group', 13);
2090
        /* BEGIN: Use Case */
2091
        $user = $this->createUserVersion1();
2092
        // $editorsGroupId is the ID of the "Editors" group in an
2093
        // eZ Publish demo installation
2094
2095
        // This call will fail with an "InvalidArgumentException", because the
2096
        // user is already assigned to the "Editors" group
2097
        $userService->assignUserToUserGroup(
2098
            $user,
2099
            $userService->loadUserGroup($editorsGroupId)
2100
        );
2101
        /* END: Use Case */
2102
    }
2103
2104
    /**
2105
     * Test for the unAssignUssrFromUserGroup() method.
2106
     *
2107
     * @see \eZ\Publish\API\Repository\UserService::unAssignUssrFromUserGroup()
2108
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser
2109
     */
2110
    public function testUnAssignUserFromUserGroup()
2111
    {
2112
        $repository = $this->getRepository();
2113
        $userService = $repository->getUserService();
2114
2115
        $editorsGroupId = $this->generateId('group', 13);
2116
        $anonymousGroupId = $this->generateId('group', 42);
2117
2118
        /* BEGIN: Use Case */
2119
        // $anonymousGroupId is the ID of the "Anonymous Users" group in an eZ
2120
        // Publish demo installation
2121
2122
        $user = $this->createUserVersion1();
2123
2124
        // Assign group to newly created user
2125
        $userService->assignUserToUserGroup(
2126
            $user,
2127
            $userService->loadUserGroup($anonymousGroupId)
2128
        );
2129
2130
        // Unassign user from "Editors" group
2131
        $userService->unAssignUserFromUserGroup(
2132
            $user,
2133
            $userService->loadUserGroup($editorsGroupId)
2134
        );
2135
2136
        // This array will contain "Anonymous Users"
2137
        $userGroupNames = [];
2138
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
2139
            $userGroupNames[] = $userGroup->getFieldValue('name');
2140
        }
2141
        /* END: Use Case */
2142
2143
        $this->assertEquals(['Anonymous Users'], $userGroupNames);
2144
    }
2145
2146
    /**
2147
     * Test for the unAssignUserFromUserGroup() method.
2148
     *
2149
     * @see \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup()
2150
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
2151
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup
2152
     */
2153
    public function testUnAssignUserFromUserGroupThrowsInvalidArgumentException()
2154
    {
2155
        $repository = $this->getRepository();
2156
        $userService = $repository->getUserService();
2157
2158
        $administratorGroupId = $this->generateId('group', 12);
2159
        /* BEGIN: Use Case */
2160
        $user = $this->createUserVersion1();
2161
        // $administratorGroupId is the ID of the "Administrator" group in an
2162
        // eZ Publish demo installation
2163
2164
        // This call will fail with an "InvalidArgumentException", because the
2165
        // user is not assigned to the "Administrator" group
2166
        $userService->unAssignUserFromUserGroup(
2167
            $user,
2168
            $userService->loadUserGroup($administratorGroupId)
2169
        );
2170
        /* END: Use Case */
2171
    }
2172
2173
    /**
2174
     * Test for the unAssignUserFromUserGroup() method removing user from the last group.
2175
     *
2176
     * @covers \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup
2177
     * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException
2178
     * @expectedExceptionMessage Argument 'user' has a bad state: user only has one user group, cannot unassign from last group
2179
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup
2180
     */
2181
    public function testUnAssignUserFromUserGroupThrowsBadStateArgumentException()
2182
    {
2183
        $repository = $this->getRepository();
2184
        $userService = $repository->getUserService();
2185
2186
        $editorsGroupId = $this->generateId('group', 13);
2187
        /* BEGIN: Use Case */
2188
        $user = $this->createUserVersion1();
2189
2190
        // This call will fail with an "BadStateException", because the
2191
        // user has to be assigned to at least one group
2192
        $userService->unAssignUserFromUserGroup(
2193
            $user,
2194
            $userService->loadUserGroup($editorsGroupId)
2195
        );
2196
        /* END: Use Case */
2197
    }
2198
2199
    /**
2200
     * Test that multi-language logic for the loadUserGroup method respects prioritized language list.
2201
     *
2202
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2203
     * @dataProvider getPrioritizedLanguageList
2204
     * @param string[] $prioritizedLanguages
2205
     * @param string|null $expectedLanguageCode language code of expected translation
2206
     */
2207
    public function testLoadUserGroupWithPrioritizedLanguagesList(
2208
        array $prioritizedLanguages,
2209
        $expectedLanguageCode
2210
    ) {
2211
        $repository = $this->getRepository();
2212
        $userService = $repository->getUserService();
2213
2214
        $userGroup = $this->createMultiLanguageUserGroup();
2215
        if ($expectedLanguageCode === null) {
2216
            $expectedLanguageCode = $userGroup->contentInfo->mainLanguageCode;
2217
        }
2218
2219
        $loadedUserGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2220
2221
        self::assertEquals(
2222
            $loadedUserGroup->getName($expectedLanguageCode),
2223
            $loadedUserGroup->getName()
2224
        );
2225
        self::assertEquals(
2226
            $loadedUserGroup->getFieldValue('description', $expectedLanguageCode),
2227
            $loadedUserGroup->getFieldValue('description')
2228
        );
2229
    }
2230
2231
    /**
2232
     * Test that multi-language logic works correctly after updating user group main language.
2233
     *
2234
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2235
     * @dataProvider getPrioritizedLanguageList
2236
     * @param string[] $prioritizedLanguages
2237
     * @param string|null $expectedLanguageCode language code of expected translation
2238
     */
2239
    public function testLoadUserGroupWithPrioritizedLanguagesListAfterMainLanguageUpdate(
2240
        array $prioritizedLanguages,
2241
        $expectedLanguageCode
2242
    ) {
2243
        $repository = $this->getRepository();
2244
        $userService = $repository->getUserService();
2245
        $contentService = $repository->getContentService();
2246
2247
        $userGroup = $this->createMultiLanguageUserGroup();
2248
2249
        $userGroupUpdateStruct = $userService->newUserGroupUpdateStruct();
2250
        $userGroupUpdateStruct->contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct();
2251
        $userGroupUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode = 'eng-GB';
2252
        $userService->updateUserGroup($userGroup, $userGroupUpdateStruct);
2253
2254
        if ($expectedLanguageCode === null) {
2255
            $expectedLanguageCode = 'eng-GB';
2256
        }
2257
2258
        $loadedUserGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2259
2260
        self::assertEquals(
2261
            $loadedUserGroup->getName($expectedLanguageCode),
2262
            $loadedUserGroup->getName()
2263
        );
2264
        self::assertEquals(
2265
            $loadedUserGroup->getFieldValue('description', $expectedLanguageCode),
2266
            $loadedUserGroup->getFieldValue('description')
2267
        );
2268
    }
2269
2270
    /**
2271
     * Test that multi-language logic for the loadSubUserGroups method respects prioritized language list.
2272
     *
2273
     * @covers \eZ\Publish\API\Repository\UserService::loadSubUserGroups
2274
     * @dataProvider getPrioritizedLanguageList
2275
     * @param string[] $prioritizedLanguages
2276
     * @param string|null $expectedLanguageCode language code of expected translation
2277
     */
2278
    public function testLoadSubUserGroupsWithPrioritizedLanguagesList(
2279
        array $prioritizedLanguages,
2280
        $expectedLanguageCode
2281
    ) {
2282
        $repository = $this->getRepository();
2283
        $userService = $repository->getUserService();
2284
2285
        // create main group for subgroups
2286
        $userGroup = $this->createMultiLanguageUserGroup(4);
2287
        if ($expectedLanguageCode === null) {
2288
            $expectedLanguageCode = $userGroup->contentInfo->mainLanguageCode;
2289
        }
2290
2291
        // create subgroups
2292
        $this->createMultiLanguageUserGroup($userGroup->id);
2293
        $this->createMultiLanguageUserGroup($userGroup->id);
2294
2295
        $userGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2296
2297
        $subUserGroups = $userService->loadSubUserGroups($userGroup, 0, 2, $prioritizedLanguages);
2298
        foreach ($subUserGroups as $subUserGroup) {
2299
            self::assertEquals(
2300
                $subUserGroup->getName($expectedLanguageCode),
2301
                $subUserGroup->getName()
2302
            );
2303
            self::assertEquals(
2304
                $subUserGroup->getFieldValue('description', $expectedLanguageCode),
2305
                $subUserGroup->getFieldValue('description')
2306
            );
2307
        }
2308
    }
2309
2310
    /**
2311
     * Test that multi-language logic for the loadUser method respects prioritized language list.
2312
     *
2313
     * @covers \eZ\Publish\API\Repository\UserService::loadUser
2314
     * @dataProvider getPrioritizedLanguageList
2315
     * @param string[] $prioritizedLanguages
2316
     * @param string|null $expectedLanguageCode language code of expected translation
2317
     */
2318 View Code Duplication
    public function testLoadUserWithPrioritizedLanguagesList(
2319
        array $prioritizedLanguages,
2320
        $expectedLanguageCode
2321
    ) {
2322
        $repository = $this->getRepository();
2323
        $userService = $repository->getUserService();
2324
2325
        $user = $this->createMultiLanguageUser();
2326
        if ($expectedLanguageCode === null) {
2327
            $expectedLanguageCode = $user->contentInfo->mainLanguageCode;
2328
        }
2329
2330
        $loadedUser = $userService->loadUser($user->id, $prioritizedLanguages);
2331
2332
        self::assertEquals(
2333
            $loadedUser->getName($expectedLanguageCode),
2334
            $loadedUser->getName()
2335
        );
2336
2337
        foreach (['fist_name', 'last_name', 'signature'] as $fieldIdentifier) {
2338
            self::assertEquals(
2339
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2340
                $loadedUser->getFieldValue($fieldIdentifier)
2341
            );
2342
        }
2343
    }
2344
2345
    /**
2346
     * Test that multi-language logic for the loadUser method works correctly after updating
2347
     * user content main language.
2348
     *
2349
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2350
     * @dataProvider getPrioritizedLanguageList
2351
     * @param string[] $prioritizedLanguages
2352
     * @param string|null $expectedLanguageCode language code of expected translation
2353
     */
2354
    public function testLoadUserWithPrioritizedLanguagesListAfterMainLanguageUpdate(
2355
        array $prioritizedLanguages,
2356
        $expectedLanguageCode
2357
    ) {
2358
        $repository = $this->getRepository();
2359
        $userService = $repository->getUserService();
2360
        $contentService = $repository->getContentService();
2361
2362
        $user = $this->createMultiLanguageUser();
2363
        // sanity check
2364
        self::assertEquals($user->contentInfo->mainLanguageCode, 'eng-US');
2365
2366
        $userUpdateStruct = $userService->newUserUpdateStruct();
2367
        $userUpdateStruct->contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct();
2368
        $userUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode = 'eng-GB';
2369
        $userService->updateUser($user, $userUpdateStruct);
2370
        if ($expectedLanguageCode === null) {
2371
            $expectedLanguageCode = 'eng-GB';
2372
        }
2373
2374
        $loadedUser = $userService->loadUser($user->id, $prioritizedLanguages);
2375
2376
        self::assertEquals(
2377
            $loadedUser->getName($expectedLanguageCode),
2378
            $loadedUser->getName()
2379
        );
2380
2381
        foreach (['fist_name', 'last_name', 'signature'] as $fieldIdentifier) {
2382
            self::assertEquals(
2383
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2384
                $loadedUser->getFieldValue($fieldIdentifier)
2385
            );
2386
        }
2387
    }
2388
2389
    /**
2390
     * Test that multi-language logic for the loadUserByLogin method respects prioritized language list.
2391
     *
2392
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByLogin
2393
     * @dataProvider getPrioritizedLanguageList
2394
     * @param string[] $prioritizedLanguages
2395
     * @param string|null $expectedLanguageCode language code of expected translation
2396
     */
2397 View Code Duplication
    public function testLoadUserByLoginWithPrioritizedLanguagesList(
2398
        array $prioritizedLanguages,
2399
        $expectedLanguageCode
2400
    ) {
2401
        $repository = $this->getRepository();
2402
        $userService = $repository->getUserService();
2403
        $user = $this->createMultiLanguageUser();
2404
2405
        // load, with prioritized languages, the newly created user
2406
        $loadedUser = $userService->loadUserByLogin($user->login, $prioritizedLanguages);
2407
        if ($expectedLanguageCode === null) {
2408
            $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2409
        }
2410
2411
        self::assertEquals(
2412
            $loadedUser->getName($expectedLanguageCode),
2413
            $loadedUser->getName()
2414
        );
2415
2416
        foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2417
            self::assertEquals(
2418
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2419
                $loadedUser->getFieldValue($fieldIdentifier)
2420
            );
2421
        }
2422
    }
2423
2424
    /**
2425
     * Test that multi-language logic for the loadUserByCredentials method respects
2426
     * prioritized language list.
2427
     *
2428
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByCredentials
2429
     * @dataProvider getPrioritizedLanguageList
2430
     * @param string[] $prioritizedLanguages
2431
     * @param string|null $expectedLanguageCode language code of expected translation
2432
     */
2433 View Code Duplication
    public function testLoadUserByCredentialsWithPrioritizedLanguagesList(
2434
        array $prioritizedLanguages,
2435
        $expectedLanguageCode
2436
    ) {
2437
        $repository = $this->getRepository();
2438
        $userService = $repository->getUserService();
2439
        $user = $this->createMultiLanguageUser();
2440
2441
        // load, with prioritized languages, the newly created user
2442
        $loadedUser = $userService->loadUserByCredentials(
2443
            $user->login,
2444
            'secret',
2445
            $prioritizedLanguages
2446
        );
2447
        if ($expectedLanguageCode === null) {
2448
            $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2449
        }
2450
2451
        self::assertEquals(
2452
            $loadedUser->getName($expectedLanguageCode),
2453
            $loadedUser->getName()
2454
        );
2455
2456
        foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2457
            self::assertEquals(
2458
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2459
                $loadedUser->getFieldValue($fieldIdentifier)
2460
            );
2461
        }
2462
    }
2463
2464
    /**
2465
     * Test that multi-language logic for the loadUsersByEmail method respects
2466
     * prioritized language list.
2467
     *
2468
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersByEmail
2469
     * @dataProvider getPrioritizedLanguageList
2470
     * @param string[] $prioritizedLanguages
2471
     * @param string|null $expectedLanguageCode language code of expected translation
2472
     */
2473 View Code Duplication
    public function testLoadUsersByEmailWithPrioritizedLanguagesList(
2474
        array $prioritizedLanguages,
2475
        $expectedLanguageCode
2476
    ) {
2477
        $repository = $this->getRepository();
2478
        $userService = $repository->getUserService();
2479
        $user = $this->createMultiLanguageUser();
2480
2481
        // load, with prioritized languages, users by email
2482
        $loadedUsers = $userService->loadUsersByEmail($user->email, $prioritizedLanguages);
2483
2484
        foreach ($loadedUsers as $loadedUser) {
2485
            if ($expectedLanguageCode === null) {
2486
                $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2487
            }
2488
            self::assertEquals(
2489
                $loadedUser->getName($expectedLanguageCode),
2490
                $loadedUser->getName()
2491
            );
2492
2493
            foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2494
                self::assertEquals(
2495
                    $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2496
                    $loadedUser->getFieldValue($fieldIdentifier)
2497
                );
2498
            }
2499
        }
2500
    }
2501
2502
    /**
2503
     * Test that multi-language logic for the loadUserGroupsOfUser method respects
2504
     * prioritized language list.
2505
     *
2506
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser
2507
     * @dataProvider getPrioritizedLanguageList
2508
     * @param string[] $prioritizedLanguages
2509
     * @param string|null $expectedLanguageCode language code of expected translation
2510
     */
2511
    public function testLoadUserGroupsOfUserWithPrioritizedLanguagesList(
2512
        array $prioritizedLanguages,
2513
        $expectedLanguageCode
2514
    ) {
2515
        $repository = $this->getRepository();
2516
        $userService = $repository->getUserService();
2517
        $userGroup = $this->createMultiLanguageUserGroup();
2518
        $user = $this->createMultiLanguageUser($userGroup->id);
2519
2520
        $userGroups = $userService->loadUserGroupsOfUser($user, 0, 25, $prioritizedLanguages);
2521
        foreach ($userGroups as $userGroup) {
2522
            self::assertEquals(
2523
                $userGroup->getName($expectedLanguageCode),
2524
                $userGroup->getName()
2525
            );
2526
            self::assertEquals(
2527
                $userGroup->getFieldValue('description', $expectedLanguageCode),
2528
                $userGroup->getFieldValue('description')
2529
            );
2530
        }
2531
    }
2532
2533
    /**
2534
     * Test that multi-language logic for the loadUsersOfUserGroup method respects
2535
     * prioritized language list.
2536
     *
2537
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup
2538
     * @dataProvider getPrioritizedLanguageList
2539
     * @param string[] $prioritizedLanguages
2540
     * @param string|null $expectedLanguageCode language code of expected translation
2541
     */
2542
    public function testLoadUsersOfUserGroupWithPrioritizedLanguagesList(
2543
        array $prioritizedLanguages,
2544
        $expectedLanguageCode
2545
    ) {
2546
        $repository = $this->getRepository();
2547
        $userService = $repository->getUserService();
2548
2549
        // create parent user group
2550
        $userGroup = $this->createMultiLanguageUserGroup();
2551
        // add two users to the created parent user group
2552
        $this->createMultiLanguageUser($userGroup->id);
2553
        $this->createMultiLanguageUser($userGroup->id);
2554
2555
        // test loading of users via user group with prioritized languages list
2556
        $users = $userService->loadUsersOfUserGroup($userGroup, 0, 25, $prioritizedLanguages);
2557
        foreach ($users as $user) {
2558
            if ($expectedLanguageCode === null) {
2559
                $expectedLanguageCode = $user->contentInfo->mainLanguageCode;
2560
            }
2561
            self::assertEquals(
2562
                $user->getName($expectedLanguageCode),
2563
                $user->getName()
2564
            );
2565
2566
            foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2567
                self::assertEquals(
2568
                    $user->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2569
                    $user->getFieldValue($fieldIdentifier)
2570
                );
2571
            }
2572
        }
2573
    }
2574
2575
    /**
2576
     * Get prioritized languages list data.
2577
     *
2578
     * Test cases using this data provider should expect the following arguments:
2579
     * <code>
2580
     *   array $prioritizedLanguagesList
2581
     *   string $expectedLanguage (if null - use main language)
2582
     * </code>
2583
     *
2584
     * @return array
2585
     */
2586 View Code Duplication
    public function getPrioritizedLanguageList()
2587
    {
2588
        return [
2589
            [[], null],
2590
            [['eng-US'], 'eng-US'],
2591
            [['eng-GB'], 'eng-GB'],
2592
            [['eng-US', 'eng-GB'], 'eng-US'],
2593
            [['eng-GB', 'eng-US'], 'eng-GB'],
2594
            // use non-existent group as the first one
2595
            [['ger-DE'], null],
2596
            [['ger-DE', 'eng-GB'], 'eng-GB'],
2597
        ];
2598
    }
2599
2600
    /**
2601
     * @param int $parentGroupId
2602
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
2603
     */
2604
    private function createMultiLanguageUserGroup($parentGroupId = 4)
2605
    {
2606
        $repository = $this->getRepository();
2607
        $userService = $repository->getUserService();
2608
2609
        // create user group with multiple translations
2610
        $parentGroupId = $this->generateId('group', $parentGroupId);
2611
        $parentGroup = $userService->loadUserGroup($parentGroupId);
2612
2613
        $userGroupCreateStruct = $userService->newUserGroupCreateStruct('eng-US');
2614
        $userGroupCreateStruct->setField('name', 'US user group', 'eng-US');
2615
        $userGroupCreateStruct->setField('name', 'GB user group', 'eng-GB');
2616
        $userGroupCreateStruct->setField('description', 'US user group description', 'eng-US');
2617
        $userGroupCreateStruct->setField('description', 'GB user group description', 'eng-GB');
2618
        $userGroupCreateStruct->alwaysAvailable = true;
2619
2620
        return $userService->createUserGroup($userGroupCreateStruct, $parentGroup);
2621
    }
2622
2623
    /**
2624
     * Create a user group fixture in a variable named <b>$userGroup</b>,.
2625
     *
2626
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
2627
     */
2628 View Code Duplication
    private function createUserGroupVersion1()
2629
    {
2630
        $repository = $this->getRepository();
2631
2632
        $mainGroupId = $this->generateId('group', 4);
2633
        /* BEGIN: Inline */
2634
        // $mainGroupId is the ID of the main "Users" group
2635
2636
        $userService = $repository->getUserService();
2637
2638
        // Load main group
2639
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
2640
2641
        // Instantiate a new create struct
2642
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
2643
        $userGroupCreate->setField('name', 'Example Group');
2644
2645
        // Create the new user group
2646
        $userGroup = $userService->createUserGroup(
2647
            $userGroupCreate,
2648
            $parentUserGroup
2649
        );
2650
        /* END: Inline */
2651
2652
        return $userGroup;
2653
    }
2654
2655
    /**
2656
     * Create user with multiple translations of User Content fields.
2657
     *
2658
     * @param int $userGroupId User group ID (default 13 - Editors)
2659
     *
2660
     * @return \eZ\Publish\API\Repository\Values\User\User
2661
     */
2662
    private function createMultiLanguageUser($userGroupId = 13)
2663
    {
2664
        $repository = $this->getRepository();
2665
        $userService = $repository->getUserService();
2666
2667
        // Instantiate a create struct with mandatory properties
2668
        $randomLogin = md5(mt_rand() . time());
2669
        $userCreateStruct = $userService->newUserCreateStruct(
2670
            $randomLogin,
2671
            "{$randomLogin}@example.com",
2672
            'secret',
2673
            'eng-US'
2674
        );
2675
        $userCreateStruct->enabled = true;
2676
        $userCreateStruct->alwaysAvailable = true;
2677
2678
        // set field for each language
2679
        foreach (['eng-US', 'eng-GB'] as $languageCode) {
2680
            $userCreateStruct->setField('first_name', "{$languageCode} Example", $languageCode);
2681
            $userCreateStruct->setField('last_name', "{$languageCode} User", $languageCode);
2682
            $userCreateStruct->setField('signature', "{$languageCode} signature", $languageCode);
2683
        }
2684
2685
        // Load parent group for the user
2686
        $group = $userService->loadUserGroup($userGroupId);
2687
2688
        // Create a new user
2689
        return $userService->createUser($userCreateStruct, [$group]);
2690
    }
2691
2692
    /**
2693
     * Test for the createUser() method.
2694
     *
2695
     * @see \eZ\Publish\API\Repository\UserService::createUser()
2696
     */
2697
    public function testCreateUserInvalidPasswordHashTypeThrowsException()
2698
    {
2699
        $this->expectException(InvalidArgumentException::class);
2700
        $this->expectExceptionMessage("Argument 'type' is invalid: Password hash type '42424242' is not recognized");
2701
2702
        $repository = $this->getRepository();
2703
        $signalSlotUserService = $repository->getUserService();
2704
2705
        $signalSlotUserServiceReflection = new ReflectionClass($signalSlotUserService);
2706
        $userServiceProperty = $signalSlotUserServiceReflection->getProperty('service');
2707
        $userServiceProperty->setAccessible(true);
2708
        $userService = $userServiceProperty->getValue($signalSlotUserService);
2709
2710
        $userServiceReflection = new ReflectionClass($userService);
2711
        $settingsProperty = $userServiceReflection->getProperty('settings');
2712
        $settingsProperty->setAccessible(true);
2713
2714
        $defaultUserServiceSettings = $settingsProperty->getValue($userService);
2715
2716
        /* BEGIN: Use Case */
2717
        $settingsProperty->setValue(
2718
            $userService,
2719
            [
2720
                'hashType' => 42424242, // Non-existing hash type
2721
            ] + $settingsProperty->getValue($userService)
2722
        );
2723
2724
        try {
2725
            $this->createUserVersion1();
2726
        } catch (InvalidArgumentException $e) {
2727
            // Reset to default settings, so we don't break other tests
2728
            $settingsProperty->setValue($userService, $defaultUserServiceSettings);
2729
2730
            throw $e;
2731
        }
2732
        /* END: Use Case */
2733
2734
        // Reset to default settings, so we don't break other tests
2735
        $settingsProperty->setValue($userService, $defaultUserServiceSettings);
2736
    }
2737
2738
    /**
2739
     * Test loading User by Token.
2740
     *
2741
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByToken
2742
     */
2743 View Code Duplication
    public function testLoadUserByToken()
2744
    {
2745
        $repository = $this->getRepository();
2746
        $userService = $repository->getUserService();
2747
2748
        $user = $this->createUserVersion1();
2749
2750
        $userTokenUpdateStruct = new UserTokenUpdateStruct();
2751
        $userTokenUpdateStruct->hashKey = md5('hash');
2752
        $userTokenUpdateStruct->time = new DateTime();
2753
2754
        $userService->updateUserToken($user, $userTokenUpdateStruct);
2755
2756
        $loadedUser = $userService->loadUserByToken($userTokenUpdateStruct->hashKey);
2757
        self::assertEquals($user, $loadedUser);
2758
2759
        return $userTokenUpdateStruct->hashKey;
2760
    }
2761
2762
    /**
2763
     * Test trying to load User by invalid Token.
2764
     *
2765
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByToken
2766
     */
2767
    public function testLoadUserByTokenThrowsNotFoundException()
2768
    {
2769
        $this->expectException(NotFoundException::class);
2770
2771
        $repository = $this->getRepository();
2772
        $userService = $repository->getUserService();
2773
2774
        $user = $this->createUserVersion1();
2775
2776
        $userTokenUpdateStruct = new UserTokenUpdateStruct();
2777
        $userTokenUpdateStruct->hashKey = md5('hash');
2778
        $userTokenUpdateStruct->time = new DateTime();
2779
2780
        $userService->updateUserToken($user, $userTokenUpdateStruct);
2781
2782
        $userService->loadUserByToken('not_existing_token');
2783
    }
2784
2785
    /**
2786
     * Test updating User Token.
2787
     *
2788
     * @covers  \eZ\Publish\API\Repository\UserService::updateUserToken()
2789
     *
2790
     * @depends testLoadUserByToken
2791
     *
2792
     * @param string $originalUserToken
2793
     */
2794 View Code Duplication
    public function testUpdateUserToken($originalUserToken)
2795
    {
2796
        $repository = $this->getRepository(false);
2797
        $userService = $repository->getUserService();
2798
2799
        $user = $userService->loadUserByToken($originalUserToken);
2800
2801
        $userTokenUpdateStruct = new UserTokenUpdateStruct();
2802
        $userTokenUpdateStruct->hashKey = md5('my_updated_hash');
2803
        $userTokenUpdateStruct->time = new DateTime();
2804
2805
        $userService->updateUserToken($user, $userTokenUpdateStruct);
2806
2807
        $loadedUser = $userService->loadUserByToken($userTokenUpdateStruct->hashKey);
2808
        self::assertEquals($user, $loadedUser);
2809
    }
2810
2811
    /**
2812
     * Test invalidating (expiring) User Token.
2813
     *
2814
     * @covers \eZ\Publish\API\Repository\UserService::expireUserToken()
2815
     *
2816
     * @depends testLoadUserByToken
2817
     *
2818
     * @param string $userToken
2819
     */
2820
    public function testExpireUserToken($userToken)
2821
    {
2822
        $this->expectException(NotFoundException::class);
2823
2824
        $repository = $this->getRepository(false);
2825
        $userService = $repository->getUserService();
2826
2827
        // sanity check
2828
        $userService->loadUserByToken($userToken);
2829
2830
        $userService->expireUserToken($userToken);
2831
2832
        // should throw NotFoundException now
2833
        $userService->loadUserByToken($userToken);
2834
    }
2835
2836
    /**
2837
     * @covers \eZ\Publish\API\Repository\UserService::validatePassword()
2838
     */
2839
    public function testValidatePasswordWithDefaultContext()
2840
    {
2841
        $userService = $this->getRepository()->getUserService();
2842
2843
        /* BEGIN: Use Case */
2844
        $errors = $userService->validatePassword('pass');
2845
        /* END: Use Case */
2846
2847
        $this->assertEmpty($errors);
2848
    }
2849
2850
    /**
2851
     * @covers \eZ\Publish\API\Repository\UserService::validatePassword()
2852
     * @dataProvider dataProviderForValidatePassword
2853
     */
2854
    public function testValidatePassword(string $password, array $expectedErrorr)
2855
    {
2856
        $userService = $this->getRepository()->getUserService();
2857
        $contentType = $this->createUserWithStrongPasswordContentType();
2858
2859
        /* BEGIN: Use Case */
2860
        $context = new PasswordValidationContext([
2861
            'contentType' => $contentType,
2862
        ]);
2863
2864
        $actualErrors = $userService->validatePassword($password, $context);
2865
        /* END: Use Case */
2866
2867
        $this->assertEquals($expectedErrorr, $actualErrors);
2868
    }
2869
2870
    /**
2871
     * Data provider for testValidatePassword.
2872
     *
2873
     * @return array
2874
     */
2875
    public function dataProviderForValidatePassword(): array
2876
    {
2877
        return [
2878
            [
2879
                'pass',
2880
                [
2881
                    new ValidationError('User password must be at least %length% characters long', null, [
2882
                        '%length%' => 8,
2883
                    ], 'password'),
2884
                    new ValidationError('User password must include at least one upper case letter', null, [], 'password'),
2885
                    new ValidationError('User password must include at least one number', null, [], 'password'),
2886
                    new ValidationError('User password must include at least one special character', null, [], 'password'),
2887
                ],
2888
            ],
2889
            [
2890
                'H@xxxi0R!!!',
2891
                [],
2892
            ],
2893
        ];
2894
    }
2895
2896
    /**
2897
     * Creates a user with given password.
2898
     *
2899
     * @param string $password
2900
     * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType
2901
     *
2902
     * @return \eZ\Publish\API\Repository\Values\User\User
2903
     */
2904 View Code Duplication
    private function createUserWithPassword(string $password, ContentType $contentType): User
2905
    {
2906
        $userService = $this->getRepository()->getUserService();
2907
        // ID of the "Editors" user group in an eZ Publish demo installation
2908
        $editorsGroupId = 13;
2909
2910
        // Instantiate a create struct with mandatory properties
2911
        $userCreate = $userService->newUserCreateStruct(
2912
            'johndoe',
2913
            '[email protected]',
2914
            $password,
2915
            'eng-US',
2916
            $contentType
2917
        );
2918
        $userCreate->enabled = true;
2919
        $userCreate->setField('first_name', 'John');
2920
        $userCreate->setField('last_name', 'Doe');
2921
2922
        return $userService->createUser($userCreate, [
2923
            $userService->loadUserGroup($editorsGroupId),
2924
        ]);
2925
    }
2926
2927
    /**
2928
     * Creates the User Content Type with password constraints.
2929
     *
2930
     * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType
2931
     */
2932
    private function createUserWithStrongPasswordContentType(): ContentType
2933
    {
2934
        $repository = $this->getRepository();
2935
2936
        $contentTypeService = $repository->getContentTypeService();
2937
2938
        $typeCreate = $contentTypeService->newContentTypeCreateStruct('user-with-strong-password');
2939
        $typeCreate->mainLanguageCode = 'eng-GB';
2940
        $typeCreate->remoteId = '384b94a1bd6bc06826410e284dd9684887bf56fc';
2941
        $typeCreate->urlAliasSchema = 'url|scheme';
2942
        $typeCreate->nameSchema = 'name|scheme';
2943
        $typeCreate->names = [
2944
            'eng-GB' => 'User with strong password',
2945
        ];
2946
        $typeCreate->descriptions = [
2947
            'eng-GB' => '',
2948
        ];
2949
        $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...
2950
        $typeCreate->creationDate = $this->createDateTime();
2951
2952
        $firstNameFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct('first_name', 'ezstring');
2953
        $firstNameFieldCreate->names = [
2954
            'eng-GB' => 'First name',
2955
        ];
2956
        $firstNameFieldCreate->descriptions = [
2957
            'eng-GB' => '',
2958
        ];
2959
        $firstNameFieldCreate->fieldGroup = 'default';
2960
        $firstNameFieldCreate->position = 1;
2961
        $firstNameFieldCreate->isTranslatable = false;
2962
        $firstNameFieldCreate->isRequired = true;
2963
        $firstNameFieldCreate->isInfoCollector = false;
2964
        $firstNameFieldCreate->validatorConfiguration = [
2965
            'StringLengthValidator' => [
2966
                'minStringLength' => 0,
2967
                'maxStringLength' => 0,
2968
            ],
2969
        ];
2970
        $firstNameFieldCreate->fieldSettings = [];
2971
        $firstNameFieldCreate->isSearchable = true;
2972
        $firstNameFieldCreate->defaultValue = '';
2973
2974
        $typeCreate->addFieldDefinition($firstNameFieldCreate);
2975
2976
        $lastNameFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct('last_name', 'ezstring');
2977
        $lastNameFieldCreate->names = [
2978
            'eng-GB' => 'Last name',
2979
        ];
2980
        $lastNameFieldCreate->descriptions = [
2981
            'eng-GB' => '',
2982
        ];
2983
        $lastNameFieldCreate->fieldGroup = 'default';
2984
        $lastNameFieldCreate->position = 2;
2985
        $lastNameFieldCreate->isTranslatable = false;
2986
        $lastNameFieldCreate->isRequired = true;
2987
        $lastNameFieldCreate->isInfoCollector = false;
2988
        $lastNameFieldCreate->validatorConfiguration = [
2989
            'StringLengthValidator' => [
2990
                'minStringLength' => 0,
2991
                'maxStringLength' => 0,
2992
            ],
2993
        ];
2994
        $lastNameFieldCreate->fieldSettings = [];
2995
        $lastNameFieldCreate->isSearchable = true;
2996
        $lastNameFieldCreate->defaultValue = '';
2997
2998
        $typeCreate->addFieldDefinition($lastNameFieldCreate);
2999
3000
        $accountFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct('account', 'ezuser');
3001
        $accountFieldCreate->names = [
3002
            'eng-GB' => 'User account',
3003
        ];
3004
        $accountFieldCreate->descriptions = [
3005
            'eng-GB' => '',
3006
        ];
3007
        $accountFieldCreate->fieldGroup = 'default';
3008
        $accountFieldCreate->position = 3;
3009
        $accountFieldCreate->isTranslatable = false;
3010
        $accountFieldCreate->isRequired = true;
3011
        $accountFieldCreate->isInfoCollector = false;
3012
        $accountFieldCreate->validatorConfiguration = [
3013
            'PasswordValueValidator' => [
3014
                'requireAtLeastOneUpperCaseCharacter' => 1,
3015
                'requireAtLeastOneLowerCaseCharacter' => 1,
3016
                'requireAtLeastOneNumericCharacter' => 1,
3017
                'requireAtLeastOneNonAlphanumericCharacter' => 1,
3018
                'minLength' => 8,
3019
            ],
3020
        ];
3021
        $accountFieldCreate->fieldSettings = [];
3022
        $accountFieldCreate->isSearchable = false;
3023
        $accountFieldCreate->defaultValue = null;
3024
3025
        $typeCreate->addFieldDefinition($accountFieldCreate);
3026
3027
        $contentTypeDraft = $contentTypeService->createContentType($typeCreate, [
3028
            $contentTypeService->loadContentTypeGroupByIdentifier('Users'),
3029
        ]);
3030
        $contentTypeService->publishContentTypeDraft($contentTypeDraft);
3031
3032
        return $contentTypeService->loadContentTypeByIdentifier('user-with-strong-password');
3033
    }
3034
}
3035