Completed
Push — rest_role_limitation_href ( a2c048...1f459a )
by
unknown
23:30
created

RoleTest::testCreateRoleWithDraft()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 32
Code Lines 16

Duplication

Lines 32
Ratio 100 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
c 1
b 1
f 0
dl 32
loc 32
rs 8.8571
cc 1
eloc 16
nc 1
nop 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
 * @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
     * @depends      testCreateRole
414
     * @covers       POST /user/users/{userId}/roles
415
     *
416
     * @param string $roleHref
417
     * @param array $limitation
418
     *
419
     * @return string assigned role href
420
     * @dataProvider provideLimitations
421
     */
422
    public function testAssignRoleToUserWithLimitation(array $limitation, $roleHref)
423
    {
424
        $xml = <<< XML
425
<?xml version="1.0" encoding="UTF-8"?>
426
<RoleAssignInput>
427
  <Role href="{$roleHref}" media-type="application/vnd.ez.api.RoleAssignInput+xml"/>
428
  <limitation identifier="{$limitation['identifier']}">
429
      <values>
430
          <ref href="{$limitation['href']}" media-type="application/vnd.ez.api.{$limitation['identifier']}+xml" />
431
      </values>
432
  </limitation>
433
</RoleAssignInput>
434
XML;
435
436
        $request = $this->createHttpRequest(
437
            'POST',
438
            '/api/ezp/v2/user/users/10/roles',
439
            'RoleAssignInput+xml',
440
            'RoleAssignmentList+json'
441
        );
442
        $request->setContent($xml);
443
444
        $response = $this->sendHttpRequest($request);
445
        $roleAssignmentArray = json_decode($response->getContent(), true);
446
447
        self::assertHttpResponseCodeEquals($response, 200);
448
449
        return $roleAssignmentArray['RoleAssignmentList']['RoleAssignment'][0]['_href'];
450
    }
451
452
    public function provideLimitations()
453
    {
454
        return [
455
            [['identifier' => 'Section', 'href' => "/api/ezp/v2/content/sections/1"]],
456
            [['identifier' => 'Subtree', 'href' => "/content/locations/1/2"]],
457
        ];
458
    }
459
460
    /**
461
     * @covers GET /user/users/{userId}/roles/{roleId}
462
     * @depends testAssignRoleToUser
463
     */
464
    public function testLoadRoleAssignmentForUser($roleAssignmentHref)
465
    {
466
        $response = $this->sendHttpRequest(
467
            $this->createHttpRequest('GET', $roleAssignmentHref)
468
        );
469
470
        self::assertHttpResponseCodeEquals($response, 200);
471
    }
472
473
    /**
474
     * @covers DELETE /user/users/{userId}/roles/{roleId}
475
     * @depends testAssignRoleToUser
476
     */
477
    public function testUnassignRoleFromUser($roleAssignmentHref)
478
    {
479
        $response = $this->sendHttpRequest(
480
            $this->createHttpRequest('DELETE', $roleAssignmentHref)
481
        );
482
483
        self::assertHttpResponseCodeEquals($response, 200);
484
    }
485
486
    /**
487
     * @depends testCreateRole
488
     * @covers POST /user/groups/{groupId}/roles
489
     *
490
     * @return string role assignment href
491
     */
492 View Code Duplication
    public function testAssignRoleToUserGroup($roleHref)
493
    {
494
        $xml = <<< XML
495
<?xml version="1.0" encoding="UTF-8"?>
496
<RoleAssignInput>
497
  <Role href="{$roleHref}" media-type="application/vnd.ez.api.RoleAssignInput+xml"/>
498
  <limitation identifier="Section">
499
      <values>
500
          <ref href="/api/ezp/v2/content/sections/1" media-type="application/vnd.ez.api.Section+xml" />
501
      </values>
502
  </limitation>
503
</RoleAssignInput>
504
XML;
505
506
        $request = $this->createHttpRequest(
507
            'POST',
508
            '/api/ezp/v2/user/groups/1/5/44/roles',
509
            'RoleAssignInput+xml',
510
            'RoleAssignmentList+json'
511
        );
512
        $request->setContent($xml);
513
514
        $response = $this->sendHttpRequest($request);
515
        $roleAssignmentArray = json_decode($response->getContent(), true);
516
517
        self::assertHttpResponseCodeEquals($response, 200);
518
519
        return $roleAssignmentArray['RoleAssignmentList']['RoleAssignment'][0]['_href'];
520
    }
521
522
    /**
523
     * @covers GET /user/groups/{groupId}/roles/{roleId}
524
     * @depends testAssignRoleToUserGroup
525
     */
526 View Code Duplication
    public function testLoadRoleAssignmentForUserGroup($roleAssignmentHref)
527
    {
528
        $response = $this->sendHttpRequest(
529
            $request = $this->createHttpRequest('GET', $roleAssignmentHref)
530
        );
531
532
        self::markTestIncomplete('Requires that visitors are fixed (group url generation)');
533
        self::assertHttpResponseCodeEquals($response, 200);
534
    }
