Completed
Push — test-EZP-26707-issearchable-fu... ( 965a07...6812c2 )
by
unknown
33:45 queued 07:39
created

testCreateUserThrowsContentValidationExceptionForMissingField()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 31
Code Lines 11

Duplication

Lines 31
Ratio 100 %

Importance

Changes 0
Metric Value
cc 1
eloc 11
nc 1
nop 0
dl 31
loc 31
rs 8.8571
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * File containing the UserServiceTest class.
5
 *
6
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
7
 * @license For full copyright and license information view LICENSE file distributed with this source code.
8
 *
9
 * @version //autogentag//
10
 */
11
namespace eZ\Publish\API\Repository\Tests;
12
13
use eZ\Publish\API\Repository\Values\Content\VersionInfo;
14
use eZ\Publish\API\Repository\Values\User\User;
15
use eZ\Publish\API\Repository\Exceptions\NotFoundException;
16
use Exception;
17
18
/**
19
 * Test case for operations in the UserService using in memory storage.
20
 *
21
 * @see eZ\Publish\API\Repository\UserService
22
 * @group integration
23
 * @group user
24
 */
25
class UserServiceTest extends BaseTest
26
{
27
    /**
28
     * Test for the loadUserGroup() method.
29
     *
30
     * @see \eZ\Publish\API\Repository\UserService::loadUserGroup()
31
     */
32
    public function testLoadUserGroup()
33
    {
34
        $repository = $this->getRepository();
35
36
        $mainGroupId = $this->generateId('group', 4);
37
        /* BEGIN: Use Case */
38
        // $mainGroupId is the ID of the main "Users" group
39
40
        $userService = $repository->getUserService();
41
42
        $userGroup = $userService->loadUserGroup($mainGroupId);
43
        /* END: Use Case */
44
45
        $this->assertInstanceOf('\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup', $userGroup);
46
    }
47
48
    /**
49
     * Test for the loadUserGroup() method.
50
     *
51
     * @see \eZ\Publish\API\Repository\UserService::loadUserGroup()
52
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
53
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
54
     */
55
    public function testLoadUserGroupThrowsNotFoundException()
56
    {
57
        $repository = $this->getRepository();
58
59
        $nonExistingGroupId = $this->generateId('group', self::DB_INT_MAX);
60
        /* BEGIN: Use Case */
61
        $userService = $repository->getUserService();
62
63
        // This call will fail with a NotFoundException
64
        $userService->loadUserGroup($nonExistingGroupId);
65
        /* END: Use Case */
66
    }
67
68
    /**
69
     * Test for the loadSubUserGroups() method.
70
     *
71
     * @see \eZ\Publish\API\Repository\UserService::loadSubUserGroups()
72
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
73
     */
74
    public function testLoadSubUserGroups()
75
    {
76
        $repository = $this->getRepository();
77
78
        $mainGroupId = $this->generateId('group', 4);
79
        /* BEGIN: Use Case */
80
        // $mainGroupId is the ID of the main "Users" group
81
82
        $userService = $repository->getUserService();
83
84
        $userGroup = $userService->loadUserGroup($mainGroupId);
85
86
        $subUserGroups = $userService->loadSubUserGroups($userGroup);
87
        foreach ($subUserGroups as $subUserGroup) {
88
            // Do something with the $subUserGroup
89
            $this->assertInstanceOf('\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup', $subUserGroup);
90
        }
91
        /* END: Use Case */
92
    }
93
94
    /**
95
     * Test for the newUserGroupCreateStruct() method.
96
     *
97
     * @return \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct
98
     *
99
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
100
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
101
     */
102
    public function testNewUserGroupCreateStruct()
103
    {
104
        $repository = $this->getRepository();
105
106
        /* BEGIN: Use Case */
107
        $userService = $repository->getUserService();
108
109
        $groupCreate = $userService->newUserGroupCreateStruct('eng-US');
110
        /* END: Use Case */
111
112
        $this->assertInstanceOf(
113
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroupCreateStruct',
114
            $groupCreate
115
        );
116
117
        return $groupCreate;
118
    }
119
120
    /**
121
     * Test for the newUserGroupCreateStruct() method.
122
     *
123
     * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $groupCreate
124
     *
125
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
126
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
127
     */
128
    public function testNewUserGroupCreateStructSetsMainLanguageCode($groupCreate)
129
    {
130
        $this->assertEquals('eng-US', $groupCreate->mainLanguageCode);
131
    }
132
133
    /**
134
     * Test for the newUserGroupCreateStruct() method.
135
     *
136
     * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $groupCreate
137
     *
138
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct()
139
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
140
     */
141
    public function testNewUserGroupCreateStructSetsContentType($groupCreate)
142
    {
143
        $this->assertInstanceOf(
144
            '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType',
145
            $groupCreate->contentType
146
        );
147
    }
148
149
    /**
150
     * Test for the newUserGroupCreateStruct() method.
151
     *
152
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct($mainLanguageCode, $contentType)
153
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
154
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
155
     */
156 View Code Duplication
    public function testNewUserGroupCreateStructWithSecondParameter()
157
    {
158
        if ($this->isVersion4()) {
159
            $this->markTestSkipped('This test is only relevant for eZ Publish versions > 4');
160
        }
161
162
        $repository = $this->getRepository();
163
164
        /* BEGIN: Use Case */
165
        $contentTypeService = $repository->getContentTypeService();
166
        $userService = $repository->getUserService();
167
168
        // Load the default ContentType for user groups
169
        $groupType = $contentTypeService->loadContentTypeByIdentifier('user_group');
170
171
        // Instantiate a new group create struct
172
        $groupCreate = $userService->newUserGroupCreateStruct(
173
            'eng-US',
174
            $groupType
175
        );
176
        /* END: Use Case */
177
178
        $this->assertSame($groupType, $groupCreate->contentType);
179
    }
180
181
    /**
182
     * Test for the createUserGroup() method.
183
     *
184
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
185
     *
186
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
187
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
188
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
189
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
190
     */
191
    public function testCreateUserGroup()
192
    {
193
        /* BEGIN: Use Case */
194
        $userGroup = $this->createUserGroupVersion1();
195
        /* END: Use Case */
196
197
        $this->assertInstanceOf(
198
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup',
199
            $userGroup
200
        );
201
202
        $versionInfo = $userGroup->getVersionInfo();
203
204
        $this->assertEquals(VersionInfo::STATUS_PUBLISHED, $versionInfo->status);
205
        $this->assertEquals(1, $versionInfo->versionNo);
206
207
        return $userGroup;
208
    }
209
210
    /**
211
     * Test for the createUserGroup() method.
212
     *
213
     * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup
214
     *
215
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
216
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
217
     */
218
    public function testCreateUserGroupSetsExpectedProperties($userGroup)
219
    {
220
        $this->assertEquals(
221
            array(
222
                'parentId' => $this->generateId('group', 4),
223
                'subGroupCount' => 0,
224
            ),
225
            array(
226
                'parentId' => $userGroup->parentId,
227
                '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...
228
            )
229
        );
230
    }
231
232
    /**
233
     * Test for the createUserGroup() method.
234
     *
235
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
236
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
237
     */
238 View Code Duplication
    public function testCreateUserGroupIncrementsParentSubGroupCount()
239
    {
240
        $repository = $this->getRepository();
241
        $userService = $repository->getUserService();
242
        $mainGroupId = $this->generateId('group', 4);
243
244
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
245
        $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...
246
247
        /* BEGIN: Use Case */
248
        $this->createUserGroupVersion1();
249
250
        $this->refreshSearch($repository);
251
252
        // This should be one greater than before
253
        $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...
254
        /* END: Use Case */
255
256
        $this->assertEquals($parentGroupCount + 1, $subGroupCount);
257
    }
258
259
    /**
260
     * Test for the createUserGroup() method.
261
     *
262
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
263
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
264
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
265
     */
266 View Code Duplication
    public function testCreateUserGroupThrowsInvalidArgumentException()
267
    {
268
        $repository = $this->getRepository();
269
270
        $mainGroupId = $this->generateId('group', 4);
271
        /* BEGIN: Use Case */
272
        // $mainGroupId is the ID of the main "Users" group
273
274
        $userService = $repository->getUserService();
275
276
        // Load main group
277
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
278
279
        // Instantiate a new create struct
280
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
281
        $userGroupCreate->setField('name', 'Example Group');
282
        $userGroupCreate->remoteId = '5f7f0bdb3381d6a461d8c29ff53d908f';
283
284
        // This call will fail with an "InvalidArgumentException", because the
285
        // specified remoteId is already used for the "Members" user group.
286
        $userService->createUserGroup(
287
            $userGroupCreate,
288
            $parentUserGroup
289
        );
290
        /* END: Use Case */
291
    }
292
293
    /**
294
     * Test for the createUserGroup() method.
295
     *
296
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
297
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
298
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
299
     */
300
    public function testCreateUserGroupThrowsInvalidArgumentExceptionFieldTypeNotAccept()
301
    {
302
        $repository = $this->getRepository();
303
304
        $mainGroupId = $this->generateId('group', 4);
305
        /* BEGIN: Use Case */
306
        // $mainGroupId is the ID of the main "Users" group
307
308
        $userService = $repository->getUserService();
309
310
        // Load main group
311
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
312
313
        // Instantiate a new create struct
314
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
315
        $userGroupCreate->setField('name', new \stdClass());
316
317
        // This call will fail with an "InvalidArgumentException", because the
318
        // specified remoteId is already used for the "Members" user group.
319
        $userService->createUserGroup(
320
            $userGroupCreate,
321
            $parentUserGroup
322
        );
323
        /* END: Use Case */
324
    }
325
326
    /**
327
     * Test for the createUserGroup() method.
328
     *
329
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
330
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException
331
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
332
     */
333
    public function testCreateUserGroupThrowsContentValidationException()
334
    {
335
        $repository = $this->getRepository();
336
337
        $mainGroupId = $this->generateId('group', 4);
338
        /* BEGIN: Use Case */
339
        // $mainGroupId is the ID of the main "Users" group
340
341
        $userService = $repository->getUserService();
342
343
        // Load main group
344
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
345
346
        // Instantiate a new create struct
347
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
348
349
        // This call will fail with a "ContentValidationException", because the
350
        // only mandatory field "name" is not set.
351
        $userService->createUserGroup($userGroupCreate, $parentUserGroup);
352
        /* END: Use Case */
353
    }
354
355
    /**
356
     * Test for the createUserGroup() method.
357
     *
358
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
359
     *
360
     * @see \eZ\Publish\API\Repository\UserService::createUserGroup()
361
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct
362
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
363
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
364
     */
365
    public function testCreateUserGroupInTransactionWithRollback()
366
    {
367
        $repository = $this->getRepository();
368
369
        $mainGroupId = $this->generateId('group', 4);
370
        /* BEGIN: Use Case */
371
        // $mainGroupId is the ID of the main "Users" group
372
373
        $userService = $repository->getUserService();
374
375
        $repository->beginTransaction();
376
377
        try {
378
            // Load main group
379
            $parentUserGroup = $userService->loadUserGroup($mainGroupId);
380
381
            // Instantiate a new create struct
382
            $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
383
            $userGroupCreate->setField('name', 'Example Group');
384
385
            // Create the new user group
386
            $createdUserGroupId = $userService->createUserGroup(
387
                $userGroupCreate,
388
                $parentUserGroup
389
            )->id;
390
        } catch (Exception $e) {
391
            // Cleanup hanging transaction on error
392
            $repository->rollback();
393
            throw $e;
394
        }
395
396
        $repository->rollback();
397
398
        try {
399
            // Throws exception since creation of user group was rolled back
400
            $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...
401
        } catch (NotFoundException $e) {
402
            return;
403
        }
404
        /* END: Use Case */
405
406
        $this->fail('User group object still exists after rollback.');
407
    }
408
409
    /**
410
     * Test for the deleteUserGroup() method.
411
     *
412
     * @see \eZ\Publish\API\Repository\UserService::deleteUserGroup()
413
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
414
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
415
     */
416
    public function testDeleteUserGroup()
417
    {
418
        $repository = $this->getRepository();
419
        $userService = $repository->getUserService();
420
421
        /* BEGIN: Use Case */
422
        $userGroup = $this->createUserGroupVersion1();
423
424
        // Delete the currently created user group again
425
        $userService->deleteUserGroup($userGroup);
426
        /* END: Use Case */
427
428
        // We use the NotFoundException here for verification
429
        $userService->loadUserGroup($userGroup->id);
430
    }
431
432
    /**
433
     * Test for the moveUserGroup() method.
434
     *
435
     * @see \eZ\Publish\API\Repository\UserService::moveUserGroup()
436
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
437
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadSubUserGroups
438
     */
439
    public function testMoveUserGroup()
440
    {
441
        $repository = $this->getRepository();
442
        $userService = $repository->getUserService();
443
444
        $membersGroupId = $this->generateId('group', 13);
445
        /* BEGIN: Use Case */
446
        // $membersGroupId is the ID of the "Members" user group in an eZ
447
        // Publish demo installation
448
449
        $userGroup = $this->createUserGroupVersion1();
450
451
        // Load the new parent group
452
        $membersUserGroup = $userService->loadUserGroup($membersGroupId);
453
454
        // Move user group from "Users" to "Members"
455
        $userService->moveUserGroup($userGroup, $membersUserGroup);
456
457
        // Reload the user group to get an updated $parentId
458
        $userGroup = $userService->loadUserGroup($userGroup->id);
459
460
        $this->refreshSearch($repository);
461
462
        // The returned array will no contain $userGroup
463
        $subUserGroups = $userService->loadSubUserGroups(
464
            $membersUserGroup
465
        );
466
        /* END: Use Case */
467
468
        $subUserGroupIds = array_map(
469
            function ($content) {
470
                return $content->id;
471
            },
472
            $subUserGroups
473
        );
474
475
        $this->assertEquals($membersGroupId, $userGroup->parentId);
476
        $this->assertEquals(array($userGroup->id), $subUserGroupIds);
477
    }
478
479
    /**
480
     * Test for the moveUserGroup() method.
481
     *
482
     * @see \eZ\Publish\API\Repository\UserService::moveUserGroup()
483
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testMoveUserGroup
484
     */
485 View Code Duplication
    public function testMoveUserGroupIncrementsSubGroupCountOnNewParent()
486
    {
487
        $repository = $this->getRepository();
488
        $userService = $repository->getUserService();
489
490
        $membersGroupId = $this->generateId('group', 13);
491
        /* BEGIN: Use Case */
492
        // $membersGroupId is the ID of the "Members" user group in an eZ
493
        // Publish demo installation
494
495
        $userGroup = $this->createUserGroupVersion1();
496
497
        // Load the new parent group
498
        $membersUserGroup = $userService->loadUserGroup($membersGroupId);
499
500
        // Move user group from "Users" to "Members"
501
        $userService->moveUserGroup($userGroup, $membersUserGroup);
502
503
        $this->refreshSearch($repository);
504
505
        // Reload the user group to get an updated $subGroupCount
506
        $membersUserGroupUpdated = $userService->loadUserGroup($membersGroupId);
507
        /* END: Use Case */
508
509
        $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...
510
    }
511
512
    /**
513
     * Test for the moveUserGroup() method.
514
     *
515
     * @see \eZ\Publish\API\Repository\UserService::moveUserGroup()
516
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testMoveUserGroup
517
     */
518 View Code Duplication
    public function testMoveUserGroupDecrementsSubGroupCountOnOldParent()
519
    {
520
        $repository = $this->getRepository();
521
        $userService = $repository->getUserService();
522
523
        $membersGroupId = $this->generateId('group', 13);
524
        /* BEGIN: Use Case */
525
        // $membersGroupId is the ID of the "Members" user group in an eZ
526
        // Publish demo installation
527
528
        $userGroup = $this->createUserGroupVersion1();
529
530
        // Load the new parent group
531
        $membersUserGroup = $userService->loadUserGroup($membersGroupId);
532
533
        // Move user group from "Users" to "Members"
534
        $userService->moveUserGroup($userGroup, $membersUserGroup);
535
        /* END: Use Case */
536
537
        $mainUserGroup = $userService->loadUserGroup($this->generateId('group', 4));
538
539
        $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...
540
    }
541
542
    /**
543
     * Test for the newUserGroupUpdateStruct() method.
544
     *
545
     * @see \eZ\Publish\API\Repository\UserService::newUserGroupUpdateStruct()
546
     */
547
    public function testNewUserGroupUpdateStruct()
548
    {
549
        $repository = $this->getRepository();
550
551
        /* BEGIN: Use Case */
552
        $userService = $repository->getUserService();
553
554
        $groupUpdate = $userService->newUserGroupUpdateStruct();
555
        /* END: Use Case */
556
557
        $this->assertInstanceOf(
558
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroupUpdateStruct',
559
            $groupUpdate
560
        );
561
    }
562
563
    /**
564
     * Test for the updateUserGroup() method.
565
     *
566
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
567
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup
568
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupUpdateStruct
569
     */
570
    public function testUpdateUserGroup()
571
    {
572
        $repository = $this->getRepository();
573
        $userService = $repository->getUserService();
574
575
        /* BEGIN: Use Case */
576
        $userGroup = $this->createUserGroupVersion1();
577
578
        // Create a group update struct and change nothing
579
        $groupUpdate = $userService->newUserGroupUpdateStruct();
580
581
        // This update will do nothing
582
        $userGroup = $userService->updateUserGroup(
583
            $userGroup,
584
            $groupUpdate
585
        );
586
        /* END: Use Case */
587
588
        $this->assertInstanceOf(
589
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup',
590
            $userGroup
591
        );
592
593
        $this->assertEquals(1, $userGroup->getVersionInfo()->versionNo);
594
    }
595
596
    /**
597
     * Test for the updateUserGroup() method.
598
     *
599
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
600
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
601
     */
602 View Code Duplication
    public function testUpdateUserGroupWithSubContentUpdateStruct()
603
    {
604
        $repository = $this->getRepository();
605
        $userService = $repository->getUserService();
606
607
        /* BEGIN: Use Case */
608
        $userGroup = $this->createUserGroupVersion1();
609
610
        // Load the content service
611
        $contentService = $repository->getContentService();
612
613
        // Create a content update struct and update the group name
614
        $contentUpdate = $contentService->newContentUpdateStruct();
615
        $contentUpdate->setField('name', 'Sindelfingen', 'eng-US');
616
617
        // Create a group update struct and set content update struct
618
        $groupUpdate = $userService->newUserGroupUpdateStruct();
619
        $groupUpdate->contentUpdateStruct = $contentUpdate;
620
621
        // This will update the name and the increment the group version number
622
        $userGroup = $userService->updateUserGroup(
623
            $userGroup,
624
            $groupUpdate
625
        );
626
        /* END: Use Case */
627
628
        $this->assertEquals('Sindelfingen', $userGroup->getFieldValue('name', 'eng-US'));
629
630
        $versionInfo = $userGroup->getVersionInfo();
631
632
        $this->assertEquals(VersionInfo::STATUS_PUBLISHED, $versionInfo->status);
633
        $this->assertEquals(2, $versionInfo->versionNo);
634
    }
635
636
    /**
637
     * Test for the updateUserGroup() method.
638
     *
639
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
640
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
641
     */
642
    public function testUpdateUserGroupWithSubContentMetadataUpdateStruct()
643
    {
644
        $repository = $this->getRepository();
645
        $userService = $repository->getUserService();
646
647
        /* BEGIN: Use Case */
648
        $userGroup = $this->createUserGroupVersion1();
649
650
        // Load the content service
651
        $contentService = $repository->getContentService();
652
653
        // Create a metadata update struct and change the remoteId
654
        $metadataUpdate = $contentService->newContentMetadataUpdateStruct();
655
        $metadataUpdate->remoteId = '3c61299780663bafa3af2101e52125da';
656
657
        // Create a group update struct and set content update struct
658
        $groupUpdate = $userService->newUserGroupUpdateStruct();
659
        $groupUpdate->contentMetadataUpdateStruct = $metadataUpdate;
660
661
        // This will update the name and the increment the group version number
662
        $userGroup = $userService->updateUserGroup(
663
            $userGroup,
664
            $groupUpdate
665
        );
666
        /* END: Use Case */
667
668
        $this->assertEquals(
669
            '3c61299780663bafa3af2101e52125da',
670
            $userGroup->contentInfo->remoteId
671
        );
672
673
        $versionInfo = $userGroup->getVersionInfo();
674
675
        $this->assertEquals(VersionInfo::STATUS_PUBLISHED, $versionInfo->status);
676
        $this->assertEquals(1, $versionInfo->versionNo);
677
    }
678
679
    /**
680
     * Test for the updateUserGroup() method.
681
     *
682
     * @see \eZ\Publish\API\Repository\UserService::updateUserGroup()
683
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
684
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup
685
     */
686 View Code Duplication
    public function testUpdateUserGroupThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
687
    {
688
        $repository = $this->getRepository();
689
        $userService = $repository->getUserService();
690
691
        /* BEGIN: Use Case */
692
        $userGroup = $this->createUserGroupVersion1();
693
694
        // Load the content service
695
        $contentService = $repository->getContentService();
696
697
        // Create a content update struct and update the group name
698
        $contentUpdate = $contentService->newContentUpdateStruct();
699
        // An object of stdClass is not accepted as a value by the field "name"
700
        $contentUpdate->setField('name', new \stdClass(), 'eng-US');
701
702
        // Create a group update struct and set content update struct
703
        $groupUpdate = $userService->newUserGroupUpdateStruct();
704
        $groupUpdate->contentUpdateStruct = $contentUpdate;
705
706
        // This call will fail with an InvalidArgumentException, because the
707
        // field "name" does not accept the given value
708
        $userService->updateUserGroup($userGroup, $groupUpdate);
709
        /* END: Use Case */
710
    }
711
712
    /**
713
     * Test for the newUserCreateStruct() method.
714
     *
715
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct()
716
     */
717
    public function testNewUserCreateStruct()
718
    {
719
        $repository = $this->getRepository();
720
721
        /* BEGIN: Use Case */
722
        $userService = $repository->getUserService();
723
724
        $userCreate = $userService->newUserCreateStruct(
725
            'user',
726
            '[email protected]',
727
            'secret',
728
            'eng-US'
729
        );
730
        /* END: Use Case */
731
732
        $this->assertInstanceOf(
733
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserCreateStruct',
734
            $userCreate
735
        );
736
737
        return $userCreate;
738
    }
739
740
    /**
741
     * Test for the newUserCreateStruct() method.
742
     *
743
     * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreate
744
     *
745
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct()
746
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
747
     */
748 View Code Duplication
    public function testNewUserCreateStructSetsExpectedProperties($userCreate)
749
    {
750
        $this->assertEquals(
751
            array(
752
                'login' => 'user',
753
                'email' => '[email protected]',
754
                'password' => 'secret',
755
                'mainLanguageCode' => 'eng-US',
756
            ),
757
            array(
758
                'login' => $userCreate->login,
759
                'email' => $userCreate->email,
760
                'password' => $userCreate->password,
761
                'mainLanguageCode' => $userCreate->mainLanguageCode,
762
            )
763
        );
764
    }
765
766
    /**
767
     * Test for the newUserCreateStruct() method.
768
     *
769
     * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct($login, $email, $password, $mainLanguageCode, $contentType)
770
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
771
     * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier
772
     */
773 View Code Duplication
    public function testNewUserCreateStructWithFifthParameter()
774
    {
775
        if ($this->isVersion4()) {
776
            $this->markTestSkipped('This test is only relevant for eZ Publish versions > 4');
777
        }
778
779
        $repository = $this->getRepository();
780
781
        /* BEGIN: Use Case */
782
        $contentTypeService = $repository->getContentTypeService();
783
        $userService = $repository->getUserService();
784
785
        $userType = $contentTypeService->loadContentTypeByIdentifier('user');
786
787
        $userCreate = $userService->newUserCreateStruct(
788
            'user',
789
            '[email protected]',
790
            'secret',
791
            'eng-US',
792
            $userType
793
        );
794
        /* END: Use Case */
795
796
        $this->assertSame($userType, $userCreate->contentType);
797
    }
798
799
    /**
800
     * Test for the createUser() method.
801
     *
802
     * @return \eZ\Publish\API\Repository\Values\User\User
803
     *
804
     * @see \eZ\Publish\API\Repository\UserService::createUser()
805
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
806
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
807
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
808
     */
809
    public function testCreateUser()
810
    {
811
        /* BEGIN: Use Case */
812
        $user = $this->createUserVersion1();
813
        /* END: Use Case */
814
815
        $this->assertInstanceOf(
816
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\User',
817
            $user
818
        );
819
820
        return $user;
821
    }
822
823
    /**
824
     * Test for the createUser() method.
825
     *
826
     * @param \eZ\Publish\API\Repository\Values\User\User $user
827
     *
828
     * @see \eZ\Publish\API\Repository\UserService::createUser()
829
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
830
     */
831 View Code Duplication
    public function testCreateUserSetsExpectedProperties(User $user)
832
    {
833
        $this->assertEquals(
834
            array(
835
                'login' => 'user',
836
                'email' => '[email protected]',
837
                'passwordHash' => $this->createHash(
838
                    'user',
839
                    'secret',
840
                    $user->hashAlgorithm
841
                ),
842
                'mainLanguageCode' => 'eng-US',
843
            ),
844
            array(
845
                'login' => $user->login,
846
                'email' => $user->email,
847
                'passwordHash' => $user->passwordHash,
848
                'mainLanguageCode' => $user->contentInfo->mainLanguageCode,
849
            )
850
        );
851
    }
852
853
    /**
854
     * Test for the createUser() method.
855
     *
856
     * @see \eZ\Publish\API\Repository\UserService::createUser()
857
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException
858
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
859
     */
860 View Code Duplication
    public function testCreateUserThrowsContentValidationExceptionForMissingField()
861
    {
862
        $repository = $this->getRepository();
863
864
        $editorsGroupId = $this->generateId('group', 13);
865
        /* BEGIN: Use Case */
866
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
867
        // Publish demo installation
868
869
        $userService = $repository->getUserService();
870
871
        // Instantiate a create struct with mandatory properties
872
        $userCreate = $userService->newUserCreateStruct(
873
            'user',
874
            '[email protected]',
875
            'secret',
876
            'eng-US'
877
        );
878
879
        // Do not set the mandatory fields "first_name" and "last_name"
880
        //$userCreate->setField( 'first_name', 'Example' );
881
        //$userCreate->setField( 'last_name', 'User' );
882
883
        // Load parent group for the user
884
        $group = $userService->loadUserGroup($editorsGroupId);
885
886
        // This call will fail with a "ContentValidationException", because the
887
        // mandatory fields "first_name" and "last_name" are not set.
888
        $userService->createUser($userCreate, array($group));
889
        /* END: Use Case */
890
    }
891
892
    /**
893
     * Test for the createUser() method.
894
     *
895
     * @see \eZ\Publish\API\Repository\UserService::createUser()
896
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
897
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
898
     */
899 View Code Duplication
    public function testCreateUserThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
900
    {
901
        $repository = $this->getRepository();
902
903
        $editorsGroupId = $this->generateId('group', 13);
904
        /* BEGIN: Use Case */
905
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
906
        // Publish demo installation
907
908
        $userService = $repository->getUserService();
909
910
        // Instantiate a create struct with mandatory properties
911
        $userCreate = $userService->newUserCreateStruct(
912
            'user',
913
            '[email protected]',
914
            'secret',
915
            'eng-US'
916
        );
917
918
        // An object of stdClass is not a valid value for the field first_name
919
        $userCreate->setField('first_name', new \stdClass());
920
        $userCreate->setField('last_name', 'User');
921
922
        // Load parent group for the user
923
        $group = $userService->loadUserGroup($editorsGroupId);
924
925
        // This call will fail with an "InvalidArgumentException", because the
926
        // value for the firled "first_name" is not accepted by the field type.
927
        $userService->createUser($userCreate, array($group));
928
        /* END: Use Case */
929
    }
930
931
    /**
932
     * Test for the createUser() method.
933
     *
934
     * @see \eZ\Publish\API\Repository\UserService::createUser()
935
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
936
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
937
     */
938 View Code Duplication
    public function testCreateUserThrowsInvalidArgumentException()
939
    {
940
        $repository = $this->getRepository();
941
942
        $editorsGroupId = $this->generateId('group', 13);
943
        /* BEGIN: Use Case */
944
        // $editorsGroupId is the ID of the "Editors" user group in an eZ
945
        // Publish demo installation
946
947
        $userService = $repository->getUserService();
948
949
        // Instantiate a create struct with mandatory properties
950
        $userCreate = $userService->newUserCreateStruct(
951
            // admin is an existing login
952
            'admin',
953
            '[email protected]',
954
            'secret',
955
            'eng-US'
956
        );
957
958
        $userCreate->setField('first_name', 'Example');
959
        $userCreate->setField('last_name', 'User');
960
961
        // Load parent group for the user
962
        $group = $userService->loadUserGroup($editorsGroupId);
963
964
        // This call will fail with a "InvalidArgumentException", because the
965
        // user with "admin" login already exists.
966
        $userService->createUser($userCreate, array($group));
967
        /* END: Use Case */
968
    }
969
970
    /**
971
     * Test for the createUser() method.
972
     *
973
     * @return \eZ\Publish\API\Repository\Values\User\User
974
     *
975
     * @see \eZ\Publish\API\Repository\UserService::createUser()
976
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup
977
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct
978
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent
979
     */
980
    public function testCreateUserInTransactionWithRollback()
981
    {
982
        $repository = $this->getRepository();
983
        $userService = $repository->getUserService();
984
985
        /* BEGIN: Use Case */
986
        $repository->beginTransaction();
987
988
        try {
989
            $user = $this->createUserVersion1();
990
        } catch (Exception $e) {
991
            // Cleanup hanging transaction on error
992
            $repository->rollback();
993
            throw $e;
994
        }
995
996
        $repository->rollback();
997
998
        try {
999
            // Throws exception since creation of user was rolled back
1000
            $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...
1001
        } catch (NotFoundException $e) {
1002
            return;
1003
        }
1004
        /* END: Use Case */
1005
1006
        $this->fail('User object still exists after rollback.');
1007
    }
1008
1009
    /**
1010
     * Test for the loadUser() method.
1011
     *
1012
     * @see \eZ\Publish\API\Repository\UserService::loadUser()
1013
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1014
     */
1015
    public function testLoadUser()
1016
    {
1017
        $repository = $this->getRepository();
1018
1019
        $userService = $repository->getUserService();
1020
1021
        /* BEGIN: Use Case */
1022
        $user = $this->createUserVersion1();
1023
1024
        // Load the newly created user
1025
        $userReloaded = $userService->loadUser($user->id);
1026
        /* END: Use Case */
1027
1028
        $this->assertEquals($user, $userReloaded);
1029
    }
1030
1031
    /**
1032
     * Test for the loadUser() method.
1033
     *
1034
     * @see \eZ\Publish\API\Repository\UserService::loadUser()
1035
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1036
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser
1037
     */
1038
    public function testLoadUserThrowsNotFoundException()
1039
    {
1040
        $repository = $this->getRepository();
1041
1042
        $nonExistingUserId = $this->generateId('user', self::DB_INT_MAX);
1043
        /* BEGIN: Use Case */
1044
        $userService = $repository->getUserService();
1045
1046
        // This call will fail with a "NotFoundException", because no user with
1047
        // an id equal to self::DB_INT_MAX should exist.
1048
        $userService->loadUser($nonExistingUserId);
1049
        /* END: Use Case */
1050
    }
1051
1052
    /**
1053
     * Test for the loadAnonymousUser() method.
1054
     *
1055
     * @see \eZ\Publish\API\Repository\UserService::loadAnonymousUser()
1056
     */
1057
    public function testLoadAnonymousUser()
1058
    {
1059
        $repository = $this->getRepository();
1060
1061
        $anonymousUserId = $this->generateId('user', 10);
1062
        /* BEGIN: Use Case */
1063
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
1064
        // Publish demo installation.
1065
        $userService = $repository->getUserService();
1066
1067
        // Load default anonymous user available in each eZ Publish installation
1068
        $anonymousUser = $userService->loadUser($anonymousUserId);
1069
        /* END: Use Case */
1070
1071
        $this->assertInstanceOf(
1072
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\User',
1073
            $anonymousUser
1074
        );
1075
1076
        $this->assertEquals('anonymous', $anonymousUser->login);
1077
    }
1078
1079
    /**
1080
     * Test for the loadUserByCredentials() method.
1081
     *
1082
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1083
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1084
     */
1085
    public function testLoadUserByCredentials()
1086
    {
1087
        $repository = $this->getRepository();
1088
1089
        $userService = $repository->getUserService();
1090
1091
        /* BEGIN: Use Case */
1092
        $user = $this->createUserVersion1();
1093
1094
        // Load the newly created user
1095
        $userReloaded = $userService->loadUserByCredentials('user', 'secret');
1096
        /* END: Use Case */
1097
1098
        $this->assertEquals($user, $userReloaded);
1099
    }
1100
1101
    /**
1102
     * Test for the loadUserByCredentials() method.
1103
     *
1104
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1105
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1106
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1107
     */
1108
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownPassword()
1109
    {
1110
        $repository = $this->getRepository();
1111
1112
        $userService = $repository->getUserService();
1113
1114
        /* BEGIN: Use Case */
1115
        $this->createUserVersion1();
1116
1117
        // This call will fail with a "NotFoundException", because the given
1118
        // login/password combination does not exist.
1119
        $userService->loadUserByCredentials('user', 'SeCrEt');
1120
        /* END: Use Case */
1121
    }
1122
1123
    /**
1124
     * Test for the loadUserByCredentials() method.
1125
     *
1126
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1127
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1128
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1129
     */
1130
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownPasswordEmtpy()
1131
    {
1132
        $repository = $this->getRepository();
1133
1134
        $userService = $repository->getUserService();
1135
1136
        /* BEGIN: Use Case */
1137
        $this->createUserVersion1();
1138
1139
        // This call will fail with a "NotFoundException", because the given
1140
        // login/password combination does not exist.
1141
        $userService->loadUserByCredentials('user', '');
1142
        /* END: Use Case */
1143
    }
1144
1145
    /**
1146
     * Test for the loadUserByCredentials() method.
1147
     *
1148
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1149
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1150
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1151
     */
1152
    public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownLogin()
1153
    {
1154
        $repository = $this->getRepository();
1155
1156
        $userService = $repository->getUserService();
1157
1158
        /* BEGIN: Use Case */
1159
        $this->createUserVersion1();
1160
1161
        // This call will fail with a "NotFoundException", because the given
1162
        // login/password combination does not exist.
1163
        $userService->loadUserByCredentials('USER', 'secret');
1164
        /* END: Use Case */
1165
    }
1166
1167
    /**
1168
     * Test for the loadUserByCredentials() method.
1169
     *
1170
     * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials()
1171
     * @expectedException \eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue
1172
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials
1173
     */
1174
    public function testLoadUserByCredentialsThrowsInvalidArgumentValueForEmptyLogin()
1175
    {
1176
        $repository = $this->getRepository();
1177
1178
        $userService = $repository->getUserService();
1179
1180
        /* BEGIN: Use Case */
1181
        $this->createUserVersion1();
1182
1183
        // This call will fail with a "InvalidArgumentValue", because the given
1184
        // login is empty.
1185
        $userService->loadUserByCredentials('', 'secret');
1186
        /* END: Use Case */
1187
    }
1188
1189
    /**
1190
     * Test for the loadUserByLogin() method.
1191
     *
1192
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1193
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1194
     */
1195
    public function testLoadUserByLogin()
1196
    {
1197
        $repository = $this->getRepository();
1198
1199
        $userService = $repository->getUserService();
1200
1201
        /* BEGIN: Use Case */
1202
        $user = $this->createUserVersion1();
1203
1204
        // Load the newly created user
1205
        $userReloaded = $userService->loadUserByLogin('user');
1206
        /* END: Use Case */
1207
1208
        $this->assertPropertiesCorrect(
1209
            array(
1210
                'login' => $user->login,
1211
                'email' => $user->email,
1212
                'passwordHash' => $user->passwordHash,
1213
                'hashAlgorithm' => $user->hashAlgorithm,
1214
                'enabled' => $user->enabled,
1215
                'maxLogin' => $user->maxLogin,
1216
                'id' => $user->id,
1217
                'contentInfo' => $user->contentInfo,
1218
                'versionInfo' => $user->versionInfo,
1219
                'fields' => $user->fields,
1220
            ),
1221
            $userReloaded
1222
        );
1223
    }
1224
1225
    /**
1226
     * Test for the loadUserByLogin() method.
1227
     *
1228
     * @see \eZ\Publish\API\Repository\UserService::loadUserByLogin()
1229
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1230
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByLogin
1231
     */
1232
    public function testLoadUserByLoginThrowsNotFoundExceptionForUnknownLogin()
1233
    {
1234
        $repository = $this->getRepository();
1235
1236
        $userService = $repository->getUserService();
1237
1238
        /* BEGIN: Use Case */
1239
        $this->createUserVersion1();
1240
1241
        // This call will fail with a "NotFoundException", because the given
1242
        // login/password combination does not exist.
1243
        $userService->loadUserByLogin('user42');
1244
        /* END: Use Case */
1245
    }
1246
1247
    /**
1248
     * Test for the loadUsersByEmail() method.
1249
     *
1250
     * @see \eZ\Publish\API\Repository\UserService::loadUsersByEmail()
1251
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1252
     */
1253 View Code Duplication
    public function testLoadUserByEmail()
1254
    {
1255
        $repository = $this->getRepository();
1256
1257
        $userService = $repository->getUserService();
1258
1259
        /* BEGIN: Use Case */
1260
        $user = $this->createUserVersion1();
1261
1262
        // Load the newly created user
1263
        $usersReloaded = $userService->loadUsersByEmail('[email protected]');
1264
        /* END: Use Case */
1265
1266
        $this->assertEquals(array($user), $usersReloaded);
1267
    }
1268
1269
    /**
1270
     * Test for the loadUsersByEmail() method.
1271
     *
1272
     * @see \eZ\Publish\API\Repository\UserService::loadUsersByEmail()
1273
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByEmail
1274
     */
1275 View Code Duplication
    public function testLoadUserByEmailReturnsEmptyInUnknownEmail()
1276
    {
1277
        $repository = $this->getRepository();
1278
1279
        $userService = $repository->getUserService();
1280
1281
        /* BEGIN: Use Case */
1282
        $this->createUserVersion1();
1283
1284
        // This call will return empty array, because the given
1285
        // login/password combination does not exist.
1286
        $emptyUserList = $userService->loadUsersByEmail('[email protected]');
1287
        /* END: Use Case */
1288
1289
        $this->assertEquals(array(), $emptyUserList);
1290
    }
1291
1292
    /**
1293
     * Test for the deleteUser() method.
1294
     *
1295
     * @see \eZ\Publish\API\Repository\UserService::deleteUser()
1296
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
1297
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1298
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser
1299
     */
1300 View Code Duplication
    public function testDeleteUser()
1301
    {
1302
        $repository = $this->getRepository();
1303
1304
        $userService = $repository->getUserService();
1305
1306
        /* BEGIN: Use Case */
1307
        $user = $this->createUserVersion1();
1308
1309
        // Delete the currently created user
1310
        $userService->deleteUser($user);
1311
        /* END: Use Case */
1312
1313
        // We use the NotFoundException here to verify that the user not exists
1314
        $userService->loadUser($user->id);
1315
    }
1316
1317
    /**
1318
     * Test for the newUserUpdateStruct() method.
1319
     *
1320
     * @see \eZ\Publish\API\Repository\UserService::newUserUpdateStruct()
1321
     */
1322
    public function testNewUserUpdateStruct()
1323
    {
1324
        $repository = $this->getRepository();
1325
1326
        /* BEGIN: Use Case */
1327
        $userService = $repository->getUserService();
1328
1329
        // Create a new update struct instance
1330
        $userUpdate = $userService->newUserUpdateStruct();
1331
        /* END: Use Case */
1332
1333
        $this->assertInstanceOf(
1334
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserUpdateStruct',
1335
            $userUpdate
1336
        );
1337
    }
1338
1339
    /**
1340
     * Test for the updateUser() method.
1341
     *
1342
     * @return \eZ\Publish\API\Repository\Values\User\User
1343
     *
1344
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1345
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1346
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserUpdateStruct
1347
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent
1348
     * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata
1349
     */
1350
    public function testUpdateUser()
1351
    {
1352
        $repository = $this->getRepository();
1353
1354
        $userService = $repository->getUserService();
1355
1356
        /* BEGIN: Use Case */
1357
        $user = $this->createUserVersion1();
1358
1359
        // Create a new update struct instance
1360
        $userUpdate = $userService->newUserUpdateStruct();
1361
1362
        // Set new values for password and maxLogin
1363
        $userUpdate->password = 'my-new-password';
1364
        $userUpdate->maxLogin = 42;
1365
        $userUpdate->enabled = false;
1366
1367
        // Updated the user record.
1368
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1369
        /* END: Use Case */
1370
1371
        $this->assertInstanceOf(
1372
            '\\eZ\\Publish\\API\\Repository\\Values\\User\\User',
1373
            $user
1374
        );
1375
1376
        return $userVersion2;
1377
    }
1378
1379
    /**
1380
     * Test for the updateUser() method.
1381
     *
1382
     * @param \eZ\Publish\API\Repository\Values\User\User $user
1383
     *
1384
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1385
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1386
     */
1387
    public function testUpdateUserUpdatesExpectedProperties(User $user)
1388
    {
1389
        $this->assertEquals(
1390
            array(
1391
                'login' => 'user',
1392
                'email' => '[email protected]',
1393
                'passwordHash' => $this->createHash(
1394
                    'user',
1395
                    'my-new-password',
1396
                    $user->hashAlgorithm
1397
                ),
1398
                'maxLogin' => 42,
1399
                'enabled' => false,
1400
            ),
1401
            array(
1402
                'login' => $user->login,
1403
                'email' => $user->email,
1404
                'passwordHash' => $user->passwordHash,
1405
                'maxLogin' => $user->maxLogin,
1406
                'enabled' => $user->enabled,
1407
            )
1408
        );
1409
    }
1410
1411
    /**
1412
     * Test for the updateUser() method.
1413
     *
1414
     * @param \eZ\Publish\API\Repository\Values\User\User $user
1415
     *
1416
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1417
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1418
     */
1419
    public function testUpdateUserReturnsPublishedVersion($user)
1420
    {
1421
        $this->assertEquals(
1422
            VersionInfo::STATUS_PUBLISHED,
1423
            $user->getVersionInfo()->status
1424
        );
1425
    }
1426
1427
    /**
1428
     * Test for the updateUser() method.
1429
     *
1430
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1431
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1432
     */
1433
    public function testUpdateUserWithContentMetadataUpdateStruct()
1434
    {
1435
        $repository = $this->getRepository();
1436
1437
        $userService = $repository->getUserService();
1438
1439
        /* BEGIN: Use Case */
1440
        $user = $this->createUserVersion1();
1441
1442
        // Get the ContentService implementation
1443
        $contentService = $repository->getContentService();
1444
1445
        // Create a metadata update struct and change the remote id.
1446
        $metadataUpdate = $contentService->newContentMetadataUpdateStruct();
1447
        $metadataUpdate->remoteId = '85e10037d1ac0a00aa75443ced483e08';
1448
1449
        // Create a new update struct instance
1450
        $userUpdate = $userService->newUserUpdateStruct();
1451
1452
        // Set the metadata update struct.
1453
        $userUpdate->contentMetadataUpdateStruct = $metadataUpdate;
1454
1455
        // Updated the user record.
1456
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1457
1458
        // The contentInfo->remoteId will be changed now.
1459
        $remoteId = $userVersion2->contentInfo->remoteId;
1460
        /* END: Use Case */
1461
1462
        $this->assertEquals('85e10037d1ac0a00aa75443ced483e08', $remoteId);
1463
    }
1464
1465
    /**
1466
     * Test for the updateUser() method.
1467
     *
1468
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1469
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1470
     */
1471
    public function testUpdateUserWithContentUpdateStruct()
1472
    {
1473
        $repository = $this->getRepository();
1474
1475
        $userService = $repository->getUserService();
1476
1477
        /* BEGIN: Use Case */
1478
        $user = $this->createUserVersion1();
1479
1480
        // Get the ContentService implementation
1481
        $contentService = $repository->getContentService();
1482
1483
        // Create a content update struct and change the remote id.
1484
        $contentUpdate = $contentService->newContentUpdateStruct();
1485
        $contentUpdate->setField('first_name', 'Hello', 'eng-US');
1486
        $contentUpdate->setField('last_name', 'World', 'eng-US');
1487
1488
        // Create a new update struct instance
1489
        $userUpdate = $userService->newUserUpdateStruct();
1490
1491
        // Set the content update struct.
1492
        $userUpdate->contentUpdateStruct = $contentUpdate;
1493
1494
        // Updated the user record.
1495
        $userVersion2 = $userService->updateUser($user, $userUpdate);
1496
1497
        $name = sprintf(
1498
            '%s %s',
1499
            $userVersion2->getFieldValue('first_name'),
1500
            $userVersion2->getFieldValue('last_name')
1501
        );
1502
        /* END: Use Case */
1503
1504
        $this->assertEquals('Hello World', $name);
1505
    }
1506
1507
    /**
1508
     * Test for the updateUser() method.
1509
     *
1510
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1511
     * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException
1512
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1513
     */
1514 View Code Duplication
    public function testUpdateUserThrowsContentValidationException()
1515
    {
1516
        $repository = $this->getRepository();
1517
1518
        $userService = $repository->getUserService();
1519
1520
        /* BEGIN: Use Case */
1521
        $user = $this->createUserVersion1();
1522
1523
        // Get the ContentService implementation
1524
        $contentService = $repository->getContentService();
1525
1526
        // Create a content update struct and change the remote id.
1527
        $contentUpdate = $contentService->newContentUpdateStruct();
1528
        $contentUpdate->setField('first_name', null, 'eng-US');
1529
1530
        // Create a new update struct instance
1531
        $userUpdate = $userService->newUserUpdateStruct();
1532
1533
        // Set the content update struct.
1534
        $userUpdate->contentUpdateStruct = $contentUpdate;
1535
1536
        // This call will fail with a "ContentValidationException" because the
1537
        // mandatory field "first_name" is set to an empty value.
1538
        $userService->updateUser($user, $userUpdate);
1539
1540
        /* END: Use Case */
1541
    }
1542
1543
    /**
1544
     * Test for the updateUser() method.
1545
     *
1546
     * @see \eZ\Publish\API\Repository\UserService::updateUser()
1547
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1548
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser
1549
     */
1550 View Code Duplication
    public function testUpdateUserThrowsInvalidArgumentExceptionOnFieldTypeNotAccept()
1551
    {
1552
        $repository = $this->getRepository();
1553
1554
        $userService = $repository->getUserService();
1555
1556
        /* BEGIN: Use Case */
1557
        $user = $this->createUserVersion1();
1558
1559
        // Get the ContentService implementation
1560
        $contentService = $repository->getContentService();
1561
1562
        $contentUpdate = $contentService->newContentUpdateStruct();
1563
        // An object of stdClass is not valid for the field first_name
1564
        $contentUpdate->setField('first_name', new \stdClass(), 'eng-US');
1565
1566
        // Create a new update struct instance
1567
        $userUpdate = $userService->newUserUpdateStruct();
1568
1569
        // Set the content update struct.
1570
        $userUpdate->contentUpdateStruct = $contentUpdate;
1571
1572
        // This call will fail with a "InvalidArgumentException" because the
1573
        // the field "first_name" does not accept the given value.
1574
        $userService->updateUser($user, $userUpdate);
1575
1576
        /* END: Use Case */
1577
    }
1578
1579
    /**
1580
     * Test for the loadUserGroupsOfUser() method.
1581
     *
1582
     * @see \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser()
1583
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1584
     */
1585
    public function testLoadUserGroupsOfUser()
1586
    {
1587
        $repository = $this->getRepository();
1588
1589
        $userService = $repository->getUserService();
1590
1591
        /* BEGIN: Use Case */
1592
        $user = $this->createUserVersion1();
1593
1594
        // This array will contain the "Editors" user group name
1595
        $userGroupNames = array();
1596
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
1597
            $userGroupNames[] = $userGroup->getFieldValue('name');
1598
        }
1599
        /* END: Use Case */
1600
1601
        $this->assertEquals(array('Editors'), $userGroupNames);
1602
    }
