Completed
Push — master ( f0ec2b...727f6e )
by André
127:20 queued 102:26
created

testLoadUserGroupWithPrioritizedLanguagesList()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 23
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 15
nc 2
nop 2
dl 0
loc 23
rs 9.0856
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\NotFoundException;
12
use eZ\Publish\API\Repository\Values\Content\ContentInfo;
13
use eZ\Publish\API\Repository\Values\Content\VersionInfo as APIVersionInfo;
14
use eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct;
15
use eZ\Publish\API\Repository\Values\User\UserUpdateStruct;
16
use eZ\Publish\API\Repository\Values\User\User;
17
use eZ\Publish\Core\Repository\Values\Content\Content;
18
use eZ\Publish\Core\Repository\Values\Content\VersionInfo;
19
use eZ\Publish\Core\Repository\Values\User\UserGroup;
20
use Exception;
21
22
/**
23
 * Test case for operations in the UserService using in memory storage.
24
 *
25
 * @see eZ\Publish\API\Repository\UserService
26
 * @group integration
27
 * @group user
28
 */
29
class UserServiceTest extends BaseTest
30
{
31
    /**
32
     * Test for the loadUserGroup() method.
33
     *
34
     * @see \eZ\Publish\API\Repository\UserService::loadUserGroup()
35
     */
36
    public function testLoadUserGroup()
37
    {
38
        $repository = $this->getRepository();
39
40
        $mainGroupId = $this->generateId('group', 4);
41
        /* BEGIN: Use Case */
42
        // $mainGroupId is the ID of the main "Users" group
43
44
        $userService = $repository->getUserService();
45
46
        $userGroup = $userService->loadUserGroup($mainGroupId);
47
        /* END: Use Case */
48
49
        $this->assertInstanceOf('\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup', $userGroup);
50
    }
51
52
    /**
53
     * Test for the loadUserGroup() method.
54
     *
55
     * @see \eZ\Publish\API\Repository\UserService::loadUserGroup()
56
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
57
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
58
     */
59
    public function testLoadUserGroupThrowsNotFoundException()
60
    {
61
        $repository = $this->getRepository();
62
63
        $nonExistingGroupId = $this->generateId('group', self::DB_INT_MAX);
64
        /* BEGIN: Use Case */
65
        $userService = $repository->getUserService();
66
67
        // This call will fail with a NotFoundException
68
        $userService->loadUserGroup($nonExistingGroupId);
69
        /* END: Use Case */
70
    }
71
72
    /**
73
     * Test for the loadSubUserGroups() method.
74
     *
75
     * @see \eZ\Publish\API\Repository\UserService::loadSubUserGroups()
76
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
77
     */
78
    public function testLoadSubUserGroups()
79
    {
80
        $repository = $this->getRepository();
81
82
        $mainGroupId = $this->generateId('group', 4);
83
        /* BEGIN: Use Case */
84
        // $mainGroupId is the ID of the main "Users" group
85
86
        $userService = $repository->getUserService();
87
88
        $userGroup = $userService->loadUserGroup($mainGroupId);
89
90
        $subUserGroups = $userService->loadSubUserGroups($userGroup);
91
        foreach ($subUserGroups as $subUserGroup) {
92
            // Do something with the $subUserGroup
93
            $this->assertInstanceOf('\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup', $subUserGroup);
94
        }
95
        /* END: Use Case */
96
    }
97
98
    /**
99
     * Test loading sub groups throwing NotFoundException.
100
     *
101
     * @covers \eZ\Publish\API\Repository\UserService::loadSubUserGroups
102
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
103
     */
104 View Code Duplication
    public function testLoadSubUserGroupsThrowsNotFoundException()
105
    {
106
        $repository = $this->getRepository();
107
        $userService = $repository->getUserService();
108
109
        $parentGroup = new UserGroup(
110
            [
111
                'content' => new Content(
112
                    [
113
                        'versionInfo' => new VersionInfo(
114
                            [
115
                                'contentInfo' => new ContentInfo(
116
                                ['id' => 123456]
117
                            ),
118
                            ]
119
                        ),
120
                        'internalFields' => [],
121
                    ]
122
                ),
123
            ]
124
        );
125
        $userService->loadSubUserGroups($parentGroup);
126
    }
127
128
    /**
129
     * Test for the newUserGroupCreateStruct() method.
130
     *
131
     * @return \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct
132
     *
133
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
134
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
135
     */
136
    public function testNewUserGroupCreateStruct()
137
    {
138
        $repository = $this->getRepository();
139
140
        /* BEGIN: Use Case */
141
        $userService = $repository->getUserService();
142
143
        $groupCreate = $userService->newUserGroupCreateStruct('eng-US');
144
        /* END: Use Case */
145
146
        $this->assertInstanceOf(
147
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroupCreateStruct',
148
            $groupCreate
149
        );
150
151
        return $groupCreate;
152
    }
153
154
    /**
155
     * Test for the newUserGroupCreateStruct() method.
156
     *
157
     * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $groupCreate
158
     *
159
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
160
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
161
     */
162
    public function testNewUserGroupCreateStructSetsMainLanguageCode($groupCreate)
163
    {
164
        $this->assertEquals('eng-US', $groupCreate->mainLanguageCode);
165
    }
166
167
    /**
168
     * Test for the newUserGroupCreateStruct() method.
169
     *
170
     * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $groupCreate
171
     *
172
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
173
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
174
     */
175
    public function testNewUserGroupCreateStructSetsContentType($groupCreate)
176
    {
177
        $this->assertInstanceOf(
178
            '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType',
179
            $groupCreate->contentType
180
        );
181
    }
182
183
    /**
184
     * Test for the newUserGroupCreateStruct() method.
185
     *
186
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct($mainLanguageCode, $contentType)
187
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
188
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
189
     */
190 View Code Duplication
    public function testNewUserGroupCreateStructWithSecondParameter()
191
    {
192
        if ($this->isVersion4()) {
193
            $this->markTestSkipped('This test is only relevant for eZ Publish versions > 4');
194
        }
195
196
        $repository = $this->getRepository();
197
198
        /* BEGIN: Use Case */
199
        $contentTypeService = $repository->getContentTypeService();
200
        $userService = $repository->getUserService();
201
202
        // Load the default ContentType for user groups
203
        $groupType = $contentTypeService->loadContentTypeByIdentifier('user_group');
204
205
        // Instantiate a new group create struct
206
        $groupCreate = $userService->newUserGroupCreateStruct(
207
            'eng-US',
208
            $groupType
209
        );
210
        /* END: Use Case */
211
212
        $this->assertSame($groupType, $groupCreate->contentType);
213
    }
214
215
    /**
216
     * Test for the createUserGroup() method.
217
     *
218
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
219
     *
220
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
221
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
222
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
223
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
224
     */
225
    public function testCreateUserGroup()
226
    {
227
        /* BEGIN: Use Case */
228
        $userGroup = $this->createUserGroupVersion1();
229
        /* END: Use Case */
230
231
        $this->assertInstanceOf(
232
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup',
233
            $userGroup
234
        );
235
236
        $versionInfo = $userGroup->getVersionInfo();
237
238
        $this->assertEquals(APIVersionInfo::STATUS_PUBLISHED, $versionInfo->status);
239
        $this->assertEquals(1, $versionInfo->versionNo);
240
241
        return $userGroup;
242
    }
243
244
    /**
245
     * Test for the createUserGroup() method.
246
     *
247
     * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup
248
     *
249
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
250
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
251
     */
252
    public function testCreateUserGroupSetsExpectedProperties($userGroup)
253
    {
254
        $this->assertEquals(
255
            array(
256
                'parentId' => $this->generateId('group', 4),
257
                'subGroupCount' => 0,
258
            ),
259
            array(
260
                'parentId' => $userGroup->parentId,
261
                'subGroupCount' => $userGroup->subGroupCount,
0 ignored issues
show
Deprecated Code introduced by
The property eZ\Publish\API\Repositor...erGroup::$subGroupCount has been deprecated with message: As of eZ Publish 5.3.3, count can be obtained on demand using location service.

This property 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 property will be removed from the class and what other property to use instead.

Loading history...
262
            )
263
        );
264
    }
265
266
    /**
267
     * Test for the createUserGroup() method.
268
     *
269
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
270
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
271
     */
272 View Code Duplication
    public function testCreateUserGroupIncrementsParentSubGroupCount()
273
    {
274
        $repository = $this->getRepository();
275
        $userService = $repository->getUserService();
276
        $mainGroupId = $this->generateId('group', 4);
277
278
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
279
        $parentGroupCount = $parentUserGroup->subGroupCount;
0 ignored issues
show
Deprecated Code introduced by
The property eZ\Publish\API\Repositor...erGroup::$subGroupCount has been deprecated with message: As of eZ Publish 5.3.3, count can be obtained on demand using location service.

This property 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 property will be removed from the class and what other property to use instead.

Loading history...
280
281
        /* BEGIN: Use Case */
282
        $this->createUserGroupVersion1();
283
284
        $this->refreshSearch($repository);
285
286
        // This should be one greater than before
287
        $subGroupCount = $userService->loadUserGroup($mainGroupId)->subGroupCount;
0 ignored issues
show
Deprecated Code introduced by
The property eZ\Publish\API\Repositor...erGroup::$subGroupCount has been deprecated with message: As of eZ Publish 5.3.3, count can be obtained on demand using location service.

This property 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 property will be removed from the class and what other property to use instead.

Loading history...
288
        /* END: Use Case */
289
290
        $this->assertEquals($parentGroupCount + 1, $subGroupCount);
291
    }
292
293
    /**
294
     * Test for the createUserGroup() method.
295
     *
296
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
297
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
298
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
299
     */
300 View Code Duplication
    public function testCreateUserGroupThrowsInvalidArgumentException()
301
    {
302
        $repository = $this->getRepository();
303
304
        $mainGroupId = $this->generateId('group', 4);
305
        /* BEGIN: Use Case */
306
        // $mainGroupId is the ID of the main "Users" group
307
308
        $userService = $repository->getUserService();
309
310
        // Load main group
311
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
312
313
        // Instantiate a new create struct
314
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
315
        $userGroupCreate->setField('name', 'Example Group');
316
        $userGroupCreate->remoteId = '5f7f0bdb3381d6a461d8c29ff53d908f';
317
318
        // This call will fail with an "InvalidArgumentException", because the
319
        // specified remoteId is already used for the "Members" user group.
320
        $userService->createUserGroup(
321
            $userGroupCreate,
322
            $parentUserGroup
323
        );
324
        /* END: Use Case */
325
    }
326
327
    /**
328
     * Test for the createUserGroup() method.
329
     *
330
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
331
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
332
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
333
     */
334
    public function testCreateUserGroupThrowsInvalidArgumentExceptionFieldTypeNotAccept()
335
    {
336
        $repository = $this->getRepository();
337
338
        $mainGroupId = $this->generateId('group', 4);
339
        /* BEGIN: Use Case */
340
        // $mainGroupId is the ID of the main "Users" group
341
342
        $userService = $repository->getUserService();
343
344
        // Load main group
345
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
346
347
        // Instantiate a new create struct
348
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
349
        $userGroupCreate->setField('name', new \stdClass());
350
351
        // This call will fail with an "InvalidArgumentException", because the
352
        // specified remoteId is already used for the "Members" user group.
353
        $userService->createUserGroup(
354
            $userGroupCreate,
355
            $parentUserGroup
356
        );
357
        /* END: Use Case */
358
    }
359
360
    /**
361
     * Test for the createUserGroup() method.
362
     *
363
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
364
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException
365
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
366
     */
367
    public function testCreateUserGroupWhenMissingField()
368
    {
369
        $repository = $this->getRepository();
370
371
        $mainGroupId = $this->generateId('group', 4);
372
        /* BEGIN: Use Case */
373
        // $mainGroupId is the ID of the main "Users" group
374
375
        $userService = $repository->getUserService();
376
377
        // Load main group
378
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
379
380
        // Instantiate a new create struct
381
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
382
383
        // This call will fail with a "ContentFieldValidationException", because the
384
        // only mandatory field "name" is not set.
385
        $userService->createUserGroup($userGroupCreate, $parentUserGroup);
386
        /* END: Use Case */
387
    }
388
389
    /**
390
     * Test for the createUserGroup() method.
391
     *
392
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
393
     *
394
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
395
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
396
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
397
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
398
     */
399
    public function testCreateUserGroupInTransactionWithRollback()
400
    {
401
        $repository = $this->getRepository();
402
403
        $mainGroupId = $this->generateId('group', 4);
404
        /* BEGIN: Use Case */
405
        // $mainGroupId is the ID of the main "Users" group
406
407
        $userService = $repository->getUserService();
408
409
        $repository->beginTransaction();
410
411
        try {
412
            // Load main group
413
            $parentUserGroup = $userService->loadUserGroup($mainGroupId);
414
415
            // Instantiate a new create struct
416
            $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
417
            $userGroupCreate->setField('name', 'Example Group');
418
419
            // Create the new user group
420
            $createdUserGroupId = $userService->createUserGroup(
421
                $userGroupCreate,
422
                $parentUserGroup
423
            )->id;
424
        } catch (Exception $e) {
425
            // Cleanup hanging transaction on error
426
            $repository->rollback();
427
            throw $e;
428
        }
429
430
        $repository->rollback();
431
432
        try {
433
            // Throws exception since creation of user group was rolled back
434
            $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...
435
        } catch (NotFoundException $e) {
436
            return;
437
        }
438
        /* END: Use Case */
439
440
        $this->fail('User group object still exists after rollback.');
441
    }
442
443
    /**
444
     * Test for the deleteUserGroup() method.
445
     *
446
     * @see \eZ\Publish\API\Repository\UserService::deleteUserGroup()
447
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
448
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
449
     */
450
    public function testDeleteUserGroup()
451
    {
452
        $repository = $this->getRepository();
453
        $userService = $repository->getUserService();
454
455
        /* BEGIN: Use Case */
456
        $userGroup = $this->createUserGroupVersion1();
457
458
        // Delete the currently created user group again
459
        $userService->deleteUserGroup($userGroup);
460
        /* END: Use Case */
461
462
        // We use the NotFoundException here for verification
463
        $userService->loadUserGroup($userGroup->id);
464
    }
465
466
    /**
467
     * Test deleting user group throwing NotFoundException.
468
     *
469
     * @covers \eZ\Publish\API\Repository\UserService::deleteUserGroup
470
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
471
     */
472 View Code Duplication
    public function testDeleteUserGroupThrowsNotFoundException()
473
    {
474
        $repository = $this->getRepository();
475
        $userService = $repository->getUserService();
476
477
        $userGroup = new UserGroup(
478
            [
479
                'content' => new Content(
480
                    [
481
                        'versionInfo' => new VersionInfo(
482
                            ['contentInfo' => new ContentInfo(['id' => 123456])]
483
                        ),
484
                        'internalFields' => [],
485
                    ]
486
                ),
487
            ]
488
        );
489
        $userService->deleteUserGroup($userGroup);
490
    }
491
492
    /**
493
     * Test for the moveUserGroup() method.
494
     *
495
     * @see \eZ\Publish\API\Repository\UserService::moveUserGroup()
496
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
497
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadSubUserGroups
498
     */
499
    public function testMoveUserGroup()
500
    {
501
        $repository = $this->getRepository();
502
        $userService = $repository->getUserService();
503
504
        $membersGroupId = $this->generateId('group', 13);
505
        /* BEGIN: Use Case */
506
        // $membersGroupId is the ID of the "Members" user group in an eZ
507
        // Publish demo installation
508
509
        $userGroup = $this->createUserGroupVersion1();
510
511
        // Load the new parent group
512
        $membersUserGroup = $userService->loadUserGroup($membersGroupId);
513
514
        // Move user group from "Users" to "Members"
515
        $userService->moveUserGroup($userGroup, $membersUserGroup);
516
517
        // Reload the user group to get an updated $parentId
518
        $userGroup = $userService->loadUserGroup($userGroup->id);
519
520
        $this->refreshSearch($repository);
521
522
        // The returned array will no contain $userGroup
523
        $subUserGroups = $userService->loadSubUserGroups(
524
            $membersUserGroup
525
        );
526
        /* END: Use Case */
527
528
        $subUserGroupIds = array_map(
529
            function ($content) {
530
                return $content->id;
531
            },
532
            $subUserGroups
533
        );
534
535
        $this->assertEquals($membersGroupId, $userGroup->parentId);
536
        $this->assertEquals(array($userGroup->id), $subUserGroupIds);
537
    }
538
539
    /**
540
     * Test for the moveUserGroup() method.
541
     *
542
     * @see \eZ\Publish\API\Repository\UserService::moveUserGroup()
543
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testMoveUserGroup
544
     */
545 View Code Duplication
    public function testMoveUserGroupIncrementsSubGroupCountOnNewParent()
546
    {
547
        $repository = $this->getRepository();
548
        $userService = $repository->getUserService();
549
550
        $membersGroupId = $this->generateId('group', 13);
551
        /* BEGIN: Use Case */
552
        // $membersGroupId is the ID of the "Members" user group in an eZ
553
        // Publish demo installation
554
555
        $userGroup = $this->createUserGroupVersion1();
556
557
        // Load the new parent group
558
        $membersUserGroup = $userService->loadUserGroup($membersGroupId);
559
560
        // Move user group from "Users" to "Members"
561
        $userService->moveUserGroup($userGroup, $membersUserGroup);
562
563
        $this->refreshSearch($repository);
564
565
        // Reload the user group to get an updated $subGroupCount
566
        $membersUserGroupUpdated = $userService->loadUserGroup($membersGroupId);
567
        /* END: Use Case */
568
569
        $this->assertEquals(1, $membersUserGroupUpdated->subGroupCount);
0 ignored issues
show
Deprecated Code introduced by
The property eZ\Publish\API\Repositor...erGroup::$subGroupCount has been deprecated with message: As of eZ Publish 5.3.3, count can be obtained on demand using location service.

This property 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 property will be removed from the class and what other property to use instead.

Loading history...
570
    }
571
572
    /**
573
     * Test for the moveUserGroup() method.
574
     *
575
     * @see \eZ\Publish\API\Repository\UserService::moveUserGroup()
576
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testMoveUserGroup
577
     */
578 View Code Duplication
    public function testMoveUserGroupDecrementsSubGroupCountOnOldParent()
579
    {
580
        $repository = $this->getRepository();
581
        $userService = $repository->getUserService();
582
583
        $membersGroupId = $this->generateId('group', 13);
584
        /* BEGIN: Use Case */
585
        // $membersGroupId is the ID of the "Members" user group in an eZ
586
        // Publish demo installation
587
588
        $userGroup = $this->createUserGroupVersion1();
589
590
        // Load the new parent group
591
        $membersUserGroup = $userService->loadUserGroup($membersGroupId);
592
593
        // Move user group from "Users" to "Members"
594
        $userService->moveUserGroup($userGroup, $membersUserGroup);
595
        /* END: Use Case */
596
597
        $mainUserGroup = $userService->loadUserGroup($this->generateId('group', 4));
598
599
        $this->assertEquals(5, $mainUserGroup->subGroupCount);
0 ignored issues
show
Deprecated Code introduced by
The property eZ\Publish\API\Repositor...erGroup::$subGroupCount has been deprecated with message: As of eZ Publish 5.3.3, count can be obtained on demand using location service.

This property 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 property will be removed from the class and what other property to use instead.

Loading history...
600
    }
601
602
    /**
603
     * Test moving a user group below another group throws NotFoundException.
604
     *
605
     * @covers \eZ\Publish\API\Repository\UserService::moveUserGroup
606
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
607
     */
608
    public function testMoveUserGroupThrowsNotFoundException()
609
    {
610
        $repository = $this->getRepository();
611
        $userService = $repository->getUserService();
612
613
        $userGroupToMove = new UserGroup(
614
            [
615
                'content' => new Content(
616
                    [
617
                        'versionInfo' => new VersionInfo(
618
                            ['contentInfo' => new ContentInfo(['id' => 123456])]
619
                        ),
620
                        'internalFields' => [],
621
                    ]
622
                ),
623
            ]
624
        );
625
        $parentUserGroup = new UserGroup(
626
            [
627
                'content' => new Content(
628
                    [
629
                        'versionInfo' => new VersionInfo(
630
                            ['contentInfo' => new ContentInfo(['id' => 123455])]
631
                        ),
632
                        'internalFields' => [],
633
                    ]
634
                ),
635
            ]
636
        );
637
        $userService->moveUserGroup($userGroupToMove, $parentUserGroup);
638
    }
639
640
    /**
641
     * Test for the newUserGroupUpdateStruct() method.
642
     *
643
     * @covers \eZ\Publish\API\Repository\UserService::newUserGroupUpdateStruct
644
     */
645
    public function testNewUserGroupUpdateStruct()
646
    {
647
        $repository = $this->getRepository();
648
649
        /* BEGIN: Use Case */
650
        $userService = $repository->getUserService();
651
652
        $groupUpdate = $userService->newUserGroupUpdateStruct();
653
        /* END: Use Case */
654
655
        $this->assertInstanceOf(
656
            UserGroupUpdateStruct::class,
657
            $groupUpdate
658
        );
659
660
        $this->assertNull($groupUpdate->contentUpdateStruct);
661
        $this->assertNull($groupUpdate->contentMetadataUpdateStruct);
662
    }
663
664
    /**
665
     * Test for the updateUserGroup() method.
666
     *
667
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
668
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
669
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupUpdateStruct
670
     */
671
    public function testUpdateUserGroup()
672
    {
673
        $repository = $this->getRepository();
674
        $userService = $repository->getUserService();
675
676
        /* BEGIN: Use Case */
677
        $userGroup = $this->createUserGroupVersion1();
678
679
        // Create a group update struct and change nothing
680
        $groupUpdate = $userService->newUserGroupUpdateStruct();
681
682
        // This update will do nothing
683
        $userGroup = $userService->updateUserGroup(
684
            $userGroup,
685
            $groupUpdate
686
        );
687
        /* END: Use Case */
688
689
        $this->assertInstanceOf(
690
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup',
691
            $userGroup
692
        );
693
694
        $this->assertEquals(1, $userGroup->getVersionInfo()->versionNo);
695
    }
696
697
    /**
698
     * Test for the updateUserGroup() method.
699
     *
700
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
701
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
702
     */
703 View Code Duplication
    public function testUpdateUserGroupWithSubContentUpdateStruct()
704
    {
705
        $repository = $this->getRepository();
706
        $userService = $repository->getUserService();
707
708
        /* BEGIN: Use Case */
709
        $userGroup = $this->createUserGroupVersion1();
710
711
        // Load the content service
712
        $contentService = $repository->getContentService();
713
714
        // Create a content update struct and update the group name
715
        $contentUpdate = $contentService->newContentUpdateStruct();
716
        $contentUpdate->setField('name', 'Sindelfingen', 'eng-US');
717
718
        // Create a group update struct and set content update struct
719
        $groupUpdate = $userService->newUserGroupUpdateStruct();
720
        $groupUpdate->contentUpdateStruct = $contentUpdate;
721
722
        // This will update the name and the increment the group version number
723
        $userGroup = $userService->updateUserGroup(
724
            $userGroup,
725
            $groupUpdate
726
        );
727
        /* END: Use Case */
728
729
        $this->assertEquals('Sindelfingen', $userGroup->getFieldValue('name', 'eng-US'));
730
731
        $versionInfo = $userGroup->getVersionInfo();
732
733
        $this->assertEquals(APIVersionInfo::STATUS_PUBLISHED, $versionInfo->status);
734
        $this->assertEquals(2, $versionInfo->versionNo);
735
    }
736
737
    /**
738
     * Test for the updateUserGroup() method.
739
     *
740
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
741
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
742
     */
743
    public function testUpdateUserGroupWithSubContentMetadataUpdateStruct()
744
    {
745
        $repository = $this->getRepository();
746
        $userService = $repository->getUserService();
747
748
        /* BEGIN: Use Case */
749
        $userGroup = $this->createUserGroupVersion1();
750
751
        // Load the content service
752
        $contentService = $repository->getContentService();
753
754
        // Create a metadata update struct and change the remoteId
755
        $metadataUpdate = $contentService->newContentMetadataUpdateStruct();
756
        $metadataUpdate->remoteId = '3c61299780663bafa3af2101e52125da';
757
758
        // Create a group update struct and set content update struct
759
        $groupUpdate = $userService->newUserGroupUpdateStruct();
760
        $groupUpdate->contentMetadataUpdateStruct = $metadataUpdate;
761
762
        // This will update the name and the increment the group version number
763
        $userGroup = $userService->updateUserGroup(
764
            $userGroup,
765
            $groupUpdate
766
        );
767
        /* END: Use Case */
768
769
        $this->assertEquals(
770
            '3c61299780663bafa3af2101e52125da',
771
            $userGroup->contentInfo->remoteId
772
        );
773
774
        $versionInfo = $userGroup->getVersionInfo();
775
776
        $this->assertEquals(APIVersionInfo::STATUS_PUBLISHED, $versionInfo->status);
777
        $this->assertEquals(1, $versionInfo->versionNo);
778
    }
779
780
    /**
781
     * Test for the updateUserGroup() method.
782
     *
783
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
784
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
785
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
786
     */
787 View Code Duplication
    public function testUpdateUserGroupThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
788
    {
789
        $repository = $this->getRepository();
790
        $userService = $repository->getUserService();
791
792
        /* BEGIN: Use Case */
793
        $userGroup = $this->createUserGroupVersion1();
794
795
        // Load the content service
796
        $contentService = $repository->getContentService();
797
798
        // Create a content update struct and update the group name
799
        $contentUpdate = $contentService->newContentUpdateStruct();
800
        // An object of stdClass is not accepted as a value by the field "name"
801
        $contentUpdate->setField('name', new \stdClass(), 'eng-US');
802
803
        // Create a group update struct and set content update struct
804
        $groupUpdate = $userService->newUserGroupUpdateStruct();
805
        $groupUpdate->contentUpdateStruct = $contentUpdate;
806
807
        // This call will fail with an InvalidArgumentException, because the
808
        // field "name" does not accept the given value
809
        $userService->updateUserGroup($userGroup, $groupUpdate);
810
        /* END: Use Case */
811
    }
812
813
    /**
814
     * Test for the newUserCreateStruct() method.
815
     *
816
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct()
817
     */
818
    public function testNewUserCreateStruct()
819
    {
820
        $repository = $this->getRepository();
821
822
        /* BEGIN: Use Case */
823
        $userService = $repository->getUserService();
824
825
        $userCreate = $userService->newUserCreateStruct(
826
            'user',
827
            '[email protected]',
828
            'secret',
829
            'eng-US'
830
        );
831
        /* END: Use Case */
832
833
        $this->assertInstanceOf(
834
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserCreateStruct',
835
            $userCreate
836
        );
837
838
        return $userCreate;
839
    }
840
841
    /**
842
     * Test updating a user group throws ContentFieldValidationException.
843
     *
844
     * @covers \eZ\Publish\API\Repository\UserService::updateUserGroup
845
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException
846
     */
847 View Code Duplication
    public function testUpdateUserGroupThrowsContentFieldValidationExceptionOnRequiredFieldEmpty()
848
    {
849
        $repository = $this->getRepository();
850
        $userService = $repository->getUserService();
851
        $contentService = $repository->getContentService();
852
853
        $userGroup = $userService->loadUserGroup(42);
854
        $userGroupUpdateStruct = $userService->newUserGroupUpdateStruct();
855
        $userGroupUpdateStruct->contentUpdateStruct = $contentService->newContentUpdateStruct();
856
        $userGroupUpdateStruct->contentUpdateStruct->setField('name', '', 'eng-US');
857
858
        $userService->updateUserGroup($userGroup, $userGroupUpdateStruct);
859
    }
860
861
    /**
862
     * Test for the newUserCreateStruct() method.
863
     *
864
     * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreate
865
     *
866
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct()
867
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
868
     */
869 View Code Duplication
    public function testNewUserCreateStructSetsExpectedProperties($userCreate)
870
    {
871
        $this->assertEquals(
872
            array(
873
                'login' => 'user',
874
                'email' => '[email protected]',
875
                'password' => 'secret',
876
                'mainLanguageCode' => 'eng-US',
877
            ),
878
            array(
879
                'login' => $userCreate->login,
880
                'email' => $userCreate->email,
881
                'password' => $userCreate->password,
882
                'mainLanguageCode' => $userCreate->mainLanguageCode,
883
            )
884
        );
885
    }
886
887
    /**
888
     * Test for the newUserCreateStruct() method.
889
     *
890
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct($login, $email, $password, $mainLanguageCode, $contentType)
891
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
892
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
893
     */
894 View Code Duplication
    public function testNewUserCreateStructWithFifthParameter()
895
    {
896
        if ($this->isVersion4()) {
897
            $this->markTestSkipped('This test is only relevant for eZ Publish versions > 4');
898
        }
899
900
        $repository = $this->getRepository();
901
902
        /* BEGIN: Use Case */
903
        $contentTypeService = $repository->getContentTypeService();
904
        $userService = $repository->getUserService();
905
906
        $userType = $contentTypeService->loadContentTypeByIdentifier('user');
907
908
        $userCreate = $userService->newUserCreateStruct(
909
            'user',
910
            '[email protected]',
911
            'secret',
912
            'eng-US',
913
            $userType
914
        );
915
        /* END: Use Case */
916
917
        $this->assertSame($userType, $userCreate->contentType);
918
    }
919
920
    /**
921
     * Test for the createUser() method.
922
     *
923
     * @return \eZ\Publish\API\Repository\Values\User\User
924
     *
925
     * @see \eZ\Publish\API\Repository\UserService::createUser()
926
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
927
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
928
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
929
     */
930
    public function testCreateUser()
931
    {
932
        /* BEGIN: Use Case */
933
        $user = $this->createUserVersion1();
934
        /* END: Use Case */
935
936
        $this->assertInstanceOf(
937
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\User',
938
            $user
939
        );
940
941
        return $user;
942
    }
943
944
    /**
945
     * Test for the createUser() method.
946
     *
947
     * @param \eZ\Publish\API\Repository\Values\User\User $user
948
     *
949
     * @see \eZ\Publish\API\Repository\UserService::createUser()
950
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
951
     */
952 View Code Duplication
    public function testCreateUserSetsExpectedProperties(User $user)
953
    {
954
        $this->assertEquals(
955
            array(
956
                'login' => 'user',
957
                'email' => '[email protected]',
958
                'passwordHash' => $this->createHash(
959
                    'user',
960
                    'secret',
961
                    $user->hashAlgorithm
962
                ),
963
                'mainLanguageCode' => 'eng-US',
964
            ),
965
            array(
966
                'login' => $user->login,
967
                'email' => $user->email,
968
                'passwordHash' => $user->passwordHash,
969
                'mainLanguageCode' => $user->contentInfo->mainLanguageCode,
970
            )
971
        );
972
    }
973
974
    /**
975
     * Test for the createUser() method.
976
     *
977
     * @see \eZ\Publish\API\Repository\UserService::createUser()
978
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException
979
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
980
     */
981 View Code Duplication
    public function testCreateUserWhenMissingField()
982
    {
983
        $repository = $this->getRepository();
984
985
        $editorsGroupId = $this->generateId('group', 13);
986
        /* BEGIN: Use Case */
987
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
988
        // Publish demo installation
989
990
        $userService = $repository->getUserService();
991
992
        // Instantiate a create struct with mandatory properties
993
        $userCreate = $userService->newUserCreateStruct(
994
            'user',
995
            '[email protected]',
996
            'secret',
997
            'eng-US'
998
        );
999
1000
        // Do not set the mandatory fields "first_name" and "last_name"
1001
        //$userCreate->setField( 'first_name', 'Example' );
1002
        //$userCreate->setField( 'last_name', 'User' );
1003
1004
        // Load parent group for the user
1005
        $group = $userService->loadUserGroup($editorsGroupId);
1006
1007
        // This call will fail with a "ContentFieldValidationException", because the
1008
        // mandatory fields "first_name" and "last_name" are not set.
1009
        $userService->createUser($userCreate, array($group));
1010
        /* END: Use Case */
1011
    }
1012
1013
    /**
1014
     * Test for the createUser() method.
1015
     *
1016
     * @see \eZ\Publish\API\Repository\UserService::createUser()
1017
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1018
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1019
     */
1020 View Code Duplication
    public function testCreateUserThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
1021
    {
1022
        $repository = $this->getRepository();
1023
1024
        $editorsGroupId = $this->generateId('group', 13);
1025
        /* BEGIN: Use Case */
1026
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
1027
        // Publish demo installation
1028
1029
        $userService = $repository->getUserService();
1030
1031
        // Instantiate a create struct with mandatory properties
1032
        $userCreate = $userService->newUserCreateStruct(
1033
            'user',
1034
            '[email protected]',
1035
            'secret',
1036
            'eng-US'
1037
        );
1038
1039
        // An object of stdClass is not a valid value for the field first_name
1040
        $userCreate->setField('first_name', new \stdClass());
1041
        $userCreate->setField('last_name', 'User');
1042
1043
        // Load parent group for the user
1044
        $group = $userService->loadUserGroup($editorsGroupId);
1045
1046
        // This call will fail with an "InvalidArgumentException", because the
1047
        // value for the firled "first_name" is not accepted by the field type.
1048
        $userService->createUser($userCreate, array($group));
1049
        /* END: Use Case */
1050
    }
1051
1052
    /**
1053
     * Test for the createUser() method.
1054
     *
1055
     * @covers \eZ\Publish\API\Repository\UserService::createUser
1056
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1057
     * @expectedExceptionMessage Argument 'userCreateStruct' is invalid: User with provided login already exists
1058
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1059
     */
1060 View Code Duplication
    public function testCreateUserThrowsInvalidArgumentException()
1061
    {
1062
        $repository = $this->getRepository();
1063
1064
        $editorsGroupId = $this->generateId('group', 13);
1065
        /* BEGIN: Use Case */
1066
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
1067
        // Publish demo installation
1068
1069
        $userService = $repository->getUserService();
1070
1071
        // Instantiate a create struct with mandatory properties
1072
        $userCreate = $userService->newUserCreateStruct(
1073
            // admin is an existing login
1074
            'admin',
1075
            '[email protected]',
1076
            'secret',
1077
            'eng-US'
1078
        );
1079
1080
        $userCreate->setField('first_name', 'Example');
1081
        $userCreate->setField('last_name', 'User');
1082
1083
        // Load parent group for the user
1084
        $group = $userService->loadUserGroup($editorsGroupId);
1085
1086
        // This call will fail with a "InvalidArgumentException", because the
1087
        // user with "admin" login already exists.
1088
        $userService->createUser($userCreate, array($group));
1089
        /* END: Use Case */
1090
    }
1091
1092
    /**
1093
     * Test for the createUser() method.
1094
     *
1095
     * @return \eZ\Publish\API\Repository\Values\User\User
1096
     *
1097
     * @see \eZ\Publish\API\Repository\UserService::createUser()
1098
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
1099
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
1100
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
1101
     */
1102
    public function testCreateUserInTransactionWithRollback()
1103
    {
1104
        $repository = $this->getRepository();
1105
        $userService = $repository->getUserService();
1106
1107
        /* BEGIN: Use Case */
1108
        $repository->beginTransaction();
1109
1110
        try {
1111
            $user = $this->createUserVersion1();
1112
        } catch (Exception $e) {
1113
            // Cleanup hanging transaction on error
1114
            $repository->rollback();
1115
            throw $e;
1116
        }
1117
1118
        $repository->rollback();
1119
1120
        try {
1121
            // Throws exception since creation of user was rolled back
1122
            $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...
1123
        } catch (NotFoundException $e) {
1124
            return;
1125
        }
1126
        /* END: Use Case */
1127
1128
        $this->fail('User object still exists after rollback.');
1129
    }
1130
1131
    /**
1132
     * Test creating a user throwing NotFoundException.
1133
     *
1134
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1135
     * @covers \eZ\Publish\API\Repository\UserService::createUser
1136
     */
1137
    public function testCreateUserThrowsNotFoundException()
1138
    {
1139
        $repository = $this->getRepository();
1140
        $userService = $repository->getUserService();
1141
1142
        $userCreateStruct = $userService->newUserCreateStruct('new_user', '[email protected]', 'password', 'eng-GB');
1143
        $userCreateStruct->setField('first_name', 'New');
1144
        $userCreateStruct->setField('last_name', 'User');
1145
1146
        $parentGroup = new UserGroup(
1147
            [
1148
                'content' => new Content(
1149
                    [
1150
                        'versionInfo' => new VersionInfo(
1151
                            [
1152
                                'contentInfo' => new ContentInfo(['id' => 123456]),
1153
                            ]
1154
                        ),
1155
                        'internalFields' => [],
1156
                    ]
1157
                ),
1158
            ]
1159
        );
1160
        $userService->createUser($userCreateStruct, [$parentGroup]);
1161
    }
1162
1163
    /**
1164
     * Test for the loadUser() method.
1165
     *
1166
     * @see \eZ\Publish\API\Repository\UserService::loadUser()
1167
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1168
     */
1169
    public function testLoadUser()
1170
    {
1171
        $repository = $this->getRepository();
1172
1173
        $userService = $repository->getUserService();
1174
1175
        /* BEGIN: Use Case */
1176
        $user = $this->createUserVersion1();
1177
1178
        // Load the newly created user
1179
        $userReloaded = $userService->loadUser($user->id);
1180
        /* END: Use Case */
1181
1182
        $this->assertEquals($user, $userReloaded);
1183
    }
1184
1185
    /**
1186
     * Test for the loadUser() method.
1187
     *
1188
     * @see \eZ\Publish\API\Repository\UserService::loadUser()
1189
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1190
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser
1191
     */
1192
    public function testLoadUserThrowsNotFoundException()
1193
    {
1194
        $repository = $this->getRepository();
1195
1196
        $nonExistingUserId = $this->generateId('user', self::DB_INT_MAX);
1197
        /* BEGIN: Use Case */
1198
        $userService = $repository->getUserService();
1199
1200
        // This call will fail with a "NotFoundException", because no user with
1201
        // an id equal to self::DB_INT_MAX should exist.
1202
        $userService->loadUser($nonExistingUserId);
1203
        /* END: Use Case */
1204
    }
1205
1206
    /**
1207
     * Test for the loadAnonymousUser() method.
1208
     *
1209
     * @see \eZ\Publish\API\Repository\UserService::loadAnonymousUser()
1210
     */
1211
    public function testLoadAnonymousUser()
1212
    {
1213
        $repository = $this->getRepository();
1214
1215
        $anonymousUserId = $this->generateId('user', 10);
1216
        /* BEGIN: Use Case */
1217
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
1218
        // Publish demo installation.
1219
        $userService = $repository->getUserService();
1220
1221
        // Load default anonymous user available in each eZ Publish installation
1222
        $anonymousUser = $userService->loadUser($anonymousUserId);
1223
        /* END: Use Case */
1224
1225
        $this->assertInstanceOf(
1226
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\User',
1227
            $anonymousUser
1228
        );
1229
1230
        $this->assertEquals('anonymous', $anonymousUser->login);
1231
    }
1232
1233
    /**
1234
     * Test for the loadUserByCredentials() method.
1235
     *
1236
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1237
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1238
     */
1239
    public function testLoadUserByCredentials()
1240
    {
1241
        $repository = $this->getRepository();
1242
1243
        $userService = $repository->getUserService();
1244
1245
        /* BEGIN: Use Case */
1246
        $user = $this->createUserVersion1();
1247
1248
        // Load the newly created user
1249
        $userReloaded = $userService->loadUserByCredentials('user', 'secret');
1250
        /* END: Use Case */
1251
1252
        $this->assertEquals($user, $userReloaded);
1253
    }
1254
1255
    /**
1256
     * Test for the loadUserByCredentials() method.
1257
     *
1258
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1259
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1260
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1261
     */
1262
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownPassword()
1263
    {
1264
        $repository = $this->getRepository();
1265
1266
        $userService = $repository->getUserService();
1267
1268
        /* BEGIN: Use Case */
1269
        $this->createUserVersion1();
1270
1271
        // This call will fail with a "NotFoundException", because the given
1272
        // login/password combination does not exist.
1273
        $userService->loadUserByCredentials('user', 'SeCrEt');
1274
        /* END: Use Case */
1275
    }
1276
1277
    /**
1278
     * Test for the loadUserByCredentials() method.
1279
     *
1280
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1281
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1282
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1283
     */
1284
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownPasswordEmtpy()
1285
    {
1286
        $repository = $this->getRepository();
1287
1288
        $userService = $repository->getUserService();
1289
1290
        /* BEGIN: Use Case */
1291
        $this->createUserVersion1();
1292
1293
        // This call will fail with a "NotFoundException", because the given
1294
        // login/password combination does not exist.
1295
        $userService->loadUserByCredentials('user', '');
1296
        /* END: Use Case */
1297
    }
1298
1299
    /**
1300
     * Test for the loadUserByCredentials() method.
1301
     *
1302
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1303
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1304
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1305
     */
1306
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownLogin()
1307
    {
1308
        $repository = $this->getRepository();
1309
1310
        $userService = $repository->getUserService();
1311
1312
        /* BEGIN: Use Case */
1313
        $this->createUserVersion1();
1314
1315
        // This call will fail with a "NotFoundException", because the given
1316
        // login/password combination does not exist.
1317
        $userService->loadUserByCredentials('üser', 'secret');
1318
        /* END: Use Case */
1319
    }
1320
1321
    /**
1322
     * Test for the loadUserByCredentials() method.
1323
     *
1324
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1325
     * @expectedException \eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue
1326
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1327
     */
1328
    public function testLoadUserByCredentialsThrowsInvalidArgumentValueForEmptyLogin()
1329
    {
1330
        $repository = $this->getRepository();
1331
1332
        $userService = $repository->getUserService();
1333
1334
        /* BEGIN: Use Case */
1335
        $this->createUserVersion1();
1336
1337
        // This call will fail with a "InvalidArgumentValue", because the given
1338
        // login is empty.
1339
        $userService->loadUserByCredentials('', 'secret');
1340
        /* END: Use Case */
1341
    }
1342
1343
    /**
1344
     * Test for the loadUserByLogin() method.
1345
     *
1346
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1347
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1348
     */
1349 View Code Duplication
    public function testLoadUserByLogin()
1350
    {
1351
        $repository = $this->getRepository();
1352
1353
        $userService = $repository->getUserService();
1354
1355
        /* BEGIN: Use Case */
1356
        $user = $this->createUserVersion1();
1357
1358
        // Load the newly created user
1359
        $userReloaded = $userService->loadUserByLogin('user');
1360
        /* END: Use Case */
1361
1362
        $this->assertPropertiesCorrect(
1363
            array(
1364
                'login' => $user->login,
1365
                'email' => $user->email,
1366
                'passwordHash' => $user->passwordHash,
1367
                'hashAlgorithm' => $user->hashAlgorithm,
1368
                'enabled' => $user->enabled,
1369
                'maxLogin' => $user->maxLogin,
1370
                'id' => $user->id,
1371
                'contentInfo' => $user->contentInfo,
1372
                'versionInfo' => $user->versionInfo,
1373
                'fields' => $user->fields,
1374
            ),
1375
            $userReloaded
1376
        );
1377
    }
1378
1379
    /**
1380
     * Test for the loadUserByLogin() method.
1381
     *
1382
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1383
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1384
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByLogin
1385
     */
1386
    public function testLoadUserByLoginThrowsNotFoundExceptionForUnknownLogin()
1387
    {
1388
        $repository = $this->getRepository();
1389
1390
        $userService = $repository->getUserService();
1391
1392
        /* BEGIN: Use Case */
1393
        $this->createUserVersion1();
1394
1395
        // This call will fail with a "NotFoundException", because the given
1396
        // login/password combination does not exist.
1397
        $userService->loadUserByLogin('user42');
1398
        /* END: Use Case */
1399
    }
1400
1401
    /**
1402
     * Test for the loadUserByLogin() method.
1403
     *
1404
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1405
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByLogin
1406
     */
1407 View Code Duplication
    public function testLoadUserByLoginWorksForLoginWithWrongCase()
1408
    {
1409
        $repository = $this->getRepository();
1410
1411
        $userService = $repository->getUserService();
1412
1413
        /* BEGIN: Use Case */
1414
        $user = $this->createUserVersion1();
1415
1416
        // Lookup by user login should ignore casing
1417
        $userReloaded = $userService->loadUserByLogin('USER');
1418
        /* END: Use Case */
1419
1420
        $this->assertPropertiesCorrect(
1421
            array(
1422
                'login' => $user->login,
1423
                'email' => $user->email,
1424
                'passwordHash' => $user->passwordHash,
1425
                'hashAlgorithm' => $user->hashAlgorithm,
1426
                'enabled' => $user->enabled,
1427
                'maxLogin' => $user->maxLogin,
1428
                'id' => $user->id,
1429
                'contentInfo' => $user->contentInfo,
1430
                'versionInfo' => $user->versionInfo,
1431
                'fields' => $user->fields,
1432
            ),
1433
            $userReloaded
1434
        );
1435
    }
1436
1437
    /**
1438
     * Test for the loadUsersByEmail() method.
1439
     *
1440
     * @see \eZ\Publish\API\Repository\UserService::loadUsersByEmail()
1441
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1442
     */
1443 View Code Duplication
    public function testLoadUserByEmail()
1444
    {
1445
        $repository = $this->getRepository();
1446
1447
        $userService = $repository->getUserService();
1448
1449
        /* BEGIN: Use Case */
1450
        $user = $this->createUserVersion1();
1451
1452
        // Load the newly created user
1453
        $usersReloaded = $userService->loadUsersByEmail('[email protected]');
1454
        /* END: Use Case */
1455
1456
        $this->assertEquals(array($user), $usersReloaded);
1457
    }
1458
1459
    /**
1460
     * Test for the loadUsersByEmail() method.
1461
     *
1462
     * @see \eZ\Publish\API\Repository\UserService::loadUsersByEmail()
1463
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByEmail
1464
     */
1465 View Code Duplication
    public function testLoadUserByEmailReturnsEmptyInUnknownEmail()
1466
    {
1467
        $repository = $this->getRepository();
1468
1469
        $userService = $repository->getUserService();
1470
1471
        /* BEGIN: Use Case */
1472
        $this->createUserVersion1();
1473
1474
        // This call will return empty array, because the given
1475
        // login/password combination does not exist.
1476
        $emptyUserList = $userService->loadUsersByEmail('[email protected]');
1477
        /* END: Use Case */
1478
1479
        $this->assertEquals(array(), $emptyUserList);
1480
    }
1481
1482
    /**
1483
     * Test for the deleteUser() method.
1484
     *
1485
     * @see \eZ\Publish\API\Repository\UserService::deleteUser()
1486
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1487
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1488
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser
1489
     */
1490 View Code Duplication
    public function testDeleteUser()
1491
    {
1492
        $repository = $this->getRepository();
1493
1494
        $userService = $repository->getUserService();
1495
1496
        /* BEGIN: Use Case */
1497
        $user = $this->createUserVersion1();
1498
1499
        // Delete the currently created user
1500
        $userService->deleteUser($user);
1501
        /* END: Use Case */
1502
1503
        // We use the NotFoundException here to verify that the user not exists
1504
        $userService->loadUser($user->id);
1505
    }
1506
1507
    /**
1508
     * Test for the newUserUpdateStruct() method.
1509
     *
1510
     * @see \eZ\Publish\API\Repository\UserService::newUserUpdateStruct()
1511
     */
1512
    public function testNewUserUpdateStruct()
1513
    {
1514
        $repository = $this->getRepository();
1515
1516
        /* BEGIN: Use Case */
1517
        $userService = $repository->getUserService();
1518
1519
        // Create a new update struct instance
1520
        $userUpdate = $userService->newUserUpdateStruct();
1521
        /* END: Use Case */
1522
1523
        $this->assertInstanceOf(
1524
            UserUpdateStruct::class,
1525
            $userUpdate
1526
        );
1527
1528
        $this->assertNull($userUpdate->contentUpdateStruct);
1529
        $this->assertNull($userUpdate->contentMetadataUpdateStruct);
1530
1531
        $this->assertPropertiesCorrect(
1532
            [
1533
                'email' => null,
1534
                'password' => null,
1535
                'enabled' => null,
1536
                'maxLogin' => null,
1537
            ],
1538
            $userUpdate
1539
        );
1540
    }
1541
1542
    /**
1543
     * Test for the updateUser() method.
1544
     *
1545
     * @return \eZ\Publish\API\Repository\Values\User\User
1546
     *
1547
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1548
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1549
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserUpdateStruct
1550
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent
1551
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata
1552
     */
1553
    public function testUpdateUser()
1554
    {
1555
        $repository = $this->getRepository();
1556
1557
        $userService = $repository->getUserService();
1558
1559
        /* BEGIN: Use Case */
1560
        $user = $this->createUserVersion1();
1561
1562
        // Create a new update struct instance
1563
        $userUpdate = $userService->newUserUpdateStruct();
1564
1565
        // Set new values for password and maxLogin
1566
        $userUpdate->password = 'my-new-password';
1567
        $userUpdate->maxLogin = 42;
1568
        $userUpdate->enabled = false;
1569
1570
        // Updated the user record.
1571
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1572
        /* END: Use Case */
1573
1574
        $this->assertInstanceOf(
1575
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\User',
1576
            $user
1577
        );
1578
1579
        return $userVersion2;
1580
    }
1581
1582
    /**
1583
     * Test for the updateUser() method.
1584
     *
1585
     * @param \eZ\Publish\API\Repository\Values\User\User $user
1586
     *
1587
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1588
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1589
     */
1590
    public function testUpdateUserUpdatesExpectedProperties(User $user)
1591
    {
1592
        $this->assertEquals(
1593
            array(
1594
                'login' => 'user',
1595
                'email' => '[email protected]',
1596
                'passwordHash' => $this->createHash(
1597
                    'user',
1598
                    'my-new-password',
1599
                    $user->hashAlgorithm
1600
                ),
1601
                'maxLogin' => 42,
1602
                'enabled' => false,
1603
            ),
1604
            array(
1605
                'login' => $user->login,
1606
                'email' => $user->email,
1607
                'passwordHash' => $user->passwordHash,
1608
                'maxLogin' => $user->maxLogin,
1609
                'enabled' => $user->enabled,
1610
            )
1611
        );
1612
    }
1613
1614
    /**
1615
     * Test for the updateUser() method.
1616
     *
1617
     * @param \eZ\Publish\API\Repository\Values\User\User $user
1618
     *
1619
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1620
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1621
     */
1622
    public function testUpdateUserReturnsPublishedVersion($user)
1623
    {
1624
        $this->assertEquals(
1625
            APIVersionInfo::STATUS_PUBLISHED,
1626
            $user->getVersionInfo()->status
1627
        );
1628
    }
1629
1630
    /**
1631
     * Test for the updateUser() method.
1632
     *
1633
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1634
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1635
     */
1636
    public function testUpdateUserWithContentMetadataUpdateStruct()
1637
    {
1638
        $repository = $this->getRepository();
1639
1640
        $userService = $repository->getUserService();
1641
1642
        /* BEGIN: Use Case */
1643
        $user = $this->createUserVersion1();
1644
1645
        // Get the ContentService implementation
1646
        $contentService = $repository->getContentService();
1647
1648
        // Create a metadata update struct and change the remote id.
1649
        $metadataUpdate = $contentService->newContentMetadataUpdateStruct();
1650
        $metadataUpdate->remoteId = '85e10037d1ac0a00aa75443ced483e08';
1651
1652
        // Create a new update struct instance
1653
        $userUpdate = $userService->newUserUpdateStruct();
1654
1655
        // Set the metadata update struct.
1656
        $userUpdate->contentMetadataUpdateStruct = $metadataUpdate;
1657
1658
        // Updated the user record.
1659
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1660
1661
        // The contentInfo->remoteId will be changed now.
1662
        $remoteId = $userVersion2->contentInfo->remoteId;
1663
        /* END: Use Case */
1664
1665
        $this->assertEquals('85e10037d1ac0a00aa75443ced483e08', $remoteId);
1666
    }
1667
1668
    /**
1669
     * Test for the updateUser() method.
1670
     *
1671
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1672
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1673
     */
1674
    public function testUpdateUserWithContentUpdateStruct()
1675
    {
1676
        $repository = $this->getRepository();
1677
1678
        $userService = $repository->getUserService();
1679
1680
        /* BEGIN: Use Case */
1681
        $user = $this->createUserVersion1();
1682
1683
        // Get the ContentService implementation
1684
        $contentService = $repository->getContentService();
1685
1686
        // Create a content update struct and change the remote id.
1687
        $contentUpdate = $contentService->newContentUpdateStruct();
1688
        $contentUpdate->setField('first_name', 'Hello', 'eng-US');
1689
        $contentUpdate->setField('last_name', 'World', 'eng-US');
1690
1691
        // Create a new update struct instance
1692
        $userUpdate = $userService->newUserUpdateStruct();
1693
1694
        // Set the content update struct.
1695
        $userUpdate->contentUpdateStruct = $contentUpdate;
1696
1697
        // Updated the user record.
1698
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1699
1700
        $name = sprintf(
1701
            '%s %s',
1702
            $userVersion2->getFieldValue('first_name'),
1703
            $userVersion2->getFieldValue('last_name')
1704
        );
1705
        /* END: Use Case */
1706
1707
        $this->assertEquals('Hello World', $name);
1708
    }
1709
1710
    /**
1711
     * Test for the updateUser() method.
1712
     *
1713
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1714
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException
1715
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1716
     */
1717 View Code Duplication
    public function testUpdateUserWhenMissingField()
1718
    {
1719
        $repository = $this->getRepository();
1720
1721
        $userService = $repository->getUserService();
1722
1723
        /* BEGIN: Use Case */
1724
        $user = $this->createUserVersion1();
1725
1726
        // Get the ContentService implementation
1727
        $contentService = $repository->getContentService();
1728
1729
        // Create a content update struct and change the remote id.
1730
        $contentUpdate = $contentService->newContentUpdateStruct();
1731
        $contentUpdate->setField('first_name', null, 'eng-US');
1732
1733
        // Create a new update struct instance
1734
        $userUpdate = $userService->newUserUpdateStruct();
1735
1736
        // Set the content update struct.
1737
        $userUpdate->contentUpdateStruct = $contentUpdate;
1738
1739
        // This call will fail with a "ContentFieldValidationException" because the
1740
        // mandatory field "first_name" is set to an empty value.
1741
        $userService->updateUser($user, $userUpdate);
1742
1743
        /* END: Use Case */
1744
    }
1745
1746
    /**
1747
     * Test for the updateUser() method.
1748
     *
1749
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1750
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1751
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1752
     */
1753 View Code Duplication
    public function testUpdateUserThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
1754
    {
1755
        $repository = $this->getRepository();
1756
1757
        $userService = $repository->getUserService();
1758
1759
        /* BEGIN: Use Case */
1760
        $user = $this->createUserVersion1();
1761
1762
        // Get the ContentService implementation
1763
        $contentService = $repository->getContentService();
1764
1765
        $contentUpdate = $contentService->newContentUpdateStruct();
1766
        // An object of stdClass is not valid for the field first_name
1767
        $contentUpdate->setField('first_name', new \stdClass(), 'eng-US');
1768
1769
        // Create a new update struct instance
1770
        $userUpdate = $userService->newUserUpdateStruct();
1771
1772
        // Set the content update struct.
1773
        $userUpdate->contentUpdateStruct = $contentUpdate;
1774
1775
        // This call will fail with a "InvalidArgumentException" because the
1776
        // the field "first_name" does not accept the given value.
1777
        $userService->updateUser($user, $userUpdate);
1778
1779
        /* END: Use Case */
1780
    }
1781
1782
    /**
1783
     * Test for the loadUserGroupsOfUser() method.
1784
     *
1785
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser
1786
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1787
     */
1788
    public function testLoadUserGroupsOfUser()
1789
    {
1790
        $repository = $this->getRepository();
1791
1792
        $userService = $repository->getUserService();
1793
1794
        /* BEGIN: Use Case */
1795
        $user = $this->createUserVersion1();
1796
1797
        // This array will contain the "Editors" user group name
1798
        $userGroupNames = [];
1799
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
1800
            $this->assertInstanceOf(UserGroup::class, $userGroup);
1801
            $userGroupNames[] = $userGroup->getFieldValue('name');
1802
        }
1803
        /* END: Use Case */
1804
1805
        $this->assertEquals(['Editors'], $userGroupNames);
1806
    }
