Completed
Push — master ( 59965c...4339a8 )
by
unknown
114:08 queued 95:41
created

testLoadUserByTokenThrowsNotFoundException()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 17
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

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