1603
1604
    /**
1605
     * Test for the loadUsersOfUserGroup() method.
1606
     *
1607
     * @see \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup()
1608
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser
1609
     */
1610
    public function testLoadUsersOfUserGroup()
1611
    {
1612
        $repository = $this->getRepository();
1613
        $userService = $repository->getUserService();
1614
1615
        $group = $userService->loadUserGroup($this->generateId('group', 13));
1616
1617
        /* BEGIN: Use Case */
1618
        $this->createUserVersion1();
1619
1620
        $this->refreshSearch($repository);
1621
1622
        // This array will contain the email of the newly created "Editor" user
1623
        $email = array();
1624
        foreach ($userService->loadUsersOfUserGroup($group) as $user) {
1625
            $email[] = $user->email;
1626
        }
1627
        /* END: Use Case */
1628
        $this->assertEquals(array('[email protected]'), $email);
1629
    }
1630
1631
    /**
1632
     * Test for the assignUserToUserGroup() method.
1633
     *
1634
     * @see \eZ\Publish\API\Repository\UserService::assignUserToUserGroup()
1635
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser
1636
     */
1637
    public function testAssignUserToUserGroup()
1638
    {
1639
        $repository = $this->getRepository();
1640
        $userService = $repository->getUserService();
1641
1642
        $administratorGroupId = $this->generateId('group', 12);
1643
        /* BEGIN: Use Case */
1644
        // $administratorGroupId is the ID of the "Administrator" group in an
1645
        // eZ Publish demo installation
1646
1647
        $user = $this->createUserVersion1();
1648
1649
        // Assign group to newly created user
1650
        $userService->assignUserToUserGroup(
1651
            $user,
1652
            $userService->loadUserGroup($administratorGroupId)
1653
        );
1654
1655
        // This array will contain "Editors" and "Administrator users"
1656
        $userGroupNames = array();
1657
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
1658
            $userGroupNames[] = $userGroup->getFieldValue('name');
1659
        }