1807
1808
    /**
1809
     * Test for the loadUsersOfUserGroup() method.
1810
     *
1811
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup
1812
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1813
     */
1814
    public function testLoadUsersOfUserGroup()
1815
    {
1816
        $repository = $this->getRepository();
1817
        $userService = $repository->getUserService();
1818
1819
        $group = $userService->loadUserGroup($this->generateId('group', 13));
1820
1821
        /* BEGIN: Use Case */
1822
        $this->createUserVersion1();
1823
1824
        $this->refreshSearch($repository);
1825
1826
        // This array will contain the email of the newly created "Editor" user
1827
        $email = array();
1828
        foreach ($userService->loadUsersOfUserGroup($group) as $user) {
1829
            $this->assertInstanceOf(User::class, $user);
1830
            $email[] = $user->email;
1831
        }
1832
        /* END: Use Case */
1833
        $this->assertEquals(array('[email protected]'), $email);
1834
    }
1835
1836
    /**
1837
     * Test for the assignUserToUserGroup() method.
1838
     *
1839
     * @see \eZ\Publish\API\Repository\UserService::assignUserToUserGroup()
1840
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser
1841
     */
1842
    public function testAssignUserToUserGroup()
1843
    {
1844
        $repository = $this->getRepository();
1845
        $userService = $repository->getUserService();
1846
1847
        $administratorGroupId = $this->generateId('group', 12);
1848
        /* BEGIN: Use Case */
1849
        // $administratorGroupId is the ID of the "Administrator" group in an
1850
        // eZ Publish demo installation
1851
1852
        $user = $this->createUserVersion1();
1853
1854
        // Assign group to newly created user
1855
        $userService->assignUserToUserGroup(
1856
            $user,
1857
            $userService->loadUserGroup($administratorGroupId)
1858
        );
1859
1860
        // This array will contain "Editors" and "Administrator users"
1861
        $userGroupNames = array();
1862
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
1863
            $userGroupNames[] = $userGroup->getFieldValue('name');
1864
        }
