Completed
Push — master ( 2fef72...ca35b8 )
by Łukasz
23:27
created

UserServiceTest::dataProviderForValidatePassword()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

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