1660
        /* END: Use Case */
1661
1662
        sort($userGroupNames, SORT_STRING);
1663
1664
        $this->assertEquals(
1665
            array(
1666
                'Administrator users',
1667
                'Editors',
1668
            ),
1669
            $userGroupNames
1670
        );
1671
    }
1672
1673
    /**
1674
     * Test for the assignUserToUserGroup() method.
1675
     *
1676
     * @see \eZ\Publish\API\Repository\UserService::assignUserToUserGroup()
1677
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1678
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testAssignUserToUserGroup
1679
     */
1680 View Code Duplication
    public function testAssignUserToUserGroupThrowsInvalidArgumentException()
1681
    {
1682
        $repository = $this->getRepository();
1683
        $userService = $repository->getUserService();
1684
1685
        $editorsGroupId = $this->generateId('group', 13);
1686
        /* BEGIN: Use Case */
1687
        $user = $this->createUserVersion1();
1688
        // $editorsGroupId is the ID of the "Editors" group in an
1689
        // eZ Publish demo installation
1690
1691
        // This call will fail with an "InvalidArgumentException", because the
1692
        // user is already assigned to the "Editors" group
1693
        $userService->assignUserToUserGroup(
1694
            $user,
1695
            $userService->loadUserGroup($editorsGroupId)
1696
        );
1697
        /* END: Use Case */
1698
    }