1865
        /* END: Use Case */
1866
1867
        sort($userGroupNames, SORT_STRING);
1868
1869
        $this->assertEquals(
1870
            array(
1871
                'Administrator users',
1872
                'Editors',
1873
            ),
1874
            $userGroupNames
1875
        );
1876
    }
1877
1878
    /**
1879
     * Test for the assignUserToUserGroup() method.
1880
     *
1881
     * @covers \eZ\Publish\API\Repository\UserService::assignUserToUserGroup
1882
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1883
     * @expectedExceptionMessage Argument 'user' is invalid: user is already in the given user group
1884
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testAssignUserToUserGroup
1885
     */
1886 View Code Duplication
    public function testAssignUserToUserGroupThrowsInvalidArgumentException()
1887
    {
1888
        $repository = $this->getRepository();
1889
        $userService = $repository->getUserService();
1890
1891
        $editorsGroupId = $this->generateId('group', 13);
1892
        /* BEGIN: Use Case */
1893
        $user = $this->createUserVersion1();
1894
        // $editorsGroupId is the ID of the "Editors" group in an
1895
        // eZ Publish demo installation
1896
1897
        // This call will fail with an "InvalidArgumentException", because the
1898
        // user is already assigned to the "Editors" group
1899
        $userService->assignUserToUserGroup(
1900
            $user,
1901
            $userService->loadUserGroup($editorsGroupId)
1902
        );
1903
        /* END: Use Case */
1904
    }
