Completed
Push — master ( 2c0170...b4f3d9 )
by Łukasz
23:04
created

testDeleteUserDeletesRelatedBookmarks()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 27
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 14
nc 1
nop 0
dl 0
loc 27
rs 8.8571
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 deleteUser() method.
1438
     *
1439
     * @covers  \eZ\Publish\API\Repository\UserService::deleteUser()
1440
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1441
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser
1442
     */
1443
    public function testDeleteUserDeletesRelatedBookmarks()
1444
    {
1445
        $repository = $this->getRepository();
1446
1447
        $userService = $repository->getUserService();
1448
        $locationService = $repository->getLocationService();
1449
        $bookmarkService = $repository->getBookmarkService();
1450
        /* BEGIN: Use Case */
1451
        $admin = $repository->getPermissionResolver()->getCurrentUserReference();
1452
1453
        $user = $this->createUserVersion1();
1454
1455
        $repository->getPermissionResolver()->setCurrentUserReference($user);
1456
1457
        $bookmarkService->createBookmark(
1458
            $locationService->loadLocation($this->generateId('location', 43))
1459
        );
1460
1461
        $repository->getPermissionResolver()->setCurrentUserReference($admin);
1462
        // Delete the currently created user
1463
        $userService->deleteUser($user);
1464
1465
        $repository->getPermissionResolver()->setCurrentUserReference($user);
1466
        /* END: Use Case */
1467
1468
        $this->assertEquals(0, $bookmarkService->loadBookmarks(0, 9999)->totalCount);
1469
    }
1470
1471
    /**
1472
     * Test for the newUserUpdateStruct() method.
1473
     *
1474
     * @see \eZ\Publish\API\Repository\UserService::newUserUpdateStruct()
1475
     */
1476
    public function testNewUserUpdateStruct()
1477
    {
1478
        $repository = $this->getRepository();
1479
1480
        /* BEGIN: Use Case */
1481
        $userService = $repository->getUserService();
1482
1483
        // Create a new update struct instance
1484
        $userUpdate = $userService->newUserUpdateStruct();
1485
        /* END: Use Case */
1486
1487
        $this->assertInstanceOf(
1488
            UserUpdateStruct::class,
1489
            $userUpdate
1490
        );
1491
1492
        $this->assertNull($userUpdate->contentUpdateStruct);
1493
        $this->assertNull($userUpdate->contentMetadataUpdateStruct);
1494
1495
        $this->assertPropertiesCorrect(
1496
            [
1497
                'email' => null,
1498
                'password' => null,
1499
                'enabled' => null,
1500
                'maxLogin' => null,
1501
            ],
1502
            $userUpdate
1503
        );
1504
    }
1505
1506
    /**
1507
     * Test for the updateUser() method.
1508
     *
1509
     * @return \eZ\Publish\API\Repository\Values\User\User
1510
     *
1511
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1512
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1513
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserUpdateStruct
1514
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent
1515
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata
1516
     */
1517
    public function testUpdateUser()
1518
    {
1519
        $repository = $this->getRepository();
1520
1521
        $userService = $repository->getUserService();
1522
1523
        /* BEGIN: Use Case */
1524
        $user = $this->createUserVersion1();
1525
1526
        // Create a new update struct instance
1527
        $userUpdate = $userService->newUserUpdateStruct();
1528
1529
        // Set new values for password and maxLogin
1530
        $userUpdate->password = 'my-new-password';
1531
        $userUpdate->maxLogin = 42;
1532
        $userUpdate->enabled = false;
1533
1534
        // Updated the user record.
1535
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1536
        /* END: Use Case */
1537
1538
        $this->assertInstanceOf(
1539
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\User',
1540
            $user
1541
        );
1542
1543
        return $userVersion2;
1544
    }
1545
1546
    /**
1547
     * Test for the updateUser() method.
1548
     *
1549
     * @return \eZ\Publish\API\Repository\Values\User\User
1550
     *
1551
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1552
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1553
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserUpdateStruct
1554
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent
1555
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata
1556
     */
1557
    public function testUpdateUserNoPassword()
1558
    {
1559
        $repository = $this->getRepository();
1560
        $signalSlotUserService = $repository->getUserService();
1561
1562
        $signalSlotUserServiceReflection = new ReflectionClass($signalSlotUserService);
1563
        $userServiceProperty = $signalSlotUserServiceReflection->getProperty('service');
1564
        $userServiceProperty->setAccessible(true);
1565
        $userService = $userServiceProperty->getValue($signalSlotUserService);
1566
1567
        $userServiceReflection = new ReflectionClass($userService);
1568
        $settingsProperty = $userServiceReflection->getProperty('settings');
1569
        $settingsProperty->setAccessible(true);
1570
        $settingsProperty->setValue(
1571
            $userService,
1572
            [
1573
                '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...
1574
            ] + $settingsProperty->getValue($userService)
1575
        );
1576
1577
        /* BEGIN: Use Case */
1578
        $user = $this->createUserVersion1();
1579
1580
        $settingsProperty->setValue(
1581
            $userService,
1582
            [
1583
                'hashType' => User::PASSWORD_HASH_PHP_DEFAULT,
1584
            ] + $settingsProperty->getValue($userService)
1585
        );
1586
1587
        // Create a new update struct instance
1588
        $userUpdate = $userService->newUserUpdateStruct();
1589
1590
        // Set new values for maxLogin, don't change password
1591
        $userUpdate->maxLogin = 43;
1592
        $userUpdate->enabled = false;
1593
1594
        // Updated the user record.
1595
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1596
        /* END: Use Case */
1597
1598
        $this->assertInstanceOf(User::class, $user);
1599
1600
        $this->assertEquals(
1601
            [
1602
                'login' => $user->login,
1603
                'email' => $user->email,
1604
                'passwordHash' => $user->passwordHash,
1605
                'hashAlgorithm' => $user->hashAlgorithm,
1606
                'maxLogin' => 43,
1607
                'enabled' => false,
1608
            ],
1609
            [
1610
                'login' => $userVersion2->login,
1611
                'email' => $userVersion2->email,
1612
                'passwordHash' => $userVersion2->passwordHash,
1613
                'hashAlgorithm' => $userVersion2->hashAlgorithm,
1614
                'maxLogin' => $userVersion2->maxLogin,
1615
                'enabled' => $userVersion2->enabled,
1616
            ]
1617
        );
1618
    }