1699
1700
    /**
1701
     * Test for the unAssignUssrFromUserGroup() method.
1702
     *
1703
     * @see \eZ\Publish\API\Repository\UserService::unAssignUssrFromUserGroup()
1704
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser
1705
     */
1706
    public function testUnAssignUserFromUserGroup()
1707
    {
1708
        $repository = $this->getRepository();
1709
        $userService = $repository->getUserService();
1710
1711
        $editorsGroupId = $this->generateId('group', 13);
1712
        $anonymousGroupId = $this->generateId('group', 42);
1713
1714
        /* BEGIN: Use Case */
1715
        // $anonymousGroupId is the ID of the "Anonymous Users" group in an eZ
1716
        // Publish demo installation
1717
1718
        $user = $this->createUserVersion1();
1719
1720
        // Assign group to newly created user
1721
        $userService->assignUserToUserGroup(
1722
            $user,
1723
            $userService->loadUserGroup($anonymousGroupId)
1724
        );
1725
1726
        // Unassign user from "Editors" group
1727
        $userService->unAssignUserFromUserGroup(
1728
            $user,
1729
            $userService->loadUserGroup($editorsGroupId)
1730
        );
1731
1732
        // This array will contain "Anonymous Users"
1733
        $userGroupNames = array();
1734
        foreach ($userService->loadUserGroupsOfUser($user) as $userGroup) {
1735
            $userGroupNames[] = $userGroup->getFieldValue('name');
1736
        }
1737
        /* END: Use Case */
1738
1739
        $this->assertEquals(array('Anonymous Users'), $userGroupNames);
1740
    }