1905
1906
    /**
1907
     * Test for the unAssignUssrFromUserGroup() method.
1908
     *
1909
     * @see \eZ\Publish\API\Repository\UserService::unAssignUssrFromUserGroup()
1910
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser
1911
     */
1912
    public function testUnAssignUserFromUserGroup()
1913
    {
1914
        $repository = $this->getRepository();
1915
        $userService = $repository->getUserService();
1916
1917
        $editorsGroupId = $this->generateId('group', 13);
1918
        $anonymousGroupId = $this->generateId('group', 42);
1919
1920
        /* BEGIN: Use Case */
1921
        // $anonymousGroupId is the ID of the "Anonymous Users" group in an eZ
1922
        // Publish demo installation
1923
1924
        $user = $this->createUserVersion1();
1925
1926
        // Assign group to newly created user
1927
        $userService->assignUserToUserGroup(
1928
            $user,
1929
            $userService->loadUserGroup($anonymousGroupId)
1930
        );
1931
1932
        // Unassign user from "Editors" group
1933
        $userService->unAssignUserFromUserGroup(
1934
            $user,
1935
            $userService->loadUserGroup($editorsGroupId)
1936
        );
1937
1938
        // This array will contain "Anonymous Users"
1939
        $userGroupNames = array();
1940
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
1941
            $userGroupNames[] = $userGroup->getFieldValue('name');
1942
        }
