Completed
Push — master ( 696c56...a8c737 )
by André
259:23 queued 232:42
created

RoleTest::testListRoles()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 0
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * File containing the Functional\RoleTest 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\Bundle\EzPublishRestBundle\Tests\Functional;
10
11
use eZ\Bundle\EzPublishRestBundle\Tests\Functional\TestCase as RESTFunctionalTestCase;
12
use eZ\Publish\API\Repository\Values\User\Limitation;
13
14
class RoleTest extends RESTFunctionalTestCase
15
{
16
    /**
17
     * Covers POST /user/roles.
18
     *
19
     * BC compatible mode, will return a role
20
     *
21
     * @return string The created role href
22
     */
23 View Code Duplication
    public function testCreateRole()
24
    {
25
        $xml = <<< XML
26
<?xml version="1.0" encoding="UTF-8"?>
27
<RoleInput>
28
  <identifier>testCreateRole</identifier>
29
  <mainLanguageCode>eng-GB</mainLanguageCode>
30
  <names>
31
    <value languageCode="eng-GB">testCreateRole</value>
32
  </names>
33
  <descriptions>
34
    <value languageCode="eng-GB">testCreateRole description</value>
35
  </descriptions>
36
</RoleInput>
37
XML;
38
        $request = $this->createHttpRequest(
39
            'POST',
40
            '/api/ezp/v2/user/roles',
41
            'RoleInput+xml',
42
            'Role+json',
43
            $xml
44
        );
45
        $response = $this->sendHttpRequest($request);
46
47
        self::assertHttpResponseCodeEquals($response, 201);
48
        self::assertHttpResponseHasHeader($response, 'Location');
49
50
        $href = $response->getHeader('Location')[0];
51
        $this->addCreatedElement($href);
52
53
        return $href;
54
    }
55
56
    /**
57
     * Covers POST /user/roles.
58
     *
59
     * BC incompatible mode, will return a role draft
60
     *
61
     * @return string The created role draft href
62
     */
63 View Code Duplication
    public function testCreateRoleWithDraft()
64
    {
65
        $xml = <<< XML
66
<?xml version="1.0" encoding="UTF-8"?>
67
<RoleInput>
68
  <identifier>testCreateRoleDraft</identifier>
69
  <mainLanguageCode>eng-GB</mainLanguageCode>
70
  <names>
71
    <value languageCode="eng-GB">testCreateRoleDraft</value>
72
  </names>
73
  <descriptions>
74
    <value languageCode="eng-GB">testCreateRoleDraft description</value>
75
  </descriptions>
76
</RoleInput>
77
XML;
78
        $request = $this->createHttpRequest(
79
            'POST',
80
            '/api/ezp/v2/user/roles?publish=false',
81
            'RoleInput+xml',
82
            'RoleDraft+json',
83
            $xml
84
        );
85
        $response = $this->sendHttpRequest($request);
86
87
        self::assertHttpResponseCodeEquals($response, 201);
88
        self::assertHttpResponseHasHeader($response, 'Location');
89
90
        $href = $response->getHeader('Location')[0];
91
        $this->addCreatedElement($href);
92
93
        return $href . '/draft';
94
    }
95
96
    /**
97
     * Covers GET /user/roles.
98
     */
99
    public function testListRoles()
100
    {
101
        $response = $this->sendHttpRequest(
102
            $this->createHttpRequest('GET', '/api/ezp/v2/user/roles')
103
        );
104
105
        self::assertHttpResponseCodeEquals($response, 200);
106
    }
107
108
    /**
109
     * @depends testCreateRole
110
     * Covers GET /user/roles/{roleId}
111
     */
112
    public function testLoadRole($roleHref)
113
    {
114
        $response = $this->sendHttpRequest(
115
            $this->createHttpRequest('GET', $roleHref)
116
        );
117
118
        self::assertHttpResponseCodeEquals($response, 200);
119
    }
120
121
    /**
122
     * @depends testCreateRole
123
     * Covers POST /user/roles/{roleId}
124
     *
125
     * @return string The created role draft href
126
     */
127 View Code Duplication
    public function testCreateRoleDraft($roleHref)
128
    {
129
        $xml = <<< XML
130
<?xml version="1.0" encoding="UTF-8"?>
131
<RoleInput>
132
  <identifier>testCreateRoleDraft</identifier>
133
  <mainLanguageCode>eng-GB</mainLanguageCode>
134
  <names>
135
    <value languageCode="eng-GB">testCreateRoleDraft</value>
136
  </names>
137
  <descriptions>
138
    <value languageCode="eng-GB">testCreateRoleDraft description</value>
139
  </descriptions>
140
</RoleInput>
141
XML;
142
        $request = $this->createHttpRequest(
143
            'POST',
144
            $roleHref,
145
            'RoleInput+xml',
146
            'RoleDraft+json',
147
            $xml
148
        );
149
        $response = $this->sendHttpRequest($request);
150
151
        self::assertHttpResponseCodeEquals($response, 201);
152
        self::assertHttpResponseHasHeader($response, 'Location');
153
154
        $href = $response->getHeader('Location')[0];
155
        $this->addCreatedElement($href);
156
157
        return $href . '/draft';
158
    }
159
160
    /**
161
     * @depends testCreateRoleDraft
162
     * Covers GET /user/roles/{roleId}/draft
163
     */
164
    public function testLoadRoleDraft($roleDraftHref)
165
    {
166
        $response = $this->sendHttpRequest(
167
            $this->createHttpRequest('GET', $roleDraftHref)
168
        );
169
170
        self::assertHttpResponseCodeEquals($response, 200);
171
    }
172
173
    /**
174
     * @depends testCreateRole
175
     * Covers PATCH /user/roles/{roleId}
176
     */
177 View Code Duplication
    public function testUpdateRole($roleHref)
178
    {
179
        $xml = <<< XML
180
<?xml version="1.0" encoding="UTF-8"?>
181
<RoleInput>
182
  <identifier>testUpdateRole</identifier>
183
  <mainLanguageCode>eng-GB</mainLanguageCode>
184
  <names>
185
    <value languageCode="eng-GB">testUpdateRole</value>
186
  </names>
187
  <descriptions>
188
    <value languageCode="eng-GB">testUpdateRole description</value>
189
  </descriptions>
190
</RoleInput>
191
XML;
192
193
        $request = $this->createHttpRequest('PATCH', $roleHref, 'RoleInput+xml', 'Role+json', $xml);
194
        $response = $this->sendHttpRequest($request);
195
196
        self::assertHttpResponseCodeEquals($response, 200);
197
    }
198
199
    /**
200
     * @depends testCreateRoleDraft
201
     * Covers PATCH /user/roles/{roleId}/draft
202
     */
203 View Code Duplication
    public function testUpdateRoleDraft($roleDraftHref)
204
    {
205
        $xml = <<< XML
206
<?xml version="1.0" encoding="UTF-8"?>
207
<RoleInput>
208
  <identifier>testUpdateRoleDraft</identifier>
209
  <mainLanguageCode>eng-GB</mainLanguageCode>
210
  <names>
211
    <value languageCode="eng-GB">testUpdateRoleDraft</value>
212
  </names>
213
  <descriptions>
214
    <value languageCode="eng-GB">testUpdateRoleDraft description</value>
215
  </descriptions>
216
</RoleInput>
217
XML;
218
219
        $request = $this->createHttpRequest(
220
            'PATCH',
221
            $roleDraftHref,
222
            'RoleInput+xml',
223
            'RoleDraft+json',
224
            $xml
225
        );
226
        $response = $this->sendHttpRequest($request);
227
228
        self::assertHttpResponseCodeEquals($response, 200);
229
    }
230
231
    /**
232
     * Covers POST /user/roles/{roleId}/policies.
233
     * @depends testCreateRole
234
     *
235
     * @return string The created policy href
236
     */
237 View Code Duplication
    public function testAddPolicy($roleHref)
238
    {
239
        // @todo Error in Resource URL in spec @ https://github.com/ezsystems/ezpublish-kernel/blob/master/doc/specifications/rest/REST-API-V2.rst#151213create-policy
240
        $xml = <<< XML
241
<?xml version="1.0" encoding="UTF-8"?>
242
<PolicyCreate>
243
  <module>content</module>
244
  <function>create</function>
245
  <limitations>
246
    <limitation identifier="Class">
247
      <values>
248
        <ref href="2"/>
249
      </values>
250
    </limitation>
251
  </limitations>
252
</PolicyCreate>
253
XML;
254
        $request = $this->createHttpRequest(
255
            'POST',
256
            "$roleHref/policies",
257
            'PolicyCreate+xml',
258
            'Policy+json',
259
            $xml
260
        );
261
        $response = $this->sendHttpRequest($request);
262
263
        self::assertHttpResponseCodeEquals($response, 201);
264
        self::assertHttpResponseHasHeader($response, 'Location');
265
266
        $href = $response->getHeader('Location')[0];
267
        $this->addCreatedElement($href);
268
269
        return $href;
270
    }
271
272
    /**
273
     * Covers POST /user/roles/{roleId}/policies.
274
     * @depends testCreateRoleDraft
275
     *
276
     * @return string The created policy href
277
     */
278 View Code Duplication
    public function testAddPolicyByRoleDraft($roleDraftHref)
279
    {
280
        $xml = <<< XML
281
<?xml version="1.0" encoding="UTF-8"?>
282
<PolicyCreate>
283
  <module>content</module>
284
  <function>create</function>
285
  <limitations>
286
    <limitation identifier="Class">
287
      <values>
288
        <ref href="1"/>
289
      </values>
290
    </limitation>
291
  </limitations>
292
</PolicyCreate>
293
XML;
294
        $request = $this->createHttpRequest(
295
            'POST',
296
            $this->roleDraftHrefToRoleHref($roleDraftHref) . '/policies',
297
            'PolicyCreate+xml',
298
            'Policy+json',
299
            $xml
300
        );
301
        $response = $this->sendHttpRequest($request);
302
303
        self::assertHttpResponseCodeEquals($response, 201);
304
        self::assertHttpResponseHasHeader($response, 'Location');
305
306
        $href = $response->getHeader('Location')[0];
307
        $this->addCreatedElement($href);
308
309
        return $href;
310
    }
311
312
    /**
313
     * Covers GET /user/roles/{roleId}/policies/{policyId}.
314
     * @depends testAddPolicy
315
     */
316
    public function testLoadPolicy($policyHref)
317
    {
318
        $response = $this->sendHttpRequest(
319
            $this->createHttpRequest('GET', $policyHref)
320
        );
321
322
        self::assertHttpResponseCodeEquals($response, 200);
323
    }
324
325
    /**
326
     * Covers GET /user/roles/{roleId}/policies.
327
     * @depends testCreateRole
328
     */
329
    public function testLoadPolicies($roleHref)
330
    {
331
        $response = $this->sendHttpRequest(
332
            $this->createHttpRequest('GET', "$roleHref/policies")
333
        );
334
335
        self::assertHttpResponseCodeEquals($response, 200);
336
    }
337
338
    /**
339
     * Covers PATCH /user/roles/{roleId}/policies/{policyId}.
340
     * @depends testAddPolicy
341
     */
342 View Code Duplication
    public function testUpdatePolicy($policyHref)
343
    {
344
        $xml = <<< XML
345
<?xml version="1.0" encoding="UTF-8"?>
346
<PolicyUpdate>
347
  <limitations>
348
    <limitation identifier="Class">
349
      <values>
350
        <ref href="1"/>
351
      </values>
352
    </limitation>
353
  </limitations>
354
</PolicyUpdate>
355
XML;
356
357
        $request = $this->createHttpRequest(
358
            'PATCH',
359
            $policyHref,
360
            'PolicyUpdate+xml',
361
            'Policy+json',
362
            $xml
363
        );
364
        $response = $this->sendHttpRequest($request);
365
366
        self::assertHttpResponseCodeEquals($response, 200);
367
    }
368
369
    /**
370
     * Covers PATCH /user/roles/{roleId}/policies/{policyId}.
371
     * @depends testAddPolicyByRoleDraft
372
     */
373 View Code Duplication
    public function testUpdatePolicyByRoleDraft($policyHref)
374
    {
375
        $xml = <<< XML
376
<?xml version="1.0" encoding="UTF-8"?>
377
<PolicyUpdate>
378
  <limitations>
379
    <limitation identifier="Class">
380
      <values>
381
        <ref href="1"/>
382
      </values>
383
    </limitation>
384
  </limitations>
385
</PolicyUpdate>
386
XML;
387
388
        $request = $this->createHttpRequest('PATCH', $policyHref, 'PolicyUpdate+xml', 'Policy+json', $xml);
389
        $response = $this->sendHttpRequest($request);
390
391
        self::assertHttpResponseCodeEquals($response, 200);
392
    }
393
394
    /**
395
     * @depends testCreateRole
396
     * Covers POST /user/users/{userId}/roles
397
     *
398
     * @return string assigned role href
399
     *
400
     * @todo stop using the anonymous user, this is dangerous...
401
     */
402
    public function testAssignRoleToUser($roleHref)
403
    {
404
        $xml = <<< XML
405
<?xml version="1.0" encoding="UTF-8"?>
406
<RoleAssignInput>
407
  <Role href="{$roleHref}" media-type="application/vnd.ez.api.RoleAssignInput+xml"/>
408
</RoleAssignInput>
409
XML;
410
411
        $request = $this->createHttpRequest(
412
            'POST',
413
            '/api/ezp/v2/user/users/10/roles',
414
            'RoleAssignInput+xml',
415
            'RoleAssignmentList+json',
416
            $xml
417
        );
418
        $response = $this->sendHttpRequest($request);
419
420
        $roleAssignmentArray = json_decode($response->getBody(), true);
421
422
        self::assertHttpResponseCodeEquals($response, 200);
423
424
        return $roleAssignmentArray['RoleAssignmentList']['RoleAssignment'][0]['_href'];
425
    }
426
427
    /**
428
     * @covers       \POST /user/users/{userId}/roles
429
     *
430
     * @param string $roleHref
0 ignored issues
show
Bug introduced by
There is no parameter named $roleHref. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
431
     * @param array $limitation
432
     *
433
     * @return string assigned role href
434
     * @dataProvider provideLimitations
435
     */
436
    public function testAssignRoleToUserWithLimitation(array $limitation)
437
    {
438
        $roleHref = $this->createAndPublishRole('testAssignRoleToUserWithLimitation_' . $limitation['identifier']);
439
440
        $xml = <<< XML
441
<?xml version="1.0" encoding="UTF-8"?>
442
<RoleAssignInput>
443
  <Role href="{$roleHref}" media-type="application/vnd.ez.api.RoleAssignInput+xml"/>
444
  <limitation identifier="{$limitation['identifier']}">
445
      <values>
446
          <ref href="{$limitation['href']}" media-type="application/vnd.ez.api.{$limitation['identifier']}+xml" />
447
      </values>
448
  </limitation>
449
</RoleAssignInput>
450
XML;
451
452
        $request = $this->createHttpRequest(
453
            'POST',
454
            '/api/ezp/v2/user/users/10/roles',
455
            'RoleAssignInput+xml',
456
            'RoleAssignmentList+json',
457
            $xml
458
        );
459
        $response = $this->sendHttpRequest($request);
460
461
        $roleAssignmentArray = json_decode($response->getBody(), true);
462
463
        self::assertHttpResponseCodeEquals($response, 200);
464
465
        return $roleAssignmentArray['RoleAssignmentList']['RoleAssignment'][0]['_href'];
466
    }
467
468
    public function provideLimitations()
469
    {
470
        return [
471
            [['identifier' => 'Section', 'href' => '/api/ezp/v2/content/sections/1']],
472
            [['identifier' => 'Subtree', 'href' => '/api/ezp/v2/content/locations/1/2/']],
473
        ];
474
    }
475
476
    /**
477
     * Covers GET /user/users/{userId}/roles/{roleId}.
478
     * @depends testAssignRoleToUser
479
     */
480
    public function testLoadRoleAssignmentForUser($roleAssignmentHref)
481
    {
482
        $response = $this->sendHttpRequest(
483
            $this->createHttpRequest('GET', $roleAssignmentHref)
484
        );
485
486
        self::assertHttpResponseCodeEquals($response, 200);
487
    }
488
489
    /**
490
     * Covers DELETE /user/users/{userId}/roles/{roleId}.
491
     * @depends testAssignRoleToUser
492
     */
493
    public function testUnassignRoleFromUser($roleAssignmentHref)
494
    {
495
        $response = $this->sendHttpRequest(
496
            $this->createHttpRequest('DELETE', $roleAssignmentHref)
497
        );
498
499
        self::assertHttpResponseCodeEquals($response, 200);
500
    }
501
502
    /**
503
     * @depends testCreateRole
504
     * Covers POST /user/groups/{groupId}/roles
505
     *
506
     * @return string role assignment href
507
     */
508
    public function testAssignRoleToUserGroup($roleHref)
509
    {
510
        $xml = <<< XML
511
<?xml version="1.0" encoding="UTF-8"?>
512
<RoleAssignInput>
513
  <Role href="{$roleHref}" media-type="application/vnd.ez.api.RoleAssignInput+xml"/>
514
  <limitation identifier="Section">
515
      <values>
516
          <ref href="/api/ezp/v2/content/sections/1" media-type="application/vnd.ez.api.Section+xml" />
517
      </values>
518
  </limitation>
519
</RoleAssignInput>
520
XML;
521
        // Assign to "Guest users" group to avoid affecting other tests
522
        $request = $this->createHttpRequest(
523
            'POST',
524
            '/api/ezp/v2/user/groups/1/5/12/roles',
525
            'RoleAssignInput+xml',
526
            'RoleAssignmentList+json',
527
            $xml
528
        );
529
530
        $response = $this->sendHttpRequest($request);
531
        $roleAssignmentArray = json_decode($response->getBody(), true);
532
533
        self::assertHttpResponseCodeEquals($response, 200);
534
535
        return $roleAssignmentArray['RoleAssignmentList']['RoleAssignment'][0]['_href'];
536
    }
537
538
    /**
539
     * Covers GET /user/groups/{groupId}/roles/{roleId}.
540
     * @depends testAssignRoleToUserGroup
541
     */
542 View Code Duplication
    public function testLoadRoleAssignmentForUserGroup($roleAssignmentHref)
543
    {
544
        $response = $this->sendHttpRequest(
545
            $request = $this->createHttpRequest('GET', $roleAssignmentHref)
546
        );
547
548
        self::markTestIncomplete('Requires that visitors are fixed (group url generation)');
549
        self::assertHttpResponseCodeEquals($response, 200);
550
    }
551
552
    /**
553
     * Covers DELETE /user/groups/{groupId}/roles/{roleId}.
554
     * @depends testAssignRoleToUserGroup
555
     */
556 View Code Duplication
    public function testUnassignRoleFromUserGroup($roleAssignmentHref)
557
    {
558
        $response = $this->sendHttpRequest(
559
            $request = $this->createHttpRequest('DELETE', $roleAssignmentHref)
560
        );
561
562
        self::markTestIncomplete('Requires that visitors are fixed (group url generation)');
563
        self::assertHttpResponseCodeEquals($response, 200);
564
    }
565
566
    /**
567
     * Covers GET /user/users/{userId}/roles.
568
     */
569
    public function testLoadRoleAssignmentsForUser()
570
    {
571
        $response = $this->sendHttpRequest(
572
            $request = $this->createHttpRequest('GET', '/api/ezp/v2/user/users/10/roles')
573
        );
574
575
        self::assertHttpResponseCodeEquals($response, 200);
576
    }
577
578
    /**
579
     * Covers GET /user/groups/{groupPath}/roles.
580
     */
581
    public function testLoadRoleAssignmentsForUserGroup()
582
    {
583
        $response = $this->sendHttpRequest(
584
            $this->createHttpRequest('GET', '/api/ezp/v2/user/groups/1/5/44/roles')
585
        );
586
587
        self::assertHttpResponseCodeEquals($response, 200);
588
    }
589
590
    /**
591
     * Covers GET /user/policies?userId={userId}.
592
     */
593
    public function testListPoliciesForUser()
594
    {
595
        $response = $this->sendHttpRequest(
596
            $this->createHttpRequest('GET', '/api/ezp/v2/user/policies?userId=10')
597
        );
598
599
        self::assertHttpResponseCodeEquals($response, 200);
600
    }
601
602
    /**
603
     * Covers DELETE /user/roles/{roleId}/policies/{policyId}.
604
     * @depends testAddPolicy
605
     */
606
    public function testDeletePolicy($policyHref)
607
    {
608
        $response = $this->sendHttpRequest(
609
            $this->createHttpRequest('DELETE', $policyHref)
610
        );
611
612
        self::assertHttpResponseCodeEquals($response, 204);
613
    }
614
615
    /**
616
     * Covers DELETE /user/roles/{roleId}/policies/{policyId}.
617
     * @depends testAddPolicyByRoleDraft
618
     */
619
    public function testRemovePolicyByRoleDraft($policyHref)
620
    {
621
        $response = $this->sendHttpRequest(
622
            $this->createHttpRequest('DELETE', $policyHref)
623
        );
624
625
        self::assertHttpResponseCodeEquals($response, 204);
626
    }
627
628
    /**
629
     * Covers DELETE /user/roles/{roleId}/policies.
630
     * @depends testCreateRole
631
     */
632
    public function testDeletePolicies($roleHref)
633
    {
634
        $response = $this->sendHttpRequest(
635
            $this->createHttpRequest('DELETE', "$roleHref/policies")
636
        );
637
638
        self::assertHttpResponseCodeEquals($response, 204);
639
    }
640
641
    /**
642
     * Covers DELETE /user/roles/{roleId}.
643
     * @depends testCreateRole
644
     */
645
    public function testDeleteRole($roleHref)
646
    {
647
        $response = $this->sendHttpRequest(
648
            $this->createHttpRequest('DELETE', $roleHref)
649
        );
650
651
        self::assertHttpResponseCodeEquals($response, 204);
652
    }
653
654
    /**
655
     * Covers PUBLISH /user/roles/{roleId}/draft.
656
     * @depends testCreateRoleDraft
657
     */
658 View Code Duplication
    public function testPublishRoleDraft($roleDraftHref)
659
    {
660
        $response = $this->sendHttpRequest(
661
            $this->createHttpRequest('PUBLISH', $roleDraftHref)
662
        );
663
664
        self::assertHttpResponseCodeEquals($response, 204);
665
        self::assertHttpResponseHasHeader(
666
            $response,
667
            'Location',
668
            '/api/ezp/v2/user/roles/' . preg_replace('/.*roles\/(\d+).*/', '$1', $roleDraftHref)
669
        );
670
    }
671
672
    /**
673
     * Covers DELETE /user/roles/{roleId}/draft.
674
     * @depends testCreateRoleDraft
675
     */
676
    public function testDeleteRoleDraft($roleDraftHref)
677
    {
678
        // we need to create a role draft first since we published the previous one in testPublishRoleDraft
679
        $roleHref = $this->testCreateRoleDraft($this->roleDraftHrefToRoleHref($roleDraftHref));
680
681
        $response = $this->sendHttpRequest(
682
            $this->createHttpRequest('DELETE', $roleHref)
683
        );
684
685
        self::assertHttpResponseCodeEquals($response, 204);
686
    }
687
688
    /**
689
     * Helper method for changing a roledraft href to a role href.
690
     *
691
     * @param string $roleDraftHref Role draft href
692
     *
693
     * @return string Role href
694
     */
695
    private function roleDraftHrefToRoleHref($roleDraftHref)
696
    {
697
        return str_replace('/draft', '', $roleDraftHref);
698
    }
699
700
    /**
701
     * Creates and publishes a role with $identifier.
702
     *
703
     * @param string $identifier
704
     *
705
     * @return string The href of the published role
706
     */
707 View Code Duplication
    private function createAndPublishRole($identifier)
708
    {
709
        $xml = <<< XML
710
<?xml version="1.0" encoding="UTF-8"?>
711
<RoleInput>
712
  <identifier>$identifier</identifier>
713
  <mainLanguageCode>eng-GB</mainLanguageCode>
714
  <names>
715
    <value languageCode="eng-GB">$identifier</value>
716
  </names>
717
  <descriptions>
718
    <value languageCode="eng-GB">$identifier description</value>
719
  </descriptions>
720
</RoleInput>
721
XML;
722
        $request = $this->createHttpRequest(
723
            'POST',
724
            '/api/ezp/v2/user/roles',
725
            'RoleInput+xml',
726
            'RoleDraft+json',
727
            $xml
728
        );
729
        $response = $this->sendHttpRequest($request);
730
731
        self::assertHttpResponseCodeEquals($response, 201);
732
        self::assertHttpResponseHasHeader($response, 'Location');
733
        $href = $response->getHeader('Location')[0];
734
735
        $this->addCreatedElement($href);
736
737
        return $href;
738
    }
739
}
740