1741
1742
    /**
1743
     * Test for the unAssignUserFromUserGroup() method.
1744
     *
1745
     * @see \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup()
1746
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1747
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup
1748
     */
1749
    public function testUnAssignUserFromUserGroupThrowsInvalidArgumentException()
1750
    {
1751
        $repository = $this->getRepository();
1752
        $userService = $repository->getUserService();
1753
1754
        $administratorGroupId = $this->generateId('group', 12);
1755
        /* BEGIN: Use Case */
1756
        $user = $this->createUserVersion1();
1757
        // $administratorGroupId is the ID of the "Administrator" group in an
1758
        // eZ Publish demo installation
1759
1760
        // This call will fail with an "InvalidArgumentException", because the
1761
        // user is not assigned to the "Administrator" group
1762
        $userService->unAssignUserFromUserGroup(
1763
            $user,
1764
            $userService->loadUserGroup($administratorGroupId)
1765
        );
1766
        /* END: Use Case */
1767
    }
1768
1769
    /**
1770
     * Test for the unAssignUserFromUserGroup() method.
1771
     *
1772
     * @see \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup()
1773
     * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException
1774
     * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup
1775
     */
1776
    public function testUnAssignUserFromUserGroupThrowsBadStateArgumentException()
1777
    {
1778
        $repository = $this->getRepository();
1779
        $userService = $repository->getUserService();
1780
1781
        $editorsGroupId = $this->generateId('group', 13);
1782
        /* BEGIN: Use Case */
1783
        $user = $this->createUserVersion1();
1784
        // $administratorGroupId is the ID of the "Administrator" group in an
1785
        // eZ Publish demo installation
1786
1787
        // This call will fail with an "InvalidArgumentException", because the
1788
        // user is not assigned to the "Administrator" group
1789
        $userService->unAssignUserFromUserGroup(
1790
            $user,
1791
            $userService->loadUserGroup($editorsGroupId)
1792
        );
1793
        /* END: Use Case */
1794
    }