1943
        /* END: Use Case */
1944
1945
        $this->assertEquals(array('Anonymous Users'), $userGroupNames);
1946
    }
1947
1948
    /**
1949
     * Test for the unAssignUserFromUserGroup() method.
1950
     *
1951
     * @see \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup()
1952
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1953
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup
1954
     */
1955
    public function testUnAssignUserFromUserGroupThrowsInvalidArgumentException()
1956
    {
1957
        $repository = $this->getRepository();
1958
        $userService = $repository->getUserService();
1959
1960
        $administratorGroupId = $this->generateId('group', 12);
1961
        /* BEGIN: Use Case */
1962
        $user = $this->createUserVersion1();
1963
        // $administratorGroupId is the ID of the "Administrator" group in an
1964
        // eZ Publish demo installation
1965
1966
        // This call will fail with an "InvalidArgumentException", because the
1967
        // user is not assigned to the "Administrator" group
1968
        $userService->unAssignUserFromUserGroup(
1969
            $user,
1970
            $userService->loadUserGroup($administratorGroupId)
1971
        );
1972
        /* END: Use Case */
1973
    }
1974
1975
    /**
1976
     * Test for the unAssignUserFromUserGroup() method removing user from the last group.
1977
     *
1978
     * @covers \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup
1979
     * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException
1980
     * @expectedExceptionMessage Argument 'user' has a bad state: user only has one user group, cannot unassign from last group
1981
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup
1982
     */
