Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
1 | <?php |
||
15 | class RoleTest extends RESTFunctionalTestCase |
||
16 | { |
||
17 | /** |
||
18 | * @covers POST /user/roles |
||
19 | * |
||
20 | * BC compatible mode, will return a role |
||
21 | * |
||
22 | * @return string The created role href |
||
23 | */ |
||
24 | View Code Duplication | public function testCreateRole() |
|
25 | { |
||
26 | $xml = <<< XML |
||
27 | <?xml version="1.0" encoding="UTF-8"?> |
||
28 | <RoleInput> |
||
29 | <identifier>testCreateRole</identifier> |
||
30 | <mainLanguageCode>eng-GB</mainLanguageCode> |
||
31 | <names> |
||
32 | <value languageCode="eng-GB">testCreateRole</value> |
||
33 | </names> |
||
34 | <descriptions> |
||
35 | <value languageCode="eng-GB">testCreateRole description</value> |
||
36 | </descriptions> |
||
37 | </RoleInput> |
||
38 | XML; |
||
39 | $request = $this->createHttpRequest('POST', '/api/ezp/v2/user/roles', 'RoleInput+xml', 'Role+json'); |
||
40 | $request->setContent($xml); |
||
41 | $response = $this->sendHttpRequest($request); |
||
42 | |||
43 | self::assertHttpResponseCodeEquals($response, 201); |
||
44 | self::assertHttpResponseHasHeader($response, 'Location'); |
||
45 | |||
46 | $href = $response->getHeader('Location'); |
||
47 | $this->addCreatedElement($href); |
||
48 | |||
49 | return $href; |
||
50 | } |
||
51 | |||
52 | /** |
||
53 | * @covers POST /user/roles |
||
54 | * |
||
55 | * BC incompatible mode, will return a role draft |
||
56 | * |
||
57 | * @return string The created role draft href |
||
58 | */ |
||
59 | View Code Duplication | public function testCreateRoleWithDraft() |
|
91 | |||
92 | /** |
||
93 | * @covers GET /user/roles |
||
94 | */ |
||
95 | public function testListRoles() |
||
103 | |||
104 | /** |
||
105 | * @depends testCreateRole |
||
106 | * @covers GET /user/roles/{roleId} |
||
107 | */ |
||
108 | public function testLoadRole($roleHref) |
||
116 | |||
117 | /** |
||
118 | * @depends testCreateRole |
||
119 | * @covers POST /user/roles/{roleId} |
||
120 | * |
||
121 | * @return string The created role draft href |
||
122 | */ |
||
123 | View Code Duplication | public function testCreateRoleDraft($roleHref) |
|
155 | |||
156 | /** |
||
157 | * @depends testCreateRoleDraft |
||
158 | * @covers GET /user/roles/{roleId}/draft |
||
159 | */ |
||
160 | public function testLoadRoleDraft($roleDraftHref) |
||
168 | |||
169 | /** |
||
170 | * @depends testCreateRole |
||
171 | * @covers PATCH /user/roles/{roleId} |
||
172 | */ |
||
173 | View Code Duplication | public function testUpdateRole($roleHref) |
|
174 | { |
||
175 | $xml = <<< XML |
||
176 | <?xml version="1.0" encoding="UTF-8"?> |
||
177 | <RoleInput> |
||
178 | <identifier>testUpdateRole</identifier> |
||
179 | <mainLanguageCode>eng-GB</mainLanguageCode> |
||
180 | <names> |
||
181 | <value languageCode="eng-GB">testUpdateRole</value> |
||
182 | </names> |
||
183 | <descriptions> |
||
184 | <value languageCode="eng-GB">testUpdateRole description</value> |
||
185 | </descriptions> |
||
186 | </RoleInput> |
||
187 | XML; |
||
188 | |||
189 | $request = $this->createHttpRequest('PATCH', $roleHref, 'RoleInput+xml', 'Role+json'); |
||
190 | $request->setContent($xml); |
||
191 | $response = $this->sendHttpRequest($request); |
||
192 | |||
193 | // @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 |
||
194 | self::assertHttpResponseCodeEquals($response, 200); |
||
195 | } |
||
196 | |||
197 | /** |
||
198 | * @depends testCreateRoleDraft |
||
199 | * @covers PATCH /user/roles/{roleId}/draft |
||
200 | */ |
||
201 | View Code Duplication | public function testUpdateRoleDraft($roleDraftHref) |
|
202 | { |
||
203 | $xml = <<< XML |
||
204 | <?xml version="1.0" encoding="UTF-8"?> |
||
205 | <RoleInput> |
||
206 | <identifier>testUpdateRoleDraft</identifier> |
||
207 | <mainLanguageCode>eng-GB</mainLanguageCode> |
||
208 | <names> |
||
209 | <value languageCode="eng-GB">testUpdateRoleDraft</value> |
||
210 | </names> |
||
211 | <descriptions> |
||
212 | <value languageCode="eng-GB">testUpdateRoleDraft description</value> |
||
213 | </descriptions> |
||
214 | </RoleInput> |
||
215 | XML; |
||
216 | |||
217 | $request = $this->createHttpRequest('PATCH', $roleDraftHref, 'RoleInput+xml', 'RoleDraft+json'); |
||
218 | $request->setContent($xml); |
||
219 | $response = $this->sendHttpRequest($request); |
||
220 | |||
221 | self::assertHttpResponseCodeEquals($response, 200); |
||
222 | } |
||
223 | |||
224 | /** |
||
225 | * @covers POST /user/roles/{roleId}/policies |
||
226 | * @depends testCreateRole |
||
227 | * |
||
228 | * @return string The created policy href |
||
229 | */ |
||
230 | View Code Duplication | public function testAddPolicy($roleHref) |
|
259 | |||
260 | /** |
||
261 | * @covers POST /user/roles/{roleId}/policies |
||
262 | * @depends testCreateRoleDraft |
||
263 | * |
||
264 | * @return string The created policy href |
||
265 | */ |
||
266 | View Code Duplication | public function testAddPolicyByRoleDraft($roleDraftHref) |
|
299 | |||
300 | /** |
||
301 | * @covers GET /user/roles/{roleId}/policies/{policyId} |
||
302 | * @depends testAddPolicy |
||
303 | */ |
||
304 | public function testLoadPolicy($policyHref) |
||
312 | |||
313 | /** |
||
314 | * @covers GET /user/roles/{roleId}/policies |
||
315 | * @depends testCreateRole |
||
316 | */ |
||
317 | public function testLoadPolicies($roleHref) |
||
325 | |||
326 | /** |
||
327 | * @covers PATCH /user/roles/{roleId}/policies/{policyId} |
||
328 | * @depends testAddPolicy |
||
329 | */ |
||
330 | View Code Duplication | public function testUpdatePolicy($policyHref) |
|
331 | { |
||
332 | $xml = <<< XML |
||
333 | <?xml version="1.0" encoding="UTF-8"?> |
||
334 | <PolicyUpdate> |
||
335 | <limitations> |
||
336 | <limitation identifier="Class"> |
||
337 | <values> |
||
338 | <ref href="1"/> |
||
339 | </values> |
||
340 | </limitation> |
||
341 | </limitations> |
||
342 | </PolicyUpdate> |
||
343 | XML; |
||
344 | |||
345 | $request = $this->createHttpRequest('PATCH', $policyHref, 'PolicyUpdate+xml', 'Policy+json'); |
||
346 | $request->setContent($xml); |
||
347 | $response = $this->sendHttpRequest($request); |
||
348 | |||
349 | self::assertHttpResponseCodeEquals($response, 200); |
||
350 | } |
||
351 | |||
352 | /** |
||
353 | * @covers PATCH /user/roles/{roleId}/policies/{policyId} |
||
354 | * @depends testAddPolicyByRoleDraft |
||
355 | */ |
||
356 | View Code Duplication | public function testUpdatePolicyByRoleDraft($policyHref) |
|
357 | { |
||
358 | $xml = <<< XML |
||
359 | <?xml version="1.0" encoding="UTF-8"?> |
||
360 | <PolicyUpdate> |
||
361 | <limitations> |
||
362 | <limitation identifier="Class"> |
||
363 | <values> |
||
364 | <ref href="1"/> |
||
365 | </values> |
||
366 | </limitation> |
||
367 | </limitations> |
||
368 | </PolicyUpdate> |
||
369 | XML; |
||
370 | |||
371 | $request = $this->createHttpRequest('PATCH', $policyHref, 'PolicyUpdate+xml', 'Policy+json'); |
||
372 | $request->setContent($xml); |
||
373 | $response = $this->sendHttpRequest($request); |
||
374 | |||
375 | self::assertHttpResponseCodeEquals($response, 200); |
||
376 | } |
||
377 | |||
378 | /** |
||
379 | * @depends testCreateRole |
||
380 | * @covers POST /user/users/{userId}/roles |
||
381 | * |
||
382 | * @return string assigned role href |
||
383 | * |
||
384 | * @todo stop using the anonymous user, this is dangerous... |
||
385 | */ |
||
386 | View Code Duplication | public function testAssignRoleToUser($roleHref) |
|
416 | |||
417 | /** |
||
418 | * @covers GET /user/users/{userId}/roles/{roleId} |
||
419 | * @depends testAssignRoleToUser |
||
420 | */ |
||
421 | public function testLoadRoleAssignmentForUser($roleAssignmentHref) |
||
429 | |||
430 | /** |
||
431 | * @covers DELETE /user/users/{userId}/roles/{roleId} |
||
432 | * @depends testAssignRoleToUser |
||
433 | */ |
||
434 | public function testUnassignRoleFromUser($roleAssignmentHref) |
||
442 | |||
443 | /** |
||
444 | * @depends testCreateRole |
||
445 | * @covers POST /user/groups/{groupId}/roles |
||
446 | * |
||
447 | * @return string role assignment href |
||
448 | */ |
||
449 | View Code Duplication | public function testAssignRoleToUserGroup($roleHref) |
|
479 | |||
480 | /** |
||
481 | * @covers GET /user/groups/{groupId}/roles/{roleId} |
||
482 | * @depends testAssignRoleToUserGroup |
||
483 | */ |
||
484 | View Code Duplication | public function testLoadRoleAssignmentForUserGroup($roleAssignmentHref) |
|
493 | |||
494 | /** |
||
495 | * @covers DELETE /user/groups/{groupId}/roles/{roleId} |
||
496 | * @depends testAssignRoleToUserGroup |
||
497 | */ |
||
498 | View Code Duplication | public function testUnassignRoleFromUserGroup($roleAssignmentHref) |
|
507 | |||
508 | /** |
||
509 | * @covers GET /user/users/{userId}/roles |
||
510 | */ |
||
511 | public function testLoadRoleAssignmentsForUser() |
||
519 | |||
520 | /** |
||
521 | * @covers GET /user/groups/{groupPath}/roles |
||
522 | */ |
||
523 | public function testLoadRoleAssignmentsForUserGroup() |
||
531 | |||
532 | /** |
||
533 | * @covers GET /user/policies?userId={userId} |
||
534 | */ |
||
535 | public function testListPoliciesForUser() |
||
543 | |||
544 | /** |
||
545 | * @covers DELETE /user/roles/{roleId}/policies/{policyId} |
||
546 | * @depends testAddPolicy |
||
547 | */ |
||
548 | public function testDeletePolicy($policyHref) |
||
556 | |||
557 | /** |
||
558 | * @covers DELETE /user/roles/{roleId}/policies/{policyId} |
||
559 | * @depends testAddPolicyByRoleDraft |
||
560 | */ |
||
561 | public function testRemovePolicyByRoleDraft($policyHref) |
||
569 | |||
570 | /** |
||
571 | * @covers DELETE /user/roles/{roleId}/policies |
||
572 | * @depends testCreateRole |
||
573 | */ |
||
574 | public function testDeletePolicies($roleHref) |
||
582 | |||
583 | /** |
||
584 | * @covers DELETE /user/roles/{roleId} |
||
585 | * @depends testCreateRole |
||
586 | */ |
||
587 | public function testDeleteRole($roleHref) |
||
595 | |||
596 | /** |
||
597 | * @covers PUBLISH /user/roles/{roleId}/draft |
||
598 | * @depends testCreateRoleDraft |
||
599 | */ |
||
600 | public function testPublishRoleDraft($roleDraftHref) |
||
608 | |||
609 | /** |
||
610 | * @covers DELETE /user/roles/{roleId}/draft |
||
611 | * @depends testCreateRoleDraft |
||
612 | */ |
||
613 | public function testDeleteRoleDraft($roleDraftHref) |
||
624 | |||
625 | /** |
||
626 | * Helper method for changing a roledraft href to a role href. |
||
627 | * |
||
628 | * @param string $roleDraftHref Role draft href |
||
629 | * |
||
630 | * @return string Role href |
||
631 | */ |
||
632 | private function roleDraftHrefToRoleHref($roleDraftHref) |
||
636 | } |
||
637 |