1619
1620
    /**
1621
     * Test for the updateUser() method.
1622
     *
1623
     * @param \eZ\Publish\API\Repository\Values\User\User $user
1624
     *
1625
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1626
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1627
     */
1628
    public function testUpdateUserUpdatesExpectedProperties(User $user)
1629
    {
1630
        $this->assertEquals(
1631
            array(
1632
                'login' => 'user',
1633
                'email' => '[email protected]',
1634
                'maxLogin' => 42,
1635
                'enabled' => false,
1636
            ),
1637
            array(
1638
                'login' => $user->login,
1639
                'email' => $user->email,
1640
                'maxLogin' => $user->maxLogin,
1641
                'enabled' => $user->enabled,
1642
            )
1643
        );
1644
    }
1645
1646
    /**
1647
     * Test for the updateUser() method.
1648
     *
1649
     * @param \eZ\Publish\API\Repository\Values\User\User $user
1650
     *
1651
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1652
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1653
     */
1654
    public function testUpdateUserReturnsPublishedVersion(User $user)
1655
    {
1656
        $this->assertEquals(
1657
            APIVersionInfo::STATUS_PUBLISHED,
1658
            $user->getVersionInfo()->status
1659
        );
1660
    }
1661
1662
    /**
1663
     * Test for the updateUser() method.
1664
     *
1665
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1666
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1667
     */
1668
    public function testUpdateUserWithContentMetadataUpdateStruct()
1669
    {
1670
        $repository = $this->getRepository();
1671
1672
        $userService = $repository->getUserService();
1673
1674
        /* BEGIN: Use Case */
1675
        $user = $this->createUserVersion1();
1676
1677
        // Get the ContentService implementation
1678
        $contentService = $repository->getContentService();
1679
1680
        // Create a metadata update struct and change the remote id.
1681
        $metadataUpdate = $contentService->newContentMetadataUpdateStruct();
1682
        $metadataUpdate->remoteId = '85e10037d1ac0a00aa75443ced483e08';
1683
1684
        // Create a new update struct instance
1685
        $userUpdate = $userService->newUserUpdateStruct();
1686
1687
        // Set the metadata update struct.
1688
        $userUpdate->contentMetadataUpdateStruct = $metadataUpdate;
1689
1690
        // Updated the user record.
1691
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1692
1693
        // The contentInfo->remoteId will be changed now.
1694
        $remoteId = $userVersion2->contentInfo->remoteId;
1695
        /* END: Use Case */
1696
1697
        $this->assertEquals('85e10037d1ac0a00aa75443ced483e08', $remoteId);
1698
    }
1699
1700
    /**
1701
     * Test for the updateUser() method.
1702
     *
1703
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1704
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1705
     */
1706
    public function testUpdateUserWithContentUpdateStruct()
1707
    {
1708
        $repository = $this->getRepository();
1709
1710
        $userService = $repository->getUserService();
1711
1712
        /* BEGIN: Use Case */
1713
        $user = $this->createUserVersion1();
1714
1715
        // Get the ContentService implementation
1716
        $contentService = $repository->getContentService();
1717
1718
        // Create a content update struct and change the remote id.
1719
        $contentUpdate = $contentService->newContentUpdateStruct();
1720
        $contentUpdate->setField('first_name', 'Hello', 'eng-US');
1721
        $contentUpdate->setField('last_name', 'World', 'eng-US');
1722
1723
        // Create a new update struct instance
1724
        $userUpdate = $userService->newUserUpdateStruct();
1725
1726
        // Set the content update struct.
1727
        $userUpdate->contentUpdateStruct = $contentUpdate;
1728
1729
        // Updated the user record.
1730
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1731
1732
        $name = sprintf(
1733
            '%s %s',
1734
            $userVersion2->getFieldValue('first_name'),
1735
            $userVersion2->getFieldValue('last_name')
1736
        );
1737
        /* END: Use Case */
1738
1739
        $this->assertEquals('Hello World', $name);
1740
    }
1741
1742
    /**
1743
     * Test for the updateUser() method.
1744
     *
1745
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1746
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException
1747
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1748
     */
1749 View Code Duplication
    public function testUpdateUserWhenMissingField()
1750
    {
1751
        $repository = $this->getRepository();
1752
1753
        $userService = $repository->getUserService();
1754
1755
        /* BEGIN: Use Case */
1756
        $user = $this->createUserVersion1();
1757
1758
        // Get the ContentService implementation
1759
        $contentService = $repository->getContentService();
1760
1761
        // Create a content update struct and change the remote id.
1762
        $contentUpdate = $contentService->newContentUpdateStruct();
1763
        $contentUpdate->setField('first_name', null, 'eng-US');
1764
1765
        // Create a new update struct instance
1766
        $userUpdate = $userService->newUserUpdateStruct();
1767
1768
        // Set the content update struct.
1769
        $userUpdate->contentUpdateStruct = $contentUpdate;
1770
1771
        // This call will fail with a "ContentFieldValidationException" because the
1772
        // mandatory field "first_name" is set to an empty value.
1773
        $userService->updateUser($user, $userUpdate);
1774
1775
        /* END: Use Case */
1776
    }