1983
    public function testUnAssignUserFromUserGroupThrowsBadStateArgumentException()
1984
    {
1985
        $repository = $this->getRepository();
1986
        $userService = $repository->getUserService();
1987
1988
        $editorsGroupId = $this->generateId('group', 13);
1989
        /* BEGIN: Use Case */
1990
        $user = $this->createUserVersion1();
1991
1992
        // This call will fail with an "BadStateException", because the
1993
        // user has to be assigned to at least one group
1994
        $userService->unAssignUserFromUserGroup(
1995
            $user,
1996
            $userService->loadUserGroup($editorsGroupId)
1997
        );
1998
        /* END: Use Case */
1999
    }
2000
2001
    /**
2002
     * Test that multi-language logic for the loadUserGroup method respects prioritized language list.
2003
     *
2004
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2005
     * @dataProvider getPrioritizedLanguageList
2006
     * @param string[] $prioritizedLanguages
2007
     * @param string|null $expectedLanguageCode language code of expected translation
2008
     */
2009
    public function testLoadUserGroupWithPrioritizedLanguagesList(
2010
        array $prioritizedLanguages,
2011
        $expectedLanguageCode
2012
    ) {
2013
        $repository = $this->getRepository();
2014
        $userService = $repository->getUserService();
2015
2016
        $userGroup = $this->createMultiLanguageUserGroup();
2017
        if ($expectedLanguageCode === null) {
2018
            $expectedLanguageCode = $userGroup->contentInfo->mainLanguageCode;
2019
        }
2020
2021
        $loadedUserGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2022
2023
        self::assertEquals(
2024
            $loadedUserGroup->getName($expectedLanguageCode),
2025
            $loadedUserGroup->getName()
2026
        );
2027
        self::assertEquals(
2028
            $loadedUserGroup->getFieldValue('description', $expectedLanguageCode),
2029
            $loadedUserGroup->getFieldValue('description')
2030
        );
2031
    }
