Completed
Push — master ( 3a9edb...9a7c98 )
by André
13:29
created

UserServiceTest::createHash()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 20
Code Lines 10

Duplication

Lines 20
Ratio 100 %

Importance

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