1777
1778
    /**
1779
     * Test for the updateUser() method.
1780
     *
1781
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1782
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1783
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1784
     */
1785 View Code Duplication
    public function testUpdateUserThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
1786
    {
1787
        $repository = $this->getRepository();
1788
1789
        $userService = $repository->getUserService();
1790
1791
        /* BEGIN: Use Case */
1792
        $user = $this->createUserVersion1();
1793
1794
        // Get the ContentService implementation
1795
        $contentService = $repository->getContentService();
1796
1797
        $contentUpdate = $contentService->newContentUpdateStruct();
1798
        // An object of stdClass is not valid for the field first_name
1799
        $contentUpdate->setField('first_name', new \stdClass(), 'eng-US');
1800
1801
        // Create a new update struct instance
1802
        $userUpdate = $userService->newUserUpdateStruct();
1803
1804
        // Set the content update struct.
1805
        $userUpdate->contentUpdateStruct = $contentUpdate;
1806
1807
        // This call will fail with a "InvalidArgumentException" because the
1808
        // the field "first_name" does not accept the given value.
1809
        $userService->updateUser($user, $userUpdate);
1810
1811
        /* END: Use Case */
1812
    }
1813
1814
    /**
1815
     * Test for the loadUserGroupsOfUser() method.
1816
     *
1817
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser
1818
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1819
     */
1820
    public function testLoadUserGroupsOfUser()
1821
    {
1822
        $repository = $this->getRepository();
1823
1824
        $userService = $repository->getUserService();
1825
1826
        /* BEGIN: Use Case */
1827
        $user = $this->createUserVersion1();
1828
1829
        // This array will contain the "Editors" user group name
1830
        $userGroupNames = [];
1831
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
1832
            $this->assertInstanceOf(UserGroup::class, $userGroup);
1833
            $userGroupNames[] = $userGroup->getFieldValue('name');
1834
        }
1835
        /* END: Use Case */
1836
1837
        $this->assertEquals(['Editors'], $userGroupNames);
1838
    }
1839
1840
    /**
1841
     * Test for the loadUsersOfUserGroup() method.
1842
     *
1843
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup
1844
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1845
     */
1846
    public function testLoadUsersOfUserGroup()
1847
    {
1848
        $repository = $this->getRepository();
1849
        $userService = $repository->getUserService();
1850
1851
        $group = $userService->loadUserGroup($this->generateId('group', 13));
1852
1853
        /* BEGIN: Use Case */
1854
        $this->createUserVersion1();
1855
1856
        $this->refreshSearch($repository);
1857
1858
        // This array will contain the email of the newly created "Editor" user
1859
        $email = array();
1860
        foreach ($userService->loadUsersOfUserGroup($group) as $user) {
1861
            $this->assertInstanceOf(User::class, $user);
1862
            $email[] = $user->email;
1863
        }
1864
        /* END: Use Case */
1865
        $this->assertEquals(array('[email protected]'), $email);
1866
    }
1867
1868
    /**
1869
     * Test for the assignUserToUserGroup() method.
1870
     *
1871
     * @see \eZ\Publish\API\Repository\UserService::assignUserToUserGroup()
1872
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser
1873
     */
1874
    public function testAssignUserToUserGroup()
1875
    {
1876
        $repository = $this->getRepository();
1877
        $userService = $repository->getUserService();
1878
1879
        $administratorGroupId = $this->generateId('group', 12);
1880
        /* BEGIN: Use Case */
1881
        // $administratorGroupId is the ID of the "Administrator" group in an
1882
        // eZ Publish demo installation
1883
1884
        $user = $this->createUserVersion1();
1885
1886
        // Assign group to newly created user
1887
        $userService->assignUserToUserGroup(
1888
            $user,
1889
            $userService->loadUserGroup($administratorGroupId)
1890
        );
1891
1892
        // This array will contain "Editors" and "Administrator users"
1893
        $userGroupNames = array();
1894
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
1895
            $userGroupNames[] = $userGroup->getFieldValue('name');
1896
        }
1897
        /* END: Use Case */
1898
1899
        sort($userGroupNames, SORT_STRING);
1900
1901
        $this->assertEquals(
1902
            array(
1903
                'Administrator users',
1904
                'Editors',
1905
            ),
1906
            $userGroupNames
1907
        );
1908
    }
1909
1910
    /**
1911
     * Test for the assignUserToUserGroup() method.
1912
     *
1913
     * @covers \eZ\Publish\API\Repository\UserService::assignUserToUserGroup
1914
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1915
     * @expectedExceptionMessage Argument 'user' is invalid: user is already in the given user group
1916
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testAssignUserToUserGroup
1917
     */
1918 View Code Duplication
    public function testAssignUserToUserGroupThrowsInvalidArgumentException()
1919
    {
1920
        $repository = $this->getRepository();
1921
        $userService = $repository->getUserService();
1922
1923
        $editorsGroupId = $this->generateId('group', 13);
1924
        /* BEGIN: Use Case */
1925
        $user = $this->createUserVersion1();
1926
        // $editorsGroupId is the ID of the "Editors" group in an
1927
        // eZ Publish demo installation
1928
1929
        // This call will fail with an "InvalidArgumentException", because the
1930
        // user is already assigned to the "Editors" group
1931
        $userService->assignUserToUserGroup(
1932
            $user,
1933
            $userService->loadUserGroup($editorsGroupId)
1934
        );
1935
        /* END: Use Case */
1936
    }