2032
2033
    /**
2034
     * Test that multi-language logic works correctly after updating user group main language.
2035
     *
2036
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2037
     * @dataProvider getPrioritizedLanguageList
2038
     * @param string[] $prioritizedLanguages
2039
     * @param string|null $expectedLanguageCode language code of expected translation
2040
     */
2041
    public function testLoadUserGroupWithPrioritizedLanguagesListAfterMainLanguageUpdate(
2042
        array $prioritizedLanguages,
2043
        $expectedLanguageCode
2044
    ) {
2045
        $repository = $this->getRepository();
2046
        $userService = $repository->getUserService();
2047
        $contentService = $repository->getContentService();
2048
2049
        $userGroup = $this->createMultiLanguageUserGroup();
2050
2051
        $userGroupUpdateStruct = $userService->newUserGroupUpdateStruct();
2052
        $userGroupUpdateStruct->contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct();
2053
        $userGroupUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode = 'eng-GB';
2054
        $userService->updateUserGroup($userGroup, $userGroupUpdateStruct);
2055
2056
        if ($expectedLanguageCode === null) {
2057
            $expectedLanguageCode = 'eng-GB';
2058
        }
2059
2060
        $loadedUserGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2061
2062
        self::assertEquals(
2063
            $loadedUserGroup->getName($expectedLanguageCode),
2064
            $loadedUserGroup->getName()
2065
        );
2066
        self::assertEquals(
2067
            $loadedUserGroup->getFieldValue('description', $expectedLanguageCode),
2068
            $loadedUserGroup->getFieldValue('description')
2069
        );
2070
    }
2071
2072
    /**
2073
     * Test that multi-language logic for the loadSubUserGroups method respects prioritized language list.
2074
     *
2075
     * @covers \eZ\Publish\API\Repository\UserService::loadSubUserGroups
2076
     * @dataProvider getPrioritizedLanguageList
2077
     * @param string[] $prioritizedLanguages
2078
     * @param string|null $expectedLanguageCode language code of expected translation
2079
     */
2080
    public function testLoadSubUserGroupsWithPrioritizedLanguagesList(
2081
        array $prioritizedLanguages,
2082
        $expectedLanguageCode
2083
    ) {
2084
        $repository = $this->getRepository();
2085
        $userService = $repository->getUserService();
2086
2087
        // create main group for subgroups
2088
        $userGroup = $this->createMultiLanguageUserGroup(4);
2089
        if ($expectedLanguageCode === null) {
2090
            $expectedLanguageCode = $userGroup->contentInfo->mainLanguageCode;
2091
        }
2092
2093
        // create subgroups
2094
        $this->createMultiLanguageUserGroup($userGroup->id);
2095
        $this->createMultiLanguageUserGroup($userGroup->id);
2096
2097
        $userGroup = $userService->loadUserGroup($userGroup->id, $prioritizedLanguages);
2098
2099
        $subUserGroups = $userService->loadSubUserGroups($userGroup, 0, 2, $prioritizedLanguages);
2100
        foreach ($subUserGroups as $subUserGroup) {
2101
            self::assertEquals(
2102
                $subUserGroup->getName($expectedLanguageCode),
2103
                $subUserGroup->getName()
2104
            );
2105
            self::assertEquals(
2106
                $subUserGroup->getFieldValue('description', $expectedLanguageCode),
2107
                $subUserGroup->getFieldValue('description')
2108
            );
2109
        }
2110
    }
2111
2112
    /**
2113
     * Test that multi-language logic for the loadUser method respects prioritized language list.
2114
     *
2115
     * @covers \eZ\Publish\API\Repository\UserService::loadUser
2116
     * @dataProvider getPrioritizedLanguageList
2117
     * @param string[] $prioritizedLanguages
2118
     * @param string|null $expectedLanguageCode language code of expected translation
2119
     */
2120 View Code Duplication
    public function testLoadUserWithPrioritizedLanguagesList(
2121
        array $prioritizedLanguages,
2122
        $expectedLanguageCode
2123
    ) {
2124
        $repository = $this->getRepository();
2125
        $userService = $repository->getUserService();
2126
2127
        $user = $this->createMultiLanguageUser();
2128
        if ($expectedLanguageCode === null) {
2129
            $expectedLanguageCode = $user->contentInfo->mainLanguageCode;
2130
        }
2131
2132
        $loadedUser = $userService->loadUser($user->id, $prioritizedLanguages);
2133
2134
        self::assertEquals(
2135
            $loadedUser->getName($expectedLanguageCode),
2136
            $loadedUser->getName()
2137
        );
2138
2139
        foreach (['fist_name', 'last_name', 'signature'] as $fieldIdentifier) {
2140
            self::assertEquals(
2141
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2142
                $loadedUser->getFieldValue($fieldIdentifier)
2143
            );
2144
        }
2145
    }
2146
2147
    /**
2148
     * Test that multi-language logic for the loadUser method works correctly after updating
2149
     * user content main language.
2150
     *
2151
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup
2152
     * @dataProvider getPrioritizedLanguageList
2153
     * @param string[] $prioritizedLanguages
2154
     * @param string|null $expectedLanguageCode language code of expected translation
2155
     */
2156
    public function testLoadUserWithPrioritizedLanguagesListAfterMainLanguageUpdate(
2157
        array $prioritizedLanguages,
2158
        $expectedLanguageCode
2159
    ) {
2160
        $repository = $this->getRepository();
2161
        $userService = $repository->getUserService();
2162
        $contentService = $repository->getContentService();
2163
2164
        $user = $this->createMultiLanguageUser();
2165
        // sanity check
2166
        self::assertEquals($user->contentInfo->mainLanguageCode, 'eng-US');
2167
2168
        $userUpdateStruct = $userService->newUserUpdateStruct();
2169
        $userUpdateStruct->contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct();
2170
        $userUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode = 'eng-GB';
2171
        $userService->updateUser($user, $userUpdateStruct);
2172
        if ($expectedLanguageCode === null) {
2173
            $expectedLanguageCode = 'eng-GB';
2174
        }
2175
2176
        $loadedUser = $userService->loadUser($user->id, $prioritizedLanguages);
2177
2178
        self::assertEquals(
2179
            $loadedUser->getName($expectedLanguageCode),
2180
            $loadedUser->getName()
2181
        );
2182
2183
        foreach (['fist_name', 'last_name', 'signature'] as $fieldIdentifier) {
2184
            self::assertEquals(
2185
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2186
                $loadedUser->getFieldValue($fieldIdentifier)
2187
            );
2188
        }
2189
    }
2190
2191
    /**
2192
     * Test that multi-language logic for the loadUserByLogin method respects prioritized language list.
2193
     *
2194
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByLogin
2195
     * @dataProvider getPrioritizedLanguageList
2196
     * @param string[] $prioritizedLanguages
2197
     * @param string|null $expectedLanguageCode language code of expected translation
2198
     */
2199 View Code Duplication
    public function testLoadUserByLoginWithPrioritizedLanguagesList(
2200
        array $prioritizedLanguages,
2201
        $expectedLanguageCode
2202
    ) {
2203
        $repository = $this->getRepository();
2204
        $userService = $repository->getUserService();
2205
        $user = $this->createMultiLanguageUser();
2206
2207
        // load, with prioritized languages, the newly created user
2208
        $loadedUser = $userService->loadUserByLogin($user->login, $prioritizedLanguages);
2209
        if ($expectedLanguageCode === null) {
2210
            $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2211
        }
2212
2213
        self::assertEquals(
2214
            $loadedUser->getName($expectedLanguageCode),
2215
            $loadedUser->getName()
2216
        );
2217
2218
        foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2219
            self::assertEquals(
2220
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2221
                $loadedUser->getFieldValue($fieldIdentifier)
2222
            );
2223
        }
2224
    }
2225
2226
    /**
2227
     * Test that multi-language logic for the loadUserByCredentials method respects
2228
     * prioritized language list.
2229
     *
2230
     * @covers \eZ\Publish\API\Repository\UserService::loadUserByCredentials
2231
     * @dataProvider getPrioritizedLanguageList
2232
     * @param string[] $prioritizedLanguages
2233
     * @param string|null $expectedLanguageCode language code of expected translation
2234
     */
