Completed
Push — master ( a62e5f...635b00 )
by André
25:21 queued 11:58
created

UserServiceTest::testUpdateUserNoPassword()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 62
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 37
nc 1
nop 0
dl 0
loc 62
rs 9.4743
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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