1937
1938
    /**
1939
     * Test for the unAssignUssrFromUserGroup() method.
1940
     *
1941
     * @see \eZ\Publish\API\Repository\UserService::unAssignUssrFromUserGroup()
1942
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser
1943
     */
1944
    public function testUnAssignUserFromUserGroup()
1945
    {
1946
        $repository = $this->getRepository();
1947
        $userService = $repository->getUserService();
1948
1949
        $editorsGroupId = $this->generateId('group', 13);
1950
        $anonymousGroupId = $this->generateId('group', 42);
1951
1952
        /* BEGIN: Use Case */
1953
        // $anonymousGroupId is the ID of the "Anonymous Users" group in an eZ
1954
        // Publish demo installation
1955
1956
        $user = $this->createUserVersion1();
1957
1958
        // Assign group to newly created user
1959
        $userService->assignUserToUserGroup(
1960
            $user,
1961
            $userService->loadUserGroup($anonymousGroupId)
1962
        );
1963
1964
        // Unassign user from "Editors" group
1965
        $userService->unAssignUserFromUserGroup(
1966
            $user,
1967
            $userService->loadUserGroup($editorsGroupId)
1968
        );
1969
1970
        // This array will contain "Anonymous Users"
1971
        $userGroupNames = array();
1972
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
1973
            $userGroupNames[] = $userGroup->getFieldValue('name');
1974
        }
1975
        /* END: Use Case */
1976
1977
        $this->assertEquals(array('Anonymous Users'), $userGroupNames);
1978
    }
1979
1980
    /**
1981
     * Test for the unAssignUserFromUserGroup() method.
1982
     *
1983
     * @see \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup()
1984
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1985
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup
1986
     */
1987
    public function testUnAssignUserFromUserGroupThrowsInvalidArgumentException()
1988
    {
1989
        $repository = $this->getRepository();
1990
        $userService = $repository->getUserService();
1991
1992
        $administratorGroupId = $this->generateId('group', 12);
1993
        /* BEGIN: Use Case */
1994
        $user = $this->createUserVersion1();
1995
        // $administratorGroupId is the ID of the "Administrator" group in an
1996
        // eZ Publish demo installation
1997
1998
        // This call will fail with an "InvalidArgumentException", because the
1999
        // user is not assigned to the "Administrator" group
2000
        $userService->unAssignUserFromUserGroup(
2001
            $user,
2002
            $userService->loadUserGroup($administratorGroupId)
2003
        );
2004
        /* END: Use Case */
2005
    }
2006
2007
    /**
2008
     * Test for the unAssignUserFromUserGroup() method removing user from the last group.
2009
     *
2010
     * @covers \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup
2011
     * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException
2012
     * @expectedExceptionMessage Argument 'user' has a bad state: user only has one user group, cannot unassign from last group
2013
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup
2014
     */
2015
    public function testUnAssignUserFromUserGroupThrowsBadStateArgumentException()
2016
    {
2017
        $repository = $this->getRepository();
2018
        $userService = $repository->getUserService();
2019
2020
        $editorsGroupId = $this->generateId('group', 13);
2021
        /* BEGIN: Use Case */
2022
        $user = $this->createUserVersion1();
2023
2024
        // This call will fail with an "BadStateException", because the
2025
        // user has to be assigned to at least one group
2026
        $userService->unAssignUserFromUserGroup(
2027
            $user,
2028
            $userService->loadUserGroup($editorsGroupId)
2029
        );
2030
        /* END: Use Case */
2031
    }
2032
2033
    /**
2034
     * Test that multi-language logic for the loadUserGroup method respects prioritized language list.
2035
     *
2036
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2037
     * @dataProvider getPrioritizedLanguageList
2038
     * @param string[] $prioritizedLanguages
2039
     * @param string|null $expectedLanguageCode language code of expected translation
2040
     */
2041
    public function testLoadUserGroupWithPrioritizedLanguagesList(
2042
        array $prioritizedLanguages,
2043
        $expectedLanguageCode
2044
    ) {
2045
        $repository = $this->getRepository();
2046
        $userService = $repository->getUserService();
2047
2048
        $userGroup = $this->createMultiLanguageUserGroup();
2049
        if ($expectedLanguageCode === null) {
2050
            $expectedLanguageCode = $userGroup->contentInfo->mainLanguageCode;
2051
        }
2052
2053
        $loadedUserGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2054
2055
        self::assertEquals(
2056
            $loadedUserGroup->getName($expectedLanguageCode),
2057
            $loadedUserGroup->getName()
2058
        );
2059
        self::assertEquals(
2060
            $loadedUserGroup->getFieldValue('description', $expectedLanguageCode),
2061
            $loadedUserGroup->getFieldValue('description')
2062
        );
2063
    }
2064
2065
    /**
2066
     * Test that multi-language logic works correctly after updating user group main language.
2067
     *
2068
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2069
     * @dataProvider getPrioritizedLanguageList
2070
     * @param string[] $prioritizedLanguages
2071
     * @param string|null $expectedLanguageCode language code of expected translation
2072
     */
