Completed
Push — EZP-30475 ( 824882...facf2b )
by André
18:25
created

UserServiceTest::testNewUserWithDomainName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9

Duplication

Lines 9
Ratio 100 %

Importance

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