1795
1796
    /**
1797
     * Create a user group fixture in a variable named <b>$userGroup</b>,.
1798
     *
1799
     * @return \eZ\Publish\API\Repository\Values\User\UserGroup
1800
     */
1801
    private function createUserGroupVersion1()
1802
    {
1803
        $repository = $this->getRepository();
1804
1805
        $mainGroupId = $this->generateId('group', 4);
1806
        /* BEGIN: Inline */
1807
        // $mainGroupId is the ID of the main "Users" group
1808
1809
        $userService = $repository->getUserService();
1810
1811
        // Load main group
1812
        $parentUserGroup = $userService->loadUserGroup($mainGroupId);
1813
1814
        // Instantiate a new create struct
1815
        $userGroupCreate = $userService->newUserGroupCreateStruct('eng-US');
1816
        $userGroupCreate->setField('name', 'Example Group');
1817
1818
        // Create the new user group
1819
        $userGroup = $userService->createUserGroup(
1820
            $userGroupCreate,
1821
            $parentUserGroup
1822
        );
1823
        /* END: Inline */
1824
1825
        return $userGroup;
1826
    }
1827
1828
    private function createHash($login, $password, $type)
1829
    {
1830
        switch ($type) {
1831
            case 2:
1832
                /* PASSWORD_HASH_MD5_USER */
1833
                return md5("{$login}\n{$password}");
1834
1835
            case 3:
1836
                /* PASSWORD_HASH_MD5_SITE */
1837
                $site = null;
1838
1839
                return md5("{$login}\n{$password}\n{$site}");
1840
1841
            case 5:
1842
                /* PASSWORD_HASH_PLAINTEXT */
1843
                return $password;
1844
        }
1845
        /* PASSWORD_HASH_MD5_PASSWORD (1) */
1846
        return md5($password);
1847
    }
1848
}
1849