2073
    public function testLoadUserGroupWithPrioritizedLanguagesListAfterMainLanguageUpdate(
2074
        array $prioritizedLanguages,
2075
        $expectedLanguageCode
2076
    ) {
2077
        $repository = $this->getRepository();
2078
        $userService = $repository->getUserService();
2079
        $contentService = $repository->getContentService();
2080
2081
        $userGroup = $this->createMultiLanguageUserGroup();
2082
2083
        $userGroupUpdateStruct = $userService->newUserGroupUpdateStruct();
2084
        $userGroupUpdateStruct->contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct();
2085
        $userGroupUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode = 'eng-GB';
2086
        $userService->updateUserGroup($userGroup, $userGroupUpdateStruct);
2087
2088
        if ($expectedLanguageCode === null) {
2089
            $expectedLanguageCode = 'eng-GB';
2090
        }
2091
2092
        $loadedUserGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2093
2094
        self::assertEquals(
2095
            $loadedUserGroup->getName($expectedLanguageCode),
2096
            $loadedUserGroup->getName()
2097
        );
2098
        self::assertEquals(
2099
            $loadedUserGroup->getFieldValue('description', $expectedLanguageCode),
2100
            $loadedUserGroup->getFieldValue('description')
2101
        );
2102
    }
2103
2104
    /**
2105
     * Test that multi-language logic for the loadSubUserGroups method respects prioritized language list.
2106
     *
2107
     * @covers \eZ\Publish\API\Repository\UserService::loadSubUserGroups
2108
     * @dataProvider getPrioritizedLanguageList
2109
     * @param string[] $prioritizedLanguages
2110
     * @param string|null $expectedLanguageCode language code of expected translation
2111
     */
2112
    public function testLoadSubUserGroupsWithPrioritizedLanguagesList(
2113
        array $prioritizedLanguages,
2114
        $expectedLanguageCode
2115
    ) {
2116
        $repository = $this->getRepository();
2117
        $userService = $repository->getUserService();
2118
2119
        // create main group for subgroups
2120
        $userGroup = $this->createMultiLanguageUserGroup(4);
2121
        if ($expectedLanguageCode === null) {
2122
            $expectedLanguageCode = $userGroup->contentInfo->mainLanguageCode;
2123
        }
2124
2125
        // create subgroups
2126
        $this->createMultiLanguageUserGroup($userGroup->id);
2127
        $this->createMultiLanguageUserGroup($userGroup->id);
2128
2129
        $userGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2130
2131
        $subUserGroups = $userService->loadSubUserGroups($userGroup, 0, 2, $prioritizedLanguages);
2132
        foreach ($subUserGroups as $subUserGroup) {
2133
            self::assertEquals(
2134
                $subUserGroup->getName($expectedLanguageCode),
2135
                $subUserGroup->getName()
2136
            );
2137
            self::assertEquals(
2138
                $subUserGroup->getFieldValue('description', $expectedLanguageCode),
2139
                $subUserGroup->getFieldValue('description')
2140
            );
2141
        }
2142
    }
2143
2144
    /**
2145
     * Test that multi-language logic for the loadUser method respects prioritized language list.
2146
     *
2147
     * @covers \eZ\Publish\API\Repository\UserService::loadUser
2148
     * @dataProvider getPrioritizedLanguageList
2149
     * @param string[] $prioritizedLanguages
2150
     * @param string|null $expectedLanguageCode language code of expected translation
2151
     */
2152 View Code Duplication
    public function testLoadUserWithPrioritizedLanguagesList(
2153
        array $prioritizedLanguages,
2154
        $expectedLanguageCode
2155
    ) {
2156
        $repository = $this->getRepository();
2157
        $userService = $repository->getUserService();
2158
2159
        $user = $this->createMultiLanguageUser();
2160
        if ($expectedLanguageCode === null) {
2161
            $expectedLanguageCode = $user->contentInfo->mainLanguageCode;
2162
        }
2163
2164
        $loadedUser = $userService->loadUser($user->id, $prioritizedLanguages);
2165
2166
        self::assertEquals(
2167
            $loadedUser->getName($expectedLanguageCode),
2168
            $loadedUser->getName()
2169
        );
2170
2171
        foreach (['fist_name', 'last_name', 'signature'] as $fieldIdentifier) {
2172
            self::assertEquals(
2173
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2174
                $loadedUser->getFieldValue($fieldIdentifier)
2175
            );
2176
        }
2177
    }
2178
2179
    /**
2180
     * Test that multi-language logic for the loadUser method works correctly after updating
2181
     * user content main language.
2182
     *
2183
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2184
     * @dataProvider getPrioritizedLanguageList
2185
     * @param string[] $prioritizedLanguages
2186
     * @param string|null $expectedLanguageCode language code of expected translation
2187
     */
