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 |
||
17 | class ApiAuthServiceTest extends BaseTest |
||
18 | { |
||
19 | /** |
||
20 | * {@inheritdoc} |
||
21 | */ |
||
22 | public static function setUpBeforeClass() |
||
30 | |||
31 | //============================================================================================================== |
||
32 | //================================================= TESTS ==================================================== |
||
33 | //============================================================================================================== |
||
34 | |||
35 | /** |
||
36 | * @covers ::generateKey |
||
37 | */ |
||
38 | public function testGenerateKeyShouldReturnRandomKey() |
||
46 | |||
47 | /** |
||
48 | * @covers ::authenticateKey |
||
49 | * @dataProvider provideInvalidUserKeyModelAttributes |
||
50 | * |
||
51 | * @param string $key |
||
52 | * @param int $userId |
||
53 | * @param DateTime $expires |
||
54 | */ |
||
55 | public function testAuthenticateKeyShouldReturnFalseWhenKeyExpired($key, $userId, DateTime $expires) |
||
69 | |||
70 | /** |
||
71 | * @covers ::authenticateKey |
||
72 | * @dataProvider provideValidUserKeyModelAttributes |
||
73 | * |
||
74 | * @param string $key |
||
75 | */ |
||
76 | public function testAuthenticateKeyShouldReturnFalseWhenKeyNotFound($key) |
||
83 | |||
84 | /** |
||
85 | * @covers ::authenticateKey |
||
86 | * @dataProvider provideValidUserKeyModelAttributes |
||
87 | * |
||
88 | * @param string $key |
||
89 | * @param int $userId |
||
90 | * @param DateTime $expires |
||
91 | */ |
||
92 | public function testAuthenticateKeyShouldLoginUserWhenKeyValid($key, $userId, DateTime $expires) |
||
109 | |||
110 | /** |
||
111 | * @covers ::saveKey |
||
112 | * @dataProvider provideValidUserKeyModelAttributes |
||
113 | * |
||
114 | * @param string $key |
||
115 | * @param int $userId |
||
116 | */ |
||
117 | View Code Duplication | public function testSaveKeyShouldReturnTrueWhenSavingSucceeds($key, $userId) |
|
127 | |||
128 | /** |
||
129 | * @covers ::saveKey |
||
130 | * @dataProvider provideInvalidUserKeyModelAttributes |
||
131 | * |
||
132 | * @param string $key |
||
133 | * @param int $userId |
||
134 | */ |
||
135 | View Code Duplication | public function testSaveKeyShouldReturnFalseWhenSavingFails($key, $userId) |
|
145 | |||
146 | /** |
||
147 | * @covers ::isOptionsRequest |
||
148 | */ |
||
149 | public function testIsOptionsRequestShouldReturnFalseByDefault() |
||
157 | |||
158 | /** |
||
159 | * @covers ::isOptionsRequest |
||
160 | */ |
||
161 | public function testIsOptionsRequestShouldReturnTrueWhenOptionsRequest() |
||
171 | |||
172 | /** |
||
173 | * @covers ::setCorsHeaders |
||
174 | */ |
||
175 | public function testSetCorsHeaderShouldSetCorsHeaders() |
||
189 | |||
190 | //============================================================================================================== |
||
191 | //============================================== PROVIDERS =================================================== |
||
192 | //============================================================================================================== |
||
193 | |||
194 | /** |
||
195 | * @return array |
||
196 | */ |
||
197 | public function provideValidUserKeyModelAttributes() |
||
207 | |||
208 | /** |
||
209 | * @return array |
||
210 | */ |
||
211 | public function provideInvalidUserKeyModelAttributes() |
||
221 | |||
222 | //============================================================================================================== |
||
223 | //================================================= MOCKS ==================================================== |
||
224 | //============================================================================================================== |
||
225 | |||
226 | /** |
||
227 | * @param int $userId |
||
228 | * @param bool $success |
||
229 | * @return UserSessionService|mock |
||
230 | */ |
||
231 | View Code Duplication | private function setMockUserSessionService($userId, $success = true) |
|
246 | |||
247 | /** |
||
248 | * @return ApiAuth_UserKeyModel|mock |
||
249 | */ |
||
250 | private function getMockUserKeyModel() |
||
258 | |||
259 | /** |
||
260 | * @param int $userId |
||
261 | * @return UserModel|mock |
||
262 | */ |
||
263 | private function getMockUser($userId) |
||
276 | |||
277 | /** |
||
278 | * @param array $methodName |
||
279 | * @param mixed $param |
||
280 | * @param ApiAuth_UserKeyModel $mockUserKeyModel |
||
281 | * @return ApiAuthService|mock |
||
282 | */ |
||
283 | private function setMockApiAuthService($methodName, $param, ApiAuth_UserKeyModel $mockUserKeyModel = null) |
||
295 | |||
296 | /** |
||
297 | * @param $success |
||
298 | * @return ApiAuth_UserKeyModel|mock |
||
299 | */ |
||
300 | private function setMockUserKeyModelSaveExpectation($success) |
||
308 | } |
||
309 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.