Completed
Push — 7.0 ( acf4a7...ccc80a )
by André
12:25
created

UserServiceTest::testLoadUserByEmail()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 6

Duplication

Lines 15
Ratio 100 %

Importance

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