2188
    public function testLoadUserWithPrioritizedLanguagesListAfterMainLanguageUpdate(
2189
        array $prioritizedLanguages,
2190
        $expectedLanguageCode
2191
    ) {
2192
        $repository = $this->getRepository();
2193
        $userService = $repository->getUserService();
2194
        $contentService = $repository->getContentService();
2195
2196
        $user = $this->createMultiLanguageUser();
2197
        // sanity check
2198
        self::assertEquals($user->contentInfo->mainLanguageCode, 'eng-US');
2199
2200
        $userUpdateStruct = $userService->newUserUpdateStruct();
2201
        $userUpdateStruct->contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct();
2202
        $userUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode = 'eng-GB';
2203
        $userService->updateUser($user, $userUpdateStruct);
2204
        if ($expectedLanguageCode === null) {
2205
            $expectedLanguageCode = 'eng-GB';
2206
        }
2207
2208
        $loadedUser = $userService->loadUser($user->id, $prioritizedLanguages);
2209
2210
        self::assertEquals(
2211
            $loadedUser->getName($expectedLanguageCode),
2212
            $loadedUser->getName()
2213
        );
2214
2215
        foreach (['fist_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 loadUserByLogin method respects prioritized language list.
2225
     *
2226
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByLogin
2227
     * @dataProvider getPrioritizedLanguageList
2228
     * @param string[] $prioritizedLanguages
2229
     * @param string|null $expectedLanguageCode language code of expected translation
2230
     */
2231 View Code Duplication
    public function testLoadUserByLoginWithPrioritizedLanguagesList(
2232
        array $prioritizedLanguages,
2233
        $expectedLanguageCode
2234
    ) {
2235
        $repository = $this->getRepository();
2236
        $userService = $repository->getUserService();
2237
        $user = $this->createMultiLanguageUser();
2238
2239
        // load, with prioritized languages, the newly created user
2240
        $loadedUser = $userService->loadUserByLogin($user->login, $prioritizedLanguages);
2241
        if ($expectedLanguageCode === null) {
2242
            $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2243
        }
2244
2245
        self::assertEquals(
2246
            $loadedUser->getName($expectedLanguageCode),
2247
            $loadedUser->getName()
2248
        );
2249
2250
        foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2251
            self::assertEquals(
2252
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2253
                $loadedUser->getFieldValue($fieldIdentifier)
2254
            );
2255
        }
2256
    }
2257
2258
    /**
2259
     * Test that multi-language logic for the loadUserByCredentials method respects
2260
     * prioritized language list.
2261
     *
2262
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByCredentials
2263
     * @dataProvider getPrioritizedLanguageList
2264
     * @param string[] $prioritizedLanguages
2265
     * @param string|null $expectedLanguageCode language code of expected translation
2266
     */
2267 View Code Duplication
    public function testLoadUserByCredentialsWithPrioritizedLanguagesList(
2268
        array $prioritizedLanguages,
2269
        $expectedLanguageCode
2270
    ) {
2271
        $repository = $this->getRepository();
2272
        $userService = $repository->getUserService();
2273
        $user = $this->createMultiLanguageUser();
2274
2275
        // load, with prioritized languages, the newly created user
2276
        $loadedUser = $userService->loadUserByCredentials(
2277
            $user->login,
2278
            'secret',
2279
            $prioritizedLanguages
2280
        );
2281
        if ($expectedLanguageCode === null) {
2282
            $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2283
        }
2284
2285
        self::assertEquals(
2286
            $loadedUser->getName($expectedLanguageCode),
2287
            $loadedUser->getName()
2288
        );
2289
2290
        foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2291
            self::assertEquals(
2292
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2293
                $loadedUser->getFieldValue($fieldIdentifier)
2294
            );
2295
        }
2296
    }
2297
2298
    /**
2299
     * Test that multi-language logic for the loadUsersByEmail method respects
2300
     * prioritized language list.
2301
     *
2302
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersByEmail
2303
     * @dataProvider getPrioritizedLanguageList
2304
     * @param string[] $prioritizedLanguages
2305
     * @param string|null $expectedLanguageCode language code of expected translation
2306
     */
2307 View Code Duplication
    public function testLoadUsersByEmailWithPrioritizedLanguagesList(
2308
        array $prioritizedLanguages,
2309
        $expectedLanguageCode
2310
    ) {
2311
        $repository = $this->getRepository();
2312
        $userService = $repository->getUserService();
2313
        $user = $this->createMultiLanguageUser();
2314
2315
        // load, with prioritized languages, users by email
2316
        $loadedUsers = $userService->loadUsersByEmail($user->email, $prioritizedLanguages);
2317
2318
        foreach ($loadedUsers as $loadedUser) {
2319
            if ($expectedLanguageCode === null) {
2320
                $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2321
            }
2322
            self::assertEquals(
2323
                $loadedUser->getName($expectedLanguageCode),
2324
                $loadedUser->getName()
2325
            );
2326
2327
            foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2328
                self::assertEquals(
2329
                    $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2330
                    $loadedUser->getFieldValue($fieldIdentifier)
2331
                );
2332
            }
2333
        }
2334
    }
2335
2336
    /**
2337
     * Test that multi-language logic for the loadUserGroupsOfUser method respects
2338
     * prioritized language list.
2339
     *
2340
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser
2341
     * @dataProvider getPrioritizedLanguageList
2342
     * @param string[] $prioritizedLanguages
2343
     * @param string|null $expectedLanguageCode language code of expected translation
2344
     */
2345
    public function testLoadUserGroupsOfUserWithPrioritizedLanguagesList(
2346
        array $prioritizedLanguages,
2347
        $expectedLanguageCode
2348
    ) {
2349
        $repository = $this->getRepository();
2350
        $userService = $repository->getUserService();
2351
        $userGroup = $this->createMultiLanguageUserGroup();
2352
        $user = $this->createMultiLanguageUser($userGroup->id);
2353
2354
        $userGroups = $userService->loadUserGroupsOfUser($user, 0, 25, $prioritizedLanguages);
2355
        foreach ($userGroups as $userGroup) {
2356
            self::assertEquals(
2357
                $userGroup->getName($expectedLanguageCode),
2358
                $userGroup->getName()
2359
            );
2360
            self::assertEquals(
2361
                $userGroup->getFieldValue('description', $expectedLanguageCode),
2362
                $userGroup->getFieldValue('description')
2363
            );
2364
        }
2365
    }
2366
2367
    /**
2368
     * Test that multi-language logic for the loadUsersOfUserGroup method respects
2369
     * prioritized language list.
2370
     *
2371
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup
2372
     * @dataProvider getPrioritizedLanguageList
2373
     * @param string[] $prioritizedLanguages
2374
     * @param string|null $expectedLanguageCode language code of expected translation
2375
     */
