Completed
Branch master (4042af)
by Aleksandar
02:14
created

UserControllerTest   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 339
Duplicated Lines 42.77 %

Coupling/Cohesion

Components 1
Dependencies 9

Importance

Changes 0
Metric Value
dl 145
loc 339
rs 10
c 0
b 0
f 0
wmc 9
lcom 1
cbo 9

How to fix   Duplicated Code   

Duplicated Code

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
2
3
declare(strict_types=1);
4
5
namespace Test\Admin\Controller;
6
7
class UserControllerTest extends \PHPUnit_Framework_TestCase
8
{
9
    public function testIndexMethodShouldReturnHtmlResponse()
10
    {
11
        $user = new \stdClass();
12
        $user->admin_user_id = 1;
13
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
14
        $sessionStorage->user = $user;
15
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
16
            ->setMethods(['render'])
17
            ->getMockForAbstractClass();
18
        $template->expects(static::once())
19
            ->method('render')
20
            ->will(static::returnValue('test'));
21
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
22
            ->disableOriginalConstructor()
23
            ->getMock();
24
        $sessionManager = $this->getMockBuilder(\Zend\Session\SessionManager::class)
25
            ->disableOriginalConstructor()
26
            ->setMethods(['getStorage'])
27
            ->getMock();
28
        $sessionManager->expects(static::any())
29
            ->method('getStorage')
30
            ->will(static::returnValue($sessionStorage));
31
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
32
            ->getMockForAbstractClass();
33
        $request = new \Zend\Diactoros\ServerRequest();
34
        $request = $request->withAttribute('action', 'index');
35
        $response = new \Zend\Diactoros\Response();
36
        $userController = new \Admin\Controller\UserController(
37
            $template,
38
            $router,
39
            $adminUserService,
40
            $sessionManager
41
        );
42
        static::assertInstanceOf(\Zend\Diactoros\Response\HtmlResponse::class, $userController($request, $response));
43
    }
44
45
    public function testEditMethodShouldReturnHtmlResponse()
46
    {
47
        $user = new \stdClass();
48
        $user->admin_user_id = 1;
49
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
50
        $sessionStorage->user = $user;
51
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
52
            ->setMethods(['render'])
53
            ->getMockForAbstractClass();
54
        $template->expects(static::once())
55
            ->method('render')
56
            ->will(static::returnValue('test'));
57
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
58
            ->disableOriginalConstructor()
59
            ->setMethods(['getUser'])
60
            ->getMock();
61
        $adminUserService->expects(static::once())
62
            ->method('getUser')
63
            ->willReturn(new \ArrayObject());
64
        $sessionManager = $this->getMockBuilder(\Zend\Session\SessionManager::class)
65
            ->disableOriginalConstructor()
66
            ->getMock();
67
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
68
            ->getMockForAbstractClass();
69
        $request = new \Zend\Diactoros\ServerRequest();
70
        $request = $request->withAttribute('action', 'edit');
71
        $request = $request->withAttribute('id', 1);
72
        $response = new \Zend\Diactoros\Response();
73
        $userController = new \Admin\Controller\UserController(
74
            $template,
75
            $router,
76
            $adminUserService,
77
            $sessionManager
78
        );
79
        static::assertInstanceOf(\Zend\Diactoros\Response\HtmlResponse::class, $userController($request, $response));
80
    }
81
82
    public function testEditMethodShouldReturnHtmlResponseAndUpdateUserWithRequestData()
83
    {
84
        $user = new \stdClass();
85
        $user->admin_user_id = 1;
86
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
87
        $sessionStorage->user = $user;
88
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
89
            ->setMethods(['render'])
90
            ->getMockForAbstractClass();
91
        $template->expects(static::once())
92
            ->method('render')
93
            ->will(static::returnValue('test'));
94
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
95
            ->disableOriginalConstructor()
96
            ->setMethods(['getUser'])
97
            ->getMock();
98
        $adminUserService->expects(static::once())
99
            ->method('getUser')
100
            ->willReturn(new \ArrayObject());
101
        $sessionManager = $this->getMockBuilder(\Zend\Session\SessionManager::class)
102
            ->disableOriginalConstructor()
103
            ->getMock();
104
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
105
            ->getMockForAbstractClass();
106
        $request = new \Zend\Diactoros\ServerRequest();
107
        $request = $request->withAttribute('action', 'edit');
108
        $request = $request->withAttribute('id', 1);
109
        $request = $request->withParsedBody(['user' => 'test']);
110
        $response = new \Zend\Diactoros\Response();
111
        $userController = new \Admin\Controller\UserController(
112
            $template,
113
            $router,
114
            $adminUserService,
115
            $sessionManager
116
        );
117
        static::assertInstanceOf(\Zend\Diactoros\Response\HtmlResponse::class, $userController($request, $response));
118
    }
119
120
    public function testSaveMethodShouldRegisterUserAndReturnRedirect()
121
    {
122
        $user = new \stdClass();
123
        $user->admin_user_id = 1;
124
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
125
        $sessionStorage->user = $user;
126
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
127
            ->getMockForAbstractClass();
128
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
129
            ->disableOriginalConstructor()
130
            ->getMock();
131
        $sessionManager = $this->getMockBuilder(\Zend\Session\SessionManager::class)
132
            ->disableOriginalConstructor()
133
            ->getMock();
134
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
135
            ->getMockForAbstractClass();
136
        $router->expects(static::at(0))
137
            ->method('generateUri')
138
            ->will(static::returnValue('http://unfinished.dev/admin/users'));
139
        $request = new \Zend\Diactoros\ServerRequest();
140
        $request = $request->withAttribute('action', 'save');
141
        $request = $request->withParsedBody(['user' => 'test']);
142
        $response = new \Zend\Diactoros\Response();
143
        $userController = new \Admin\Controller\UserController(
144
            $template,
145
            $router,
146
            $adminUserService,
147
            $sessionManager
148
        );
149
        /**
150
         * @var \Zend\Diactoros\Response
151
         */
152
        $returnedResponse = $userController($request, $response);
153
        static::assertSame(302, $returnedResponse->getStatusCode());
154
    }
155
156
    public function testSaveMethodShouldUpdateUserAndReturnRedirect()
157
    {
158
        $user = new \stdClass();
159
        $user->admin_user_id = 1;
160
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
161
        $sessionStorage->user = $user;
162
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
163
            ->getMockForAbstractClass();
164
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
165
            ->disableOriginalConstructor()
166
            ->getMock();
167
        $sessionManager = $this->getMockBuilder(\Zend\Session\SessionManager::class)
168
            ->disableOriginalConstructor()
169
            ->getMock();
170
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
171
            ->getMockForAbstractClass();
172
        $router->expects(static::at(0))
173
            ->method('generateUri')
174
            ->will(static::returnValue('http://unfinished.dev/admin/users'));
175
        $request = new \Zend\Diactoros\ServerRequest();
176
        $request = $request->withAttribute('action', 'save');
177
        $request = $request->withAttribute('id', 2);
178
        $request = $request->withParsedBody(['user' => 'test']);
179
        $response = new \Zend\Diactoros\Response();
180
        $userController = new \Admin\Controller\UserController(
181
            $template,
182
            $router,
183
            $adminUserService,
184
            $sessionManager
185
        );
186
        /**
187
         * @var \Zend\Diactoros\Response
188
         */
189
        $returnedResponse = $userController($request, $response);
190
        static::assertSame(302, $returnedResponse->getStatusCode());
191
    }
192
193
    public function testSaveMethodShouldThrowFilterExceptionAndReturnHtmlResponse()
194
    {
195
        $user = new \stdClass();
196
        $user->admin_user_id = 1;
197
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
198
        $sessionStorage->user = $user;
199
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
200
            ->getMockForAbstractClass();
201
        $template->expects(static::once())
202
            ->method('render')
203
            ->will(static::returnValue('test'));
204
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
205
            ->disableOriginalConstructor()
206
            ->getMock();
207
        $sessionManager = $this->getMockBuilder(\Zend\Session\SessionManager::class)
208
            ->disableOriginalConstructor()
209
            ->getMock();
210
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
211
            ->getMockForAbstractClass();
212
        $router->expects(static::at(0))
213
            ->method('generateUri')
214
            ->willThrowException(new \Std\FilterException(['test error']));
215
        $request = new \Zend\Diactoros\ServerRequest();
216
        $request = $request->withAttribute('action', 'save');
217
        $request = $request->withAttribute('id', 2);
218
        $request = $request->withParsedBody(['user' => 'test']);
219
        $response = new \Zend\Diactoros\Response();
220
        $userController = new \Admin\Controller\UserController(
221
            $template,
222
            $router,
223
            $adminUserService,
224
            $sessionManager
225
        );
226
        /**
227
         * @var \Zend\Diactoros\Response
228
         */
229
        $returnedResponse = $userController($request, $response);
230
        static::assertSame(200, $returnedResponse->getStatusCode());
231
        static::assertInstanceOf(\Zend\Diactoros\Response\HtmlResponse::class, $returnedResponse);
232
    }
233
234
    /**
235
     * @expectedException \Exception
236
     * @expectedExceptionMessage test error
237
     */
238
    public function testSaveMethodShouldThrowException()
239
    {
240
        $user = new \stdClass();
241
        $user->admin_user_id = 1;
242
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
243
        $sessionStorage->user = $user;
244
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
245
            ->getMockForAbstractClass();
246
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
247
            ->disableOriginalConstructor()
248
            ->getMock();
249
        $sessionManager = $this->getMockBuilder(\Zend\Session\SessionManager::class)
250
            ->disableOriginalConstructor()
251
            ->getMock();
252
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
253
            ->getMockForAbstractClass();
254
        $router->expects(static::at(0))
255
            ->method('generateUri')
256
            ->willThrowException(new \Exception('test error'));
257
        $request = new \Zend\Diactoros\ServerRequest();
258
        $request = $request->withAttribute('action', 'save');
259
        $request = $request->withParsedBody(['user' => 'test']);
260
        $response = new \Zend\Diactoros\Response();
261
        $userController = new \Admin\Controller\UserController(
262
            $template,
263
            $router,
264
            $adminUserService,
265
            $sessionManager
266
        );
267
        $userController($request, $response);
268
    }
269
270
    public function testDeleteMethodShouldSucceedAndReturnRedirect()
271
    {
272
        $user = new \stdClass();
273
        $user->admin_user_id = 1;
274
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
275
        $sessionStorage->user = $user;
276
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
277
            ->getMockForAbstractClass();
278
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
279
            ->disableOriginalConstructor()
280
            ->getMock();
281
        $sessionManager = $this->getMockBuilder(\Zend\Session\SessionManager::class)
282
            ->disableOriginalConstructor()
283
            ->getMock();
284
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
285
            ->getMockForAbstractClass();
286
        $router->expects(static::at(0))
287
            ->method('generateUri')
288
            ->will(static::returnValue('http://unfinished.dev/admin/users'));
289
        $request = new \Zend\Diactoros\ServerRequest();
290
        $request = $request->withAttribute('action', 'delete');
291
        $request = $request->withAttribute('id', 2);
292
        $response = new \Zend\Diactoros\Response();
293
        $userController = new \Admin\Controller\UserController(
294
            $template,
295
            $router,
296
            $adminUserService,
297
            $sessionManager
298
        );
299
        /**
300
         * @var \Zend\Diactoros\Response
301
         */
302
        $returnedResponse = $userController($request, $response);
303
        static::assertSame(302, $returnedResponse->getStatusCode());
304
    }
305
306
    public function testDeleteMethodShouldFailAndReturnRedirect()
307
    {
308
        $user = new \stdClass();
309
        $user->admin_user_id = 1;
310
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
311
        $sessionStorage->user = $user;
312
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
313
            ->getMockForAbstractClass();
314
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
315
            ->setMethods(['delete'])
316
            ->disableOriginalConstructor()
317
            ->getMock();
318
        $adminUserService->expects(static::once())
319
            ->method('delete')
320
            ->willThrowException(new \Exception('test error'));
321
        $sessionManager = $this->getMockBuilder(\Zend\Session\SessionManager::class)
322
            ->disableOriginalConstructor()
323
            ->getMock();
324
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
325
            ->getMockForAbstractClass();
326
        $router->expects(static::at(0))
327
            ->method('generateUri')
328
            ->will(static::returnValue('http://unfinished.dev/admin/users'));
329
        $request = new \Zend\Diactoros\ServerRequest();
330
        $request = $request->withAttribute('action', 'delete');
331
        $request = $request->withAttribute('id', 2);
332
        $response = new \Zend\Diactoros\Response();
333
        $userController = new \Admin\Controller\UserController(
334
            $template,
335
            $router,
336
            $adminUserService,
337
            $sessionManager
338
        );
339
        /**
340
         * @var \Zend\Diactoros\Response
341
         */
342
        $returnedResponse = $userController($request, $response);
343
        static::assertSame(302, $returnedResponse->getStatusCode());
344
    }
345
}
346