Completed
Push — spi_getname_change ( 9b3757...5d4921 )
by André
23:58
created

RoleTest::createAndPublishRole()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 29
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 29
rs 8.8571
cc 1
eloc 17
nc 1
nop 1
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
 * @version //autogentag//
10
 */
11
namespace eZ\Bundle\EzPublishRestBundle\Tests\Functional;
12
13
use eZ\Bundle\EzPublishRestBundle\Tests\Functional\TestCase as RESTFunctionalTestCase;
14
use eZ\Publish\API\Repository\Values\User\Limitation;
15
16
class RoleTest extends RESTFunctionalTestCase
17
{
18
    /**
19
     * @covers POST /user/roles
20
     *
21
     * BC compatible mode, will return a role
22
     *
23
     * @return string The created role href
24
     */
25 View Code Duplication
    public function testCreateRole()
26
    {
27
        $xml = <<< XML
28
<?xml version="1.0" encoding="UTF-8"?>
29
<RoleInput>
30
  <identifier>testCreateRole</identifier>
31
  <mainLanguageCode>eng-GB</mainLanguageCode>
32
  <names>
33
    <value languageCode="eng-GB">testCreateRole</value>
34
  </names>
35
  <descriptions>
36
    <value languageCode="eng-GB">testCreateRole description</value>
37
  </descriptions>
38
</RoleInput>
39
XML;
40
        $request = $this->createHttpRequest('POST', '/api/ezp/v2/user/roles', 'RoleInput+xml', 'Role+json');
41
        $request->setContent($xml);
42
        $response = $this->sendHttpRequest($request);
43
44
        self::assertHttpResponseCodeEquals($response, 201);
45
        self::assertHttpResponseHasHeader($response, 'Location');
46
47
        $href = $response->getHeader('Location');
48
        $this->addCreatedElement($href);
49
50
        return $href;
51
    }
52
53
    /**
54
     * @covers POST /user/roles
55
     *
56
     * BC incompatible mode, will return a role draft
57
     *
58
     * @return string The created role draft href
59
     */
60 View Code Duplication
    public function testCreateRoleWithDraft()
61
    {
62
        $xml = <<< XML
63
<?xml version="1.0" encoding="UTF-8"?>
64
<RoleInput>
65
  <identifier>testCreateRoleDraft</identifier>
66
  <mainLanguageCode>eng-GB</mainLanguageCode>
67
  <names>
68
    <value languageCode="eng-GB">testCreateRoleDraft</value>
69
  </names>
70
  <descriptions>
71
    <value languageCode="eng-GB">testCreateRoleDraft description</value>
72
  </descriptions>
73
</RoleInput>
74
XML;
75
        $request = $this->createHttpRequest(
76
            'POST',
77
            '/api/ezp/v2/user/roles?publish=false',
78
            'RoleInput+xml',
79
            'RoleDraft+json'
80
        );
81
        $request->setContent($xml);
82
        $response = $this->sendHttpRequest($request);
83
84
        self::assertHttpResponseCodeEquals($response, 201);
85
        self::assertHttpResponseHasHeader($response, 'Location');
86
87
        $href = $response->getHeader('Location');
88
        $this->addCreatedElement($href);
89
90
        return $href . '/draft';
91
    }
92
93
    /**
94
     * @covers GET /user/roles
95
     */
96
    public function testListRoles()
97
    {
98
        $response = $this->sendHttpRequest(
99
            $this->createHttpRequest('GET', '/api/ezp/v2/user/roles')
100
        );
101
102
        self::assertHttpResponseCodeEquals($response, 200);
103
    }
104
105
    /**
106
     * @depends testCreateRole
107
     * @covers GET /user/roles/{roleId}
108
     */
109
    public function testLoadRole($roleHref)
110
    {
111
        $response = $this->sendHttpRequest(
112
            $this->createHttpRequest('GET', $roleHref)
113
        );
114
115
        self::assertHttpResponseCodeEquals($response, 200);
116
    }
117
118
    /**
119
     * @depends testCreateRole
120
     * @covers POST /user/roles/{roleId}
121
     *
122
     * @return string The created role draft href
123
     */
124 View Code Duplication
    public function testCreateRoleDraft($roleHref)
125
    {
126
        $xml = <<< XML
127
<?xml version="1.0" encoding="UTF-8"?>
128
<RoleInput>
129
  <identifier>testCreateRoleDraft</identifier>
130
  <mainLanguageCode>eng-GB</mainLanguageCode>
131
  <names>
132
    <value languageCode="eng-GB">testCreateRoleDraft</value>
133
  </names>
134
  <descriptions>
135
    <value languageCode="eng-GB">testCreateRoleDraft description</value>
136
  </descriptions>
137
</RoleInput>
138
XML;
139
        $request = $this->createHttpRequest(
140
            'POST',
141
            $roleHref,
142
            'RoleInput+xml',
143
            'RoleDraft+json'
144
        );
145
        $request->setContent($xml);
146
        $response = $this->sendHttpRequest($request);
147
148
        self::assertHttpResponseCodeEquals($response, 201);
149
        self::assertHttpResponseHasHeader($response, 'Location');
150
151
        $href = $response->getHeader('Location');
152
        $this->addCreatedElement($href);
153
154
        return $href . '/draft';
155
    }
156
157
    /**
158
     * @depends testCreateRoleDraft
159
     * @covers GET /user/roles/{roleId}/draft
160
     */
161
    public function testLoadRoleDraft($roleDraftHref)
162
    {
163
        $response = $this->sendHttpRequest(
164
            $this->createHttpRequest('GET', $roleDraftHref)
165
        );
166
167
        self::assertHttpResponseCodeEquals($response, 200);
168
    }
169
170
    /**
171
     * @depends testCreateRole
172
     * @covers PATCH /user/roles/{roleId}
173
     */
174 View Code Duplication
    public function testUpdateRole($roleHref)
175
    {
176
        $xml = <<< XML
177
<?xml version="1.0" encoding="UTF-8"?>
178
<RoleInput>
179
  <identifier>testUpdateRole</identifier>
180
  <mainLanguageCode>eng-GB</mainLanguageCode>
181
  <names>
182
    <value languageCode="eng-GB">testUpdateRole</value>
183
  </names>
184
  <descriptions>
185
    <value languageCode="eng-GB">testUpdateRole description</value>
186
  </descriptions>
187
</RoleInput>
188
XML;
189
190
        $request = $this->createHttpRequest('PATCH', $roleHref, 'RoleInput+xml', 'Role+json');
191
        $request->setContent($xml);
192
        $response = $this->sendHttpRequest($request);
193
194
        // @todo Fix failure Notice: Trying to get property of non-object in \/home\/bertrand\/www\/ezpublish-kernel\/eZ\/Publish\/Core\/Persistence\/Cache\/UserHandler.php line 174
195
        self::assertHttpResponseCodeEquals($response, 200);
196
    }
197
198
    /**
199
     * @depends testCreateRoleDraft
200
     * @covers PATCH /user/roles/{roleId}/draft
201
     */
202 View Code Duplication
    public function testUpdateRoleDraft($roleDraftHref)
203
    {
204
        $xml = <<< XML
205
<?xml version="1.0" encoding="UTF-8"?>
206
<RoleInput>
207
  <identifier>testUpdateRoleDraft</identifier>
208
  <mainLanguageCode>eng-GB</mainLanguageCode>
209
  <names>
210
    <value languageCode="eng-GB">testUpdateRoleDraft</value>
211
  </names>
212
  <descriptions>
213
    <value languageCode="eng-GB">testUpdateRoleDraft description</value>
214
  </descriptions>
215
</RoleInput>
216
XML;
217
218
        $request = $this->createHttpRequest('PATCH', $roleDraftHref, 'RoleInput+xml', 'RoleDraft+json');
219
        $request->setContent($xml);
220
        $response = $this->sendHttpRequest($request);
221
222
        self::assertHttpResponseCodeEquals($response, 200);
223
    }
224
225
    /**
226
     * @covers POST /user/roles/{roleId}/policies
227
     * @depends testCreateRole
228
     *
229
     * @return string The created policy href
230
     */
231 View Code Duplication
    public function testAddPolicy($roleHref)
232
    {
233
        // @todo Error in Resource URL in spec @ https://github.com/ezsystems/ezpublish-kernel/blob/master/doc/specifications/rest/REST-API-V2.rst#151213create-policy
234
        $xml = <<< XML
235
<?xml version="1.0" encoding="UTF-8"?>
236
<PolicyCreate>
237
  <module>content</module>
238
  <function>create</function>
239
  <limitations>
240
    <limitation identifier="Class">
241
      <values>
242
        <ref href="2"/>
243
      </values>
244
    </limitation>
245
  </limitations>
246
</PolicyCreate>
247
XML;
248
        $request = $this->createHttpRequest('POST', "$roleHref/policies", 'PolicyCreate+xml', 'Policy+json');
249
        $request->setContent($xml);
250
251
        $response = $this->sendHttpRequest($request);
252
        self::assertHttpResponseCodeEquals($response, 201);
253
        self::assertHttpResponseHasHeader($response, 'Location');
254
255
        $href = $response->getHeader('Location');
256
        $this->addCreatedElement($href);
257
258
        return $href;
259
    }
260
261
    /**
262
     * @covers POST /user/roles/{roleId}/policies
263
     * @depends testCreateRoleDraft
264
     *
265
     * @return string The created policy href
266
     */
267 View Code Duplication
    public function testAddPolicyByRoleDraft($roleDraftHref)
268
    {
269
        $xml = <<< XML
270
<?xml version="1.0" encoding="UTF-8"?>
271
<PolicyCreate>
272
  <module>content</module>
273
  <function>create</function>
274
  <limitations>
275
    <limitation identifier="Class">
276
      <values>
277
        <ref href="1"/>
278
      </values>
279
    </limitation>
280
  </limitations>
281
</PolicyCreate>
282
XML;
283
        $request = $this->createHttpRequest(
284
            'POST',
285
            $this->roleDraftHrefToRoleHref($roleDraftHref) . '/policies',
286
            'PolicyCreate+xml',
287
            'Policy+json'
288
        );
289
        $request->setContent($xml);
290
291
        $response = $this->sendHttpRequest($request);
292
        self::assertHttpResponseCodeEquals($response, 201);
293
        self::assertHttpResponseHasHeader($response, 'Location');
294
295
        $href = $response->getHeader('Location');
296
        $this->addCreatedElement($href);
297
298
        return $href;
299
    }
300
301
    /**
302
     * @covers GET /user/roles/{roleId}/policies/{policyId}
303
     * @depends testAddPolicy
304
     */
305
    public function testLoadPolicy($policyHref)
306
    {
307
        $response = $this->sendHttpRequest(
308
            $this->createHttpRequest('GET', $policyHref)
309
        );
310
311
        self::assertHttpResponseCodeEquals($response, 200);
312
    }
313
314
    /**
315
     * @covers GET /user/roles/{roleId}/policies
316
     * @depends testCreateRole
317
     */
318
    public function testLoadPolicies($roleHref)
319
    {
320
        $response = $this->sendHttpRequest(
321
            $this->createHttpRequest('GET', "$roleHref/policies")
322
        );
323
324
        self::assertHttpResponseCodeEquals($response, 200);
325
    }
326
327
    /**
328
     * @covers PATCH /user/roles/{roleId}/policies/{policyId}
329
     * @depends testAddPolicy
330
     */
331 View Code Duplication
    public function testUpdatePolicy($policyHref)
332
    {
333
        $xml = <<< XML
334
<?xml version="1.0" encoding="UTF-8"?>
335
<PolicyUpdate>
336
  <limitations>
337
    <limitation identifier="Class">
338
      <values>
339
        <ref href="1"/>
340
      </values>
341
    </limitation>
342
  </limitations>
343
</PolicyUpdate>
344
XML;
345
346
        $request = $this->createHttpRequest('PATCH', $policyHref, 'PolicyUpdate+xml', 'Policy+json');
347
        $request->setContent($xml);
348
        $response = $this->sendHttpRequest($request);
349
350
        self::assertHttpResponseCodeEquals($response, 200);
351
    }
352
353
    /**
354
     * @covers PATCH /user/roles/{roleId}/policies/{policyId}
355
     * @depends testAddPolicyByRoleDraft
356
     */
357 View Code Duplication
    public function testUpdatePolicyByRoleDraft($policyHref)
358
    {
359
        $xml = <<< XML
360
<?xml version="1.0" encoding="UTF-8"?>
361
<PolicyUpdate>
362
  <limitations>
363
    <limitation identifier="Class">
364
      <values>
365
        <ref href="1"/>
366
      </values>
367
    </limitation>
368
  </limitations>
369
</PolicyUpdate>
370
XML;
371
372
        $request = $this->createHttpRequest('PATCH', $policyHref, 'PolicyUpdate+xml', 'Policy+json');
373
        $request->setContent($xml);
374
        $response = $this->sendHttpRequest($request);
375
376
        self::assertHttpResponseCodeEquals($response, 200);
377
    }
378
379
    /**
380
     * @depends testCreateRole
381
     * @covers POST /user/users/{userId}/roles
382
     *
383
     * @return string assigned role href
384
     *
385
     * @todo stop using the anonymous user, this is dangerous...
386
     */
387 View Code Duplication
    public function testAssignRoleToUser($roleHref)
388
    {
389
        $xml = <<< XML
390
<?xml version="1.0" encoding="UTF-8"?>
391
<RoleAssignInput>
392
  <Role href="{$roleHref}" media-type="application/vnd.ez.api.RoleAssignInput+xml"/>
393
</RoleAssignInput>
394
XML;
395
396
        $request = $this->createHttpRequest(
397
            'POST',
398
            '/api/ezp/v2/user/users/10/roles',
399
            'RoleAssignInput+xml',
400
            'RoleAssignmentList+json'
401
        );
402
        $request->setContent($xml);
403
404
        $response = $this->sendHttpRequest($request);
405
        $roleAssignmentArray = json_decode($response->getContent(), true);
406
407
        self::assertHttpResponseCodeEquals($response, 200);
408
409
        return $roleAssignmentArray['RoleAssignmentList']['RoleAssignment'][0]['_href'];
410
    }
411
412
    /**
413
     * @covers       POST /user/users/{userId}/roles
414
     *
415
     * @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...
416
     * @param array $limitation
417
     *
418
     * @return string assigned role href
419
     * @dataProvider provideLimitations
420
     */
421
    public function testAssignRoleToUserWithLimitation(array $limitation)
422
    {
423
        $roleHref = $this->createAndPublishRole(__METHOD__ . '_' . $limitation['identifier']);
424
425
        $xml = <<< XML
426
<?xml version="1.0" encoding="UTF-8"?>
427
<RoleAssignInput>
428
  <Role href="{$roleHref}" media-type="application/vnd.ez.api.RoleAssignInput+xml"/>
429
  <limitation identifier="{$limitation['identifier']}">
430
      <values>
431
          <ref href="{$limitation['href']}" media-type="application/vnd.ez.api.{$limitation['identifier']}+xml" />
432
      </values>
433
  </limitation>
434
</RoleAssignInput>
435
XML;
436
437
        $request = $this->createHttpRequest(
438
            'POST',
439
            '/api/ezp/v2/user/users/10/roles',
440
            'RoleAssignInput+xml',
441
            'RoleAssignmentList+json'
442
        );
443
        $request->setContent($xml);
444
445
        $response = $this->sendHttpRequest($request);
446
        $roleAssignmentArray = json_decode($response->getContent(), true);
447
448
        self::assertHttpResponseCodeEquals($response, 200);
449
450
        return $roleAssignmentArray['RoleAssignmentList']['RoleAssignment'][0]['_href'];
451
    }
452
453
    public function provideLimitations()
454
    {
455
        return [
456
            [['identifier' => 'Section', 'href' => '/api/ezp/v2/content/sections/1']],
457
            [['identifier' => 'Subtree', 'href' => '/api/ezp/v2/content/locations/1/2']],
458
        ];
459
    }
460
461
    /**
462
     * @covers GET /user/users/{userId}/roles/{roleId}
463
     * @depends testAssignRoleToUser
464
     */
465
    public function testLoadRoleAssignmentForUser($roleAssignmentHref)
466
    {
467
        $response = $this->sendHttpRequest(
468
            $this->createHttpRequest('GET', $roleAssignmentHref)
469
        );
470
471
        self::assertHttpResponseCodeEquals($response, 200);
472
    }
473
474
    /**
475
     * @covers DELETE /user/users/{userId}/roles/{roleId}
476
     * @depends testAssignRoleToUser
477
     */
478
    public function testUnassignRoleFromUser($roleAssignmentHref)
479
    {
480
        $response = $this->sendHttpRequest(
481
            $this->createHttpRequest('DELETE', $roleAssignmentHref)
482
        );
483
484
        self::assertHttpResponseCodeEquals($response, 200);
485
    }
486
487
    /**
488
     * @depends testCreateRole
489
     * @covers POST /user/groups/{groupId}/roles
490
     *
491
     * @return string role assignment href
492
     */
493 View Code Duplication
    public function testAssignRoleToUserGroup($roleHref)
494
    {
495
        $xml = <<< XML
496
<?xml version="1.0" encoding="UTF-8"?>
497
<RoleAssignInput>
498
  <Role href="{$roleHref}" media-type="application/vnd.ez.api.RoleAssignInput+xml"/>
499
  <limitation identifier="Section">
500
      <values>
501
          <ref href="/api/ezp/v2/content/sections/1" media-type="application/vnd.ez.api.Section+xml" />
502
      </values>
503
  </limitation>
504
</RoleAssignInput>
505
XML;
506
507
        $request = $this->createHttpRequest(
508
            'POST',
509
            '/api/ezp/v2/user/groups/1/5/44/roles',
510
            'RoleAssignInput+xml',
511
            'RoleAssignmentList+json'
512
        );
513
        $request->setContent($xml);
514
515
        $response = $this->sendHttpRequest($request);
516
        $roleAssignmentArray = json_decode($response->getContent(), true);
517
518
        self::assertHttpResponseCodeEquals($response, 200);
519
520
        return $roleAssignmentArray['RoleAssignmentList']['RoleAssignment'][0]['_href'];
521
    }
522
523
    /**
524
     * @covers GET /user/groups/{groupId}/roles/{roleId}
525
     * @depends testAssignRoleToUserGroup
526
     */
527 View Code Duplication
    public function testLoadRoleAssignmentForUserGroup($roleAssignmentHref)
528
    {
529
        $response = $this->sendHttpRequest(
530
            $request = $this->createHttpRequest('GET', $roleAssignmentHref)
531
        );
532
533
        self::markTestIncomplete('Requires that visitors are fixed (group url generation)');
534
        self::assertHttpResponseCodeEquals($response, 200);
535
    }
536
537
    /**
538
     * @covers DELETE /user/groups/{groupId}/roles/{roleId}
539
     * @depends testAssignRoleToUserGroup
540
     */
541 View Code Duplication
    public function testUnassignRoleFromUserGroup($roleAssignmentHref)
542
    {
543
        $response = $this->sendHttpRequest(
544
            $request = $this->createHttpRequest('DELETE', $roleAssignmentHref)
545
        );
546
547
        self::markTestIncomplete('Requires that visitors are fixed (group url generation)');
548
        self::assertHttpResponseCodeEquals($response, 200);
549
    }
550
551
    /**
552
     * @covers GET /user/users/{userId}/roles
553
     */
554
    public function testLoadRoleAssignmentsForUser()
555
    {
556
        $response = $this->sendHttpRequest(
557
            $request = $this->createHttpRequest('GET', '/api/ezp/v2/user/users/10/roles')
558
        );
559
560
        self::assertHttpResponseCodeEquals($response, 200);
561
    }
562
563
    /**
564
     * @covers GET /user/groups/{groupPath}/roles
565
     */
566
    public function testLoadRoleAssignmentsForUserGroup()
567
    {
568
        $response = $this->sendHttpRequest(
569
            $this->createHttpRequest('GET', '/api/ezp/v2/user/groups/1/5/44/roles')
570
        );
571
572
        self::assertHttpResponseCodeEquals($response, 200);
573
    }
574
575
    /**
576
     * @covers GET /user/policies?userId={userId}
577
     */
578
    public function testListPoliciesForUser()
579
    {
580
        $response = $this->sendHttpRequest(
581
            $this->createHttpRequest('GET', '/api/ezp/v2/user/policies?userId=10')
582
        );
583
584
        self::assertHttpResponseCodeEquals($response, 200);
585
    }
586
587
    /**
588
     * @covers DELETE /user/roles/{roleId}/policies/{policyId}
589
     * @depends testAddPolicy
590
     */
591
    public function testDeletePolicy($policyHref)
592
    {
593
        $response = $this->sendHttpRequest(
594
            $this->createHttpRequest('DELETE', $policyHref)
595
        );
596
597
        self::assertHttpResponseCodeEquals($response, 204);
598
    }
599
600
    /**
601
     * @covers DELETE /user/roles/{roleId}/policies/{policyId}
602
     * @depends testAddPolicyByRoleDraft
603
     */
604
    public function testRemovePolicyByRoleDraft($policyHref)
605
    {
606
        $response = $this->sendHttpRequest(
607
            $this->createHttpRequest('DELETE', $policyHref)
608
        );
609
610
        self::assertHttpResponseCodeEquals($response, 204);
611
    }
612
613
    /**
614
     * @covers DELETE /user/roles/{roleId}/policies
615
     * @depends testCreateRole
616
     */
617
    public function testDeletePolicies($roleHref)
618
    {
619
        $response = $this->sendHttpRequest(
620
            $this->createHttpRequest('DELETE', "$roleHref/policies")
621
        );
622
623
        self::assertHttpResponseCodeEquals($response, 204);
624
    }
625
626
    /**
627
     * @covers DELETE /user/roles/{roleId}
628
     * @depends testCreateRole
629
     */
630
    public function testDeleteRole($roleHref)
631
    {
632
        $response = $this->sendHttpRequest(
633
            $this->createHttpRequest('DELETE', $roleHref)
634
        );
635
636
        self::assertHttpResponseCodeEquals($response, 204);
637
    }
638
639
    /**
640
     * @covers PUBLISH /user/roles/{roleId}/draft
641
     * @depends testCreateRoleDraft
642
     */
643 View Code Duplication
    public function testPublishRoleDraft($roleDraftHref)
644
    {
645
        $response = $this->sendHttpRequest(
646
            $this->createHttpRequest('PUBLISH', $roleDraftHref)
647
        );
648
649
        self::assertHttpResponseCodeEquals($response, 204);
650
        self::assertHttpResponseHasHeader(
651
            $response,
652
            'Location',
653
            '/api/ezp/v2/user/roles/' . preg_replace('/.*roles\/(\d+).*/', '$1', $roleDraftHref)
654
        );
655
    }
656
657
    /**
658
     * @covers DELETE /user/roles/{roleId}/draft
659
     * @depends testCreateRoleDraft
660
     */
661
    public function testDeleteRoleDraft($roleDraftHref)
662
    {
663
        // we need to create a role draft first since we published the previous one in testPublishRoleDraft
664
        $roleHref = $this->testCreateRoleDraft($this->roleDraftHrefToRoleHref($roleDraftHref));
665
666
        $response = $this->sendHttpRequest(
667
            $this->createHttpRequest('DELETE', $roleHref)
668
        );
669
670
        self::assertHttpResponseCodeEquals($response, 204);
671
    }
672
673
    /**
674
     * Helper method for changing a roledraft href to a role href.
675
     *
676
     * @param string $roleDraftHref Role draft href
677
     *
678
     * @return string Role href
679
     */
680
    private function roleDraftHrefToRoleHref($roleDraftHref)
681
    {
682
        return str_replace('/draft', '', $roleDraftHref);
683
    }
684
685
    /**
686
     * Creates and publishes a role with $identifier.
687
     *
688
     * @param string $identifier
689
     *
690
     * @return string The href of the published role
691
     */
692
    private function createAndPublishRole($identifier)
693
    {
694
        $xml = <<< XML
695
<?xml version="1.0" encoding="UTF-8"?>
696
<RoleInput>
697
  <identifier>$identifier</identifier>
698
  <mainLanguageCode>eng-GB</mainLanguageCode>
699
  <names>
700
    <value languageCode="eng-GB">$identifier</value>
701
  </names>
702
  <descriptions>
703
    <value languageCode="eng-GB">$identifier description</value>
704
  </descriptions>
705
</RoleInput>
706
XML;
707
        $request = $this->createHttpRequest(
708
            'POST',
709
            '/api/ezp/v2/user/roles',
710
            'RoleInput+xml',
711
            'RoleDraft+json'
712
        );
713
        $request->setContent($xml);
714
        $response = $this->sendHttpRequest($request);
715
716
        self::assertHttpResponseCodeEquals($response, 201);
717
        self::assertHttpResponseHasHeader($response, 'Location');
718
719
        return $response->getHeader('Location');
720
    }
721
}
722