2376
    public function testLoadUsersOfUserGroupWithPrioritizedLanguagesList(
2377
        array $prioritizedLanguages,
2378
        $expectedLanguageCode
2379
    ) {
2380
        $repository = $this->getRepository();
2381
        $userService = $repository->getUserService();
2382
2383
        // create parent user group
2384
        $userGroup = $this->createMultiLanguageUserGroup();
2385
        // add two users to the created parent user group
2386
        $this->createMultiLanguageUser($userGroup->id);
2387
        $this->createMultiLanguageUser($userGroup->id);
2388
2389
        // test loading of users via user group with prioritized languages list
2390
        $users = $userService->loadUsersOfUserGroup($userGroup, 0, 25, $prioritizedLanguages);
2391
        foreach ($users as $user) {
2392
            if ($expectedLanguageCode === null) {
2393
                $expectedLanguageCode = $user->contentInfo->mainLanguageCode;
2394
            }
2395
            self::assertEquals(
2396
                $user->getName($expectedLanguageCode),
2397
                $user->getName()
2398
            );
2399
2400
            foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2401
                self::assertEquals(
2402
                    $user->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2403
                    $user->getFieldValue($fieldIdentifier)
2404
                );
2405
            }
2406
        }
2407
    }
2408
2409
    /**
2410
     * Get prioritized languages list data.
2411
     *
2412
     * Test cases using this data provider should expect the following arguments:
2413
     * <code>
2414
     *   array $prioritizedLanguagesList
2415
     *   string $expectedLanguage (if null - use main language)
2416
     * </code>
2417
     *
2418
     * @return array
2419
     */
2420 View Code Duplication
    public function getPrioritizedLanguageList()
2421
    {
2422
        return [
2423
            [[], null],
2424
            [['eng-US'], 'eng-US'],
2425
            [['eng-GB'], 'eng-GB'],
2426
            [['eng-US', 'eng-GB'], 'eng-US'],
2427
            [['eng-GB', 'eng-US'], 'eng-GB'],
2428
            // use non-existent group as the first one
2429
            [['ger-DE'], null],
2430
            [['ger-DE', 'eng-GB'], 'eng-GB'],
2431
        ];
2432
    }
2433
2434
    /**
2435
     * @param int $parentGroupId
2436
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
2437
     */
2438
    private function createMultiLanguageUserGroup($parentGroupId = 4)
2439
    {
2440
        $repository = $this->getRepository();
2441
        $userService = $repository->getUserService();
2442
2443
        // create user group with multiple translations
2444
        $parentGroupId = $this->generateId('group', $parentGroupId);
2445
        $parentGroup = $userService->loadUserGroup($parentGroupId);
2446
2447
        $userGroupCreateStruct = $userService->newUserGroupCreateStruct('eng-US');
2448
        $userGroupCreateStruct->setField('name', 'US user group', 'eng-US');
2449
        $userGroupCreateStruct->setField('name', 'GB user group', 'eng-GB');
2450
        $userGroupCreateStruct->setField('description', 'US user group description', 'eng-US');
2451
        $userGroupCreateStruct->setField('description', 'GB user group description', 'eng-GB');
2452
        $userGroupCreateStruct->alwaysAvailable = true;
2453
2454
        return $userService->createUserGroup($userGroupCreateStruct, $parentGroup);
2455
    }
2456
2457
    /**
2458
     * Create a user group fixture in a variable named <b>$userGroup</b>,.
2459
     *
2460
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
2461
     */
2462
    private function createUserGroupVersion1()
2463
    {
2464
        $repository = $this->getRepository();
2465
2466
        $mainGroupId = $this->generateId('group', 4);
2467
        /* BEGIN: Inline */
2468
        // $mainGroupId is the ID of the main "Users" group
2469
2470
        $userService = $repository->getUserService();
2471
2472
        // Load main group
2473
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
2474
2475
        // Instantiate a new create struct
2476
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
2477
        $userGroupCreate->setField('name', 'Example Group');
2478
2479
        // Create the new user group
2480
        $userGroup = $userService->createUserGroup(
2481
            $userGroupCreate,
2482
            $parentUserGroup
2483
        );
2484
        /* END: Inline */
2485
2486
        return $userGroup;
2487
    }
2488
2489
    /**
2490
     * Create user with multiple translations of User Content fields.
2491
     *
2492
     * @param int $userGroupId User group ID (default 13 - Editors)
2493
     *
2494
     * @return \eZ\Publish\API\Repository\Values\User\User
2495
     */
2496
    private function createMultiLanguageUser($userGroupId = 13)
2497
    {
2498
        $repository = $this->getRepository();
2499
        $userService = $repository->getUserService();
2500
2501
        // Instantiate a create struct with mandatory properties
2502
        $randomLogin = md5(mt_rand() . time());
2503
        $userCreateStruct = $userService->newUserCreateStruct(
2504
            $randomLogin,
2505
            "{$randomLogin}@example.com",
2506
            'secret',
2507
            'eng-US'
2508
        );
2509
        $userCreateStruct->enabled = true;
2510
        $userCreateStruct->alwaysAvailable = true;
2511
2512
        // set field for each language
2513
        foreach (['eng-US', 'eng-GB'] as $languageCode) {
2514
            $userCreateStruct->setField('first_name', "{$languageCode} Example", $languageCode);
2515
            $userCreateStruct->setField('last_name', "{$languageCode} User", $languageCode);
2516
            $userCreateStruct->setField('signature', "{$languageCode} signature", $languageCode);
2517
        }
2518
2519
        // Load parent group for the user
2520
        $group = $userService->loadUserGroup($userGroupId);
2521
2522
        // Create a new user
2523
        return $userService->createUser($userCreateStruct, [$group]);
2524
    }