2235 View Code Duplication
    public function testLoadUserByCredentialsWithPrioritizedLanguagesList(
2236
        array $prioritizedLanguages,
2237
        $expectedLanguageCode
2238
    ) {
2239
        $repository = $this->getRepository();
2240
        $userService = $repository->getUserService();
2241
        $user = $this->createMultiLanguageUser();
2242
2243
        // load, with prioritized languages, the newly created user
2244
        $loadedUser = $userService->loadUserByCredentials(
2245
            $user->login,
2246
            'secret',
2247
            $prioritizedLanguages
2248
        );
2249
        if ($expectedLanguageCode === null) {
2250
            $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2251
        }
2252
2253
        self::assertEquals(
2254
            $loadedUser->getName($expectedLanguageCode),
2255
            $loadedUser->getName()
2256
        );
2257
2258
        foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2259
            self::assertEquals(
2260
                $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2261
                $loadedUser->getFieldValue($fieldIdentifier)
2262
            );
2263
        }
2264
    }
2265
2266
    /**
2267
     * Test that multi-language logic for the loadUsersByEmail method respects
2268
     * prioritized language list.
2269
     *
2270
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersByEmail
2271
     * @dataProvider getPrioritizedLanguageList
2272
     * @param string[] $prioritizedLanguages
2273
     * @param string|null $expectedLanguageCode language code of expected translation
2274
     */
2275 View Code Duplication
    public function testLoadUsersByEmailWithPrioritizedLanguagesList(
2276
        array $prioritizedLanguages,
2277
        $expectedLanguageCode
2278
    ) {
2279
        $repository = $this->getRepository();
2280
        $userService = $repository->getUserService();
2281
        $user = $this->createMultiLanguageUser();
2282
2283
        // load, with prioritized languages, users by email
2284
        $loadedUsers = $userService->loadUsersByEmail($user->email, $prioritizedLanguages);
2285
2286
        foreach ($loadedUsers as $loadedUser) {
2287
            if ($expectedLanguageCode === null) {
2288
                $expectedLanguageCode = $loadedUser->contentInfo->mainLanguageCode;
2289
            }
2290
            self::assertEquals(
2291
                $loadedUser->getName($expectedLanguageCode),
2292
                $loadedUser->getName()
2293
            );
2294
2295
            foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2296
                self::assertEquals(
2297
                    $loadedUser->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2298
                    $loadedUser->getFieldValue($fieldIdentifier)
2299
                );
2300
            }
2301
        }
2302
    }
2303
2304
    /**
2305
     * Test that multi-language logic for the loadUserGroupsOfUser method respects
2306
     * prioritized language list.
2307
     *
2308
     * @covers \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser
2309
     * @dataProvider getPrioritizedLanguageList
2310
     * @param string[] $prioritizedLanguages
2311
     * @param string|null $expectedLanguageCode language code of expected translation
2312
     */
2313
    public function testLoadUserGroupsOfUserWithPrioritizedLanguagesList(
2314
        array $prioritizedLanguages,
2315
        $expectedLanguageCode
2316
    ) {
2317
        $repository = $this->getRepository();
2318
        $userService = $repository->getUserService();
2319
        $userGroup = $this->createMultiLanguageUserGroup();
2320
        $user = $this->createMultiLanguageUser($userGroup->id);
2321
2322
        $userGroups = $userService->loadUserGroupsOfUser($user, 0, 25, $prioritizedLanguages);
2323
        foreach ($userGroups as $userGroup) {
2324
            self::assertEquals(
2325
                $userGroup->getName($expectedLanguageCode),
2326
                $userGroup->getName()
2327
            );
2328
            self::assertEquals(
2329
                $userGroup->getFieldValue('description', $expectedLanguageCode),
2330
                $userGroup->getFieldValue('description')
2331
            );
2332
        }
2333
    }
2334
2335
    /**
2336
     * Test that multi-language logic for the loadUsersOfUserGroup method respects
2337
     * prioritized language list.
2338
     *
2339
     * @covers \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup
2340
     * @dataProvider getPrioritizedLanguageList
2341
     * @param string[] $prioritizedLanguages
2342
     * @param string|null $expectedLanguageCode language code of expected translation
2343
     */
2344
    public function testLoadUsersOfUserGroupWithPrioritizedLanguagesList(
2345
        array $prioritizedLanguages,
2346
        $expectedLanguageCode
2347
    ) {
2348
        $repository = $this->getRepository();
2349
        $userService = $repository->getUserService();
2350
2351
        // create parent user group
2352
        $userGroup = $this->createMultiLanguageUserGroup();
2353
        // add two users to the created parent user group
2354
        $this->createMultiLanguageUser($userGroup->id);
2355
        $this->createMultiLanguageUser($userGroup->id);
2356
2357
        // test loading of users via user group with prioritized languages list
2358
        $users = $userService->loadUsersOfUserGroup($userGroup, 0, 25, $prioritizedLanguages);
2359
        foreach ($users as $user) {
2360
            if ($expectedLanguageCode === null) {
2361
                $expectedLanguageCode = $user->contentInfo->mainLanguageCode;
2362
            }
2363
            self::assertEquals(
2364
                $user->getName($expectedLanguageCode),
2365
                $user->getName()
2366
            );
2367
2368
            foreach (['first_name', 'last_name', 'signature'] as $fieldIdentifier) {
2369
                self::assertEquals(
2370
                    $user->getFieldValue($fieldIdentifier, $expectedLanguageCode),
2371
                    $user->getFieldValue($fieldIdentifier)
2372
                );
2373
            }
2374
        }
2375
    }
2376
2377
    /**
2378
     * Get prioritized languages list data.
2379
     *
2380
     * Test cases using this data provider should expect the following arguments:
2381
     * <code>
2382
     *   array $prioritizedLanguagesList
2383
     *   string $expectedLanguage (if null - use main language)
2384
     * </code>
2385
     *
2386
     * @return array
2387
     */
2388 View Code Duplication
    public function getPrioritizedLanguageList()
2389
    {
2390
        return [
2391
            [[], null],
2392
            [['eng-US'], 'eng-US'],
2393
            [['eng-GB'], 'eng-GB'],
2394
            [['eng-US', 'eng-GB'], 'eng-US'],
2395
            [['eng-GB', 'eng-US'], 'eng-GB'],
2396
            // use non-existent group as the first one
2397
            [['ger-DE'], null],
2398
            [['ger-DE', 'eng-GB'], 'eng-GB'],
2399
        ];
2400
    }
2401
2402
    /**
2403
     * @param int $parentGroupId
2404
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
2405
     */
2406
    private function createMultiLanguageUserGroup($parentGroupId = 4)
2407
    {
2408
        $repository = $this->getRepository();
2409
        $userService = $repository->getUserService();
2410
2411
        // create user group with multiple translations
2412
        $parentGroupId = $this->generateId('group', $parentGroupId);
2413
        $parentGroup = $userService->loadUserGroup($parentGroupId);
2414
2415
        $userGroupCreateStruct = $userService->newUserGroupCreateStruct('eng-US');
2416
        $userGroupCreateStruct->setField('name', 'US user group', 'eng-US');
2417
        $userGroupCreateStruct->setField('name', 'GB user group', 'eng-GB');
2418
        $userGroupCreateStruct->setField('description', 'US user group description', 'eng-US');
2419
        $userGroupCreateStruct->setField('description', 'GB user group description', 'eng-GB');
2420
        $userGroupCreateStruct->alwaysAvailable = true;
2421
2422
        return $userService->createUserGroup($userGroupCreateStruct, $parentGroup);
2423
    }
2424
2425
    /**
2426
     * Create a user group fixture in a variable named <b>$userGroup</b>,.
2427
     *
2428
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
2429
     */
2430
    private function createUserGroupVersion1()
2431
    {
2432
        $repository = $this->getRepository();
2433
2434
        $mainGroupId = $this->generateId('group', 4);
2435
        /* BEGIN: Inline */
2436
        // $mainGroupId is the ID of the main "Users" group
2437
2438
        $userService = $repository->getUserService();
2439
2440
        // Load main group
2441
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
2442
2443
        // Instantiate a new create struct
2444
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
2445
        $userGroupCreate->setField('name', 'Example Group');
2446
2447
        // Create the new user group
2448
        $userGroup = $userService->createUserGroup(
2449
            $userGroupCreate,
2450
            $parentUserGroup
2451
        );
2452
        /* END: Inline */
2453
2454
        return $userGroup;
2455
    }
2456
2457
    /**
2458
     * Create user with multiple translations of User Content fields.
2459
     *
2460
     * @param int $userGroupId User group ID (default 13 - Editors)
2461
     *
2462
     * @return \eZ\Publish\API\Repository\Values\User\User
2463
     */
2464
    private function createMultiLanguageUser($userGroupId = 13)
2465
    {
2466
        $repository = $this->getRepository();
2467
        $userService = $repository->getUserService();
2468
2469
        // Instantiate a create struct with mandatory properties
2470
        $randomLogin = md5(rand() . time());
2471
        $userCreateStruct = $userService->newUserCreateStruct(
2472
            $randomLogin,
2473
            "{$randomLogin}@example.com",
2474
            'secret',
2475
            'eng-US'
2476
        );
2477
        $userCreateStruct->enabled = true;
2478
        $userCreateStruct->alwaysAvailable = true;
2479
2480
        // set field for each language
2481
        foreach (['eng-US', 'eng-GB'] as $languageCode) {
2482
            $userCreateStruct->setField('first_name', "{$languageCode} Example", $languageCode);
2483
            $userCreateStruct->setField('last_name', "{$languageCode} User", $languageCode);
2484
            $userCreateStruct->setField('signature', "{$languageCode} signature", $languageCode);
2485
        }
2486
2487
        // Load parent group for the user
2488
        $group = $userService->loadUserGroup($userGroupId);
2489
2490
        // Create a new user
2491
        return $userService->createUser($userCreateStruct, [$group]);
2492
    }
2493
2494 View Code Duplication
    private function createHash($login, $password, $type)
2495
    {
2496
        switch ($type) {
2497
            case 2:
2498
                /* PASSWORD_HASH_MD5_USER */
2499
                return md5("{$login}\n{$password}");
2500
2501
            case 3:
2502
                /* PASSWORD_HASH_MD5_SITE */
2503
                $site = null;
2504
2505
                return md5("{$login}\n{$password}\n{$site}");
2506
2507
            case 5:
2508
                /* PASSWORD_HASH_PLAINTEXT */
2509
                return $password;
2510
        }
2511
        /* PASSWORD_HASH_MD5_PASSWORD (1) */
2512
        return md5($password);
2513
    }
2514
}
2515