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

DiscussionControllerTest   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 360
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 10

Importance

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