2525
2526
    /**
2527
     * Test for the createUser() method.
2528
     *
2529
     * @see \eZ\Publish\API\Repository\UserService::createUser()
2530
     */
2531
    public function testCreateUserInvalidPasswordHashTypeThrowsException()
2532
    {
2533
        $this->expectException(InvalidArgumentException::class);
2534
        $this->expectExceptionMessage("Argument 'type' is invalid: Password hash type '42424242' is not recognized");
2535
2536
        $repository = $this->getRepository();
2537
        $signalSlotUserService = $repository->getUserService();
2538
2539
        $signalSlotUserServiceReflection = new ReflectionClass($signalSlotUserService);
2540
        $userServiceProperty = $signalSlotUserServiceReflection->getProperty('service');
2541
        $userServiceProperty->setAccessible(true);
2542
        $userService = $userServiceProperty->getValue($signalSlotUserService);
2543
2544
        $userServiceReflection = new ReflectionClass($userService);
2545
        $settingsProperty = $userServiceReflection->getProperty('settings');
2546
        $settingsProperty->setAccessible(true);
2547
2548
        $defaultUserServiceSettings = $settingsProperty->getValue($userService);
2549
2550
        /* BEGIN: Use Case */
2551
        $settingsProperty->setValue(
2552
            $userService,
2553
            [
2554
                'hashType' => 42424242, // Non-existing hash type
2555
            ] + $settingsProperty->getValue($userService)
2556
        );
2557
2558
        try {
2559
            $this->createUserVersion1();
2560
        } catch (InvalidArgumentException $e) {
2561
            // Reset to default settings, so we don't break other tests
2562
            $settingsProperty->setValue($userService, $defaultUserServiceSettings);
2563
2564
            throw $e;
2565
        }
2566
        /* END: Use Case */
2567
2568
        // Reset to default settings, so we don't break other tests
2569
        $settingsProperty->setValue($userService, $defaultUserServiceSettings);
2570
    }
2571
2572
    /**
2573
     * Test loading User by Token.
2574
     *
2575
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByToken
2576
     */
2577 View Code Duplication
    public function testLoadUserByToken()
2578
    {
2579
        $repository = $this->getRepository();
2580
        $userService = $repository->getUserService();
2581
2582
        $user = $this->createUserVersion1();
2583
2584
        $userTokenUpdateStruct = new UserTokenUpdateStruct();
2585
        $userTokenUpdateStruct->hashKey = md5('hash');
2586
        $userTokenUpdateStruct->time = new DateTime();
2587
2588
        $userService->updateUserToken($user, $userTokenUpdateStruct);
2589
2590
        $loadedUser = $userService->loadUserByToken($userTokenUpdateStruct->hashKey);
2591
        self::assertEquals($user, $loadedUser);
2592
2593
        return $userTokenUpdateStruct->hashKey;
2594
    }
2595
2596
    /**
2597
     * Test trying to load User by invalid Token.
2598
     *
2599
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByToken
2600
     */
2601
    public function testLoadUserByTokenThrowsNotFoundException()
2602
    {
2603
        $this->expectException(NotFoundException::class);
2604
2605
        $repository = $this->getRepository();
2606
        $userService = $repository->getUserService();
2607
2608
        $user = $this->createUserVersion1();
2609
2610
        $userTokenUpdateStruct = new UserTokenUpdateStruct();
2611
        $userTokenUpdateStruct->hashKey = md5('hash');
2612
        $userTokenUpdateStruct->time = new DateTime();
2613
2614
        $userService->updateUserToken($user, $userTokenUpdateStruct);
2615
2616
        $userService->loadUserByToken('not_existing_token');
2617
    }
2618
2619
    /**
2620
     * Test updating User Token.
2621
     *
2622
     * @covers  \eZ\Publish\API\Repository\UserService::updateUserToken()
2623
     *
2624
     * @depends testLoadUserByToken
2625
     *
2626
     * @param string $originalUserToken
2627
     */
2628 View Code Duplication
    public function testUpdateUserToken($originalUserToken)
2629
    {
2630
        $repository = $this->getRepository(false);
2631
        $userService = $repository->getUserService();
2632
2633
        $user = $userService->loadUserByToken($originalUserToken);
2634
2635
        $userTokenUpdateStruct = new UserTokenUpdateStruct();
2636
        $userTokenUpdateStruct->hashKey = md5('my_updated_hash');
2637
        $userTokenUpdateStruct->time = new DateTime();
2638
2639
        $userService->updateUserToken($user, $userTokenUpdateStruct);
2640
2641
        $loadedUser = $userService->loadUserByToken($userTokenUpdateStruct->hashKey);
2642
        self::assertEquals($user, $loadedUser);
2643
    }
2644
2645
    /**
2646
     * Test invalidating (expiring) User Token.
2647
     *
2648
     * @covers \eZ\Publish\API\Repository\UserService::expireUserToken()
2649
     *
2650
     * @depends testLoadUserByToken
2651
     *
2652
     * @param string $userToken
2653
     */
2654
    public function testExpireUserToken($userToken)
2655
    {
2656
        $this->expectException(NotFoundException::class);
2657
2658
        $repository = $this->getRepository(false);
2659
        $userService = $repository->getUserService();
2660
2661
        // sanity check
2662
        $userService->loadUserByToken($userToken);
2663
2664
        $userService->expireUserToken($userToken);
2665
2666
        // should throw NotFoundException now
2667
        $userService->loadUserByToken($userToken);
2668
    }
2669
}
2670