Completed
Push — EZP-30405 ( 2e70aa )
by André
49:58 queued 26:49
created

UserServiceTest::createMultiLanguageUserGroup()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

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