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 |
||
12 | class ServerRequestTest extends TestCase |
||
13 | { |
||
14 | public function testUploadedFiles() |
||
15 | { |
||
16 | $request1 = new ServerRequest('GET', '/'); |
||
17 | |||
18 | $files = [ |
||
19 | 'file' => new UploadedFile('test', 123, UPLOAD_ERR_OK), |
||
20 | ]; |
||
21 | |||
22 | $request2 = $request1->withUploadedFiles($files); |
||
23 | |||
24 | $this->assertNotSame($request2, $request1); |
||
25 | $this->assertSame([], $request1->getUploadedFiles()); |
||
26 | $this->assertSame($files, $request2->getUploadedFiles()); |
||
27 | } |
||
28 | |||
29 | public function testServerParams() |
||
30 | { |
||
31 | $params = ['name' => 'value']; |
||
32 | |||
33 | $request = new ServerRequest('GET', '/', [], null, '1.1', $params); |
||
34 | $this->assertSame($params, $request->getServerParams()); |
||
35 | } |
||
36 | |||
37 | public function testCookieParams() |
||
38 | { |
||
39 | $request1 = new ServerRequest('GET', '/'); |
||
40 | |||
41 | $params = ['name' => 'value']; |
||
42 | |||
43 | $request2 = $request1->withCookieParams($params); |
||
44 | |||
45 | $this->assertNotSame($request2, $request1); |
||
46 | $this->assertEmpty($request1->getCookieParams()); |
||
47 | $this->assertSame($params, $request2->getCookieParams()); |
||
48 | } |
||
49 | |||
50 | public function testQueryParams() |
||
51 | { |
||
52 | $request1 = new ServerRequest('GET', '/'); |
||
53 | |||
54 | $params = ['name' => 'value']; |
||
55 | |||
56 | $request2 = $request1->withQueryParams($params); |
||
57 | |||
58 | $this->assertNotSame($request2, $request1); |
||
59 | $this->assertEmpty($request1->getQueryParams()); |
||
60 | $this->assertSame($params, $request2->getQueryParams()); |
||
61 | } |
||
62 | |||
63 | public function testParsedBody() |
||
64 | { |
||
65 | $request1 = new ServerRequest('GET', '/'); |
||
66 | |||
67 | $params = ['name' => 'value']; |
||
68 | |||
69 | $request2 = $request1->withParsedBody($params); |
||
70 | |||
71 | $this->assertNotSame($request2, $request1); |
||
72 | $this->assertEmpty($request1->getParsedBody()); |
||
73 | $this->assertSame($params, $request2->getParsedBody()); |
||
74 | } |
||
75 | |||
76 | public function testAttributes() |
||
77 | { |
||
78 | $request1 = new ServerRequest('GET', '/'); |
||
79 | |||
80 | $request2 = $request1->withAttribute('name', 'value'); |
||
81 | $request3 = $request2->withAttribute('other', 'otherValue'); |
||
82 | $request4 = $request3->withoutAttribute('other'); |
||
83 | $request5 = $request3->withoutAttribute('unknown'); |
||
84 | |||
85 | $this->assertNotSame($request2, $request1); |
||
86 | $this->assertNotSame($request3, $request2); |
||
87 | $this->assertNotSame($request4, $request3); |
||
88 | $this->assertNotSame($request5, $request4); |
||
89 | |||
90 | $this->assertEmpty($request1->getAttributes()); |
||
91 | $this->assertEmpty($request1->getAttribute('name')); |
||
92 | $this->assertEquals( |
||
93 | 'something', |
||
94 | $request1->getAttribute('name', 'something'), |
||
95 | 'Should return the default value' |
||
96 | ); |
||
97 | |||
98 | $this->assertEquals('value', $request2->getAttribute('name')); |
||
99 | $this->assertEquals(['name' => 'value'], $request2->getAttributes()); |
||
100 | $this->assertEquals(['name' => 'value', 'other' => 'otherValue'], $request3->getAttributes()); |
||
101 | $this->assertEquals(['name' => 'value'], $request4->getAttributes()); |
||
102 | } |
||
103 | |||
104 | public function testNullAttribute() |
||
105 | { |
||
106 | $request = (new ServerRequest('GET', '/'))->withAttribute('name', null); |
||
107 | |||
108 | $this->assertSame(['name' => null], $request->getAttributes()); |
||
109 | $this->assertNull($request->getAttribute('name', 'different-default')); |
||
110 | |||
111 | $requestWithoutAttribute = $request->withoutAttribute('name'); |
||
112 | |||
113 | $this->assertSame([], $requestWithoutAttribute->getAttributes()); |
||
114 | $this->assertSame('different-default', $requestWithoutAttribute->getAttribute('name', 'different-default')); |
||
115 | } |
||
116 | } |
||
117 |