535
536
    /**
537
     * @covers DELETE /user/groups/{groupId}/roles/{roleId}
538
     * @depends testAssignRoleToUserGroup
539
     */
540 View Code Duplication
    public function testUnassignRoleFromUserGroup($roleAssignmentHref)
541
    {
542
        $response = $this->sendHttpRequest(
543
            $request = $this->createHttpRequest('DELETE', $roleAssignmentHref)
544
        );
545
546
        self::markTestIncomplete('Requires that visitors are fixed (group url generation)');
547
        self::assertHttpResponseCodeEquals($response, 200);
548
    }
549
550
    /**
551
     * @covers GET /user/users/{userId}/roles
552
     */
553
    public function testLoadRoleAssignmentsForUser()
554
    {
555
        $response = $this->sendHttpRequest(
556
            $request = $this->createHttpRequest('GET', '/api/ezp/v2/user/users/10/roles')
557
        );
558
559
        self::assertHttpResponseCodeEquals($response, 200);
560
    }
561
562
    /**
563
     * @covers GET /user/groups/{groupPath}/roles
564
     */
565
    public function testLoadRoleAssignmentsForUserGroup()
566
    {
567
        $response = $this->sendHttpRequest(
568
            $this->createHttpRequest('GET', '/api/ezp/v2/user/groups/1/5/44/roles')
569
        );
570
571
        self::assertHttpResponseCodeEquals($response, 200);
572
    }
573
574
    /**
575
     * @covers GET /user/policies?userId={userId}
576
     */
577
    public function testListPoliciesForUser()
578
    {
579
        $response = $this->sendHttpRequest(
580
            $this->createHttpRequest('GET', '/api/ezp/v2/user/policies?userId=10')
581
        );
582
583
        self::assertHttpResponseCodeEquals($response, 200);
584
    }
585
586
    /**
587
     * @covers DELETE /user/roles/{roleId}/policies/{policyId}
588
     * @depends testAddPolicy
589
     */
590
    public function testDeletePolicy($policyHref)
591
    {
592
        $response = $this->sendHttpRequest(
593
            $this->createHttpRequest('DELETE', $policyHref)
594
        );
595
596
        self::assertHttpResponseCodeEquals($response, 204);
597
    }
598
599
    /**
600
     * @covers DELETE /user/roles/{roleId}/policies/{policyId}
601
     * @depends testAddPolicyByRoleDraft
602
     */
603
    public function testRemovePolicyByRoleDraft($policyHref)
604
    {
605
        $response = $this->sendHttpRequest(
606
            $this->createHttpRequest('DELETE', $policyHref)
607
        );
608
609
        self::assertHttpResponseCodeEquals($response, 204);
610
    }
611
612
    /**
613
     * @covers DELETE /user/roles/{roleId}/policies
614
     * @depends testCreateRole
615
     */
616
    public function testDeletePolicies($roleHref)
617
    {
618
        $response = $this->sendHttpRequest(
619
            $this->createHttpRequest('DELETE', "$roleHref/policies")
620
        );
621
622
        self::assertHttpResponseCodeEquals($response, 204);
623
    }
624
625
    /**
626
     * @covers DELETE /user/roles/{roleId}
627
     * @depends testCreateRole
628
     */
629
    public function testDeleteRole($roleHref)
630
    {
631
        $response = $this->sendHttpRequest(
632
            $this->createHttpRequest('DELETE', $roleHref)
633
        );
634
635
        self::assertHttpResponseCodeEquals($response, 204);
636
    }
637
638
    /**
639
     * @covers PUBLISH /user/roles/{roleId}/draft
640
     * @depends testCreateRoleDraft
641
     */
642
    public function testPublishRoleDraft($roleDraftHref)
643
    {
644
        $response = $this->sendHttpRequest(
645
            $this->createHttpRequest('PUBLISH', $roleDraftHref)
646
        );
647
648
        self::assertHttpResponseCodeEquals($response, 201);
649
    }
650
651
    /**
652
     * @covers DELETE /user/roles/{roleId}/draft
653
     * @depends testCreateRoleDraft
654
     */
655
    public function testDeleteRoleDraft($roleDraftHref)
656
    {
657
        // we need to create a role draft first since we published the previous one in testPublishRoleDraft
658
        $roleHref = $this->testCreateRoleDraft($this->roleDraftHrefToRoleHref($roleDraftHref));
659
660
        $response = $this->sendHttpRequest(
661
            $this->createHttpRequest('DELETE', $roleHref)
662
        );
663
664
        self::assertHttpResponseCodeEquals($response, 204);
665
    }
666
667
    /**
668
     * Helper method for changing a roledraft href to a role href.
669
     *
670
     * @param string $roleDraftHref Role draft href
671
     *
672
     * @return string Role href
673
     */
674
    private function roleDraftHrefToRoleHref($roleDraftHref)
675
    {
676
        return str_replace('/draft', '', $roleDraftHref);
677
    }
678
}
679