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

AuthControllerTest   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 236
Duplicated Lines 50.42 %

Importance

Changes 0
Metric Value
dl 119
loc 236
rs 10
c 0
b 0
f 0
wmc 4

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 AuthControllerTest extends \PHPUnit_Framework_TestCase
8
{
9
    public function testIfUserAlreadyLoggedInRedirectShouldBePerformed()
10
    {
11
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
12
            ->disableOriginalConstructor()
13
            ->getMockForAbstractClass();
14
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
15
            ->getMockForAbstractClass();
16
        $request = new \Zend\Diactoros\ServerRequest();
17
        $request = $request->withAttribute('action', 'login');
18
        $response = new \Zend\Diactoros\Response\EmptyResponse();
19
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
20
            ->setMethods(['generateUri'])
21
            ->getMockForAbstractClass();
22
        $router->expects(static::at(0))
23
            ->method('generateUri')
24
            ->will(static::returnValue('http://unfinished.dev/admin'));
25
        $sessionManager = $this->getMockBuilder(\Zend\Session\SessionManager::class)
26
            ->setMethods(['getStorage', 'writeClose'])
27
            ->getMock();
28
        $sessionManager->expects(static::at(0))
29
            ->method('getStorage')
30
            ->will(static::returnValue(
31
                new class() {
32
                    public $user = true;
33
                }
34
            ));
35
        $auth = new \Admin\Controller\AuthController($router, $template, $sessionManager, $adminUserService);
36
        /** @var \Zend\Diactoros\Response\EmptyResponse $response */
37
        $response = $auth($request, $response);
38
        static::assertSame(302, $response->getStatusCode());
39
        static::assertSame(['http://unfinished.dev/admin'], $response->getHeader('Location'));
40
    }
41
42
    public function testIfUserNotLoggedInLoginActionShouldTakeHimToLoginHtmlPage()
43
    {
44
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
45
            ->disableOriginalConstructor()
46
            ->getMockForAbstractClass();
47
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
48
            ->setMethods(['render'])
49
            ->getMockForAbstractClass();
50
        $template->expects(static::at(0))
51
            ->method('render')
52
            ->will(static::returnValue('test'));
53
        $request = new \Zend\Diactoros\ServerRequest();
54
        $request = $request->withAttribute('action', 'login');
55
        $response = new \Zend\Diactoros\Response\EmptyResponse();
56
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
57
            ->getMockForAbstractClass();
58
        $sessionManager = $this->getMockBuilder(\Zend\Session\SessionManager::class)
59
            ->setMethods(['getStorage', 'writeClose'])
60
            ->getMock();
61
        $sessionManager->expects(static::at(0))
62
            ->method('getStorage')
63
            ->will(static::returnValue(
64
                new class() {
65
                    public $user = false;
66
                }
67
            ));
68
        $auth = new \Admin\Controller\AuthController($router, $template, $sessionManager, $adminUserService);
69
        /** @var \Zend\Diactoros\Response\HtmlResponse $response */
70
        $response = $auth($request, $response);
71
        static::assertSame(200, $response->getStatusCode());
72
        static::assertSame('test', $response->getBody()->getContents());
73
    }
74
75
    public function testUserLogoutShouldClearSessionStorage()
76
    {
77
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
78
            ->disableOriginalConstructor()
79
            ->getMockForAbstractClass();
80
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
81
            ->getMockForAbstractClass();
82
        $request = new \Zend\Diactoros\ServerRequest();
83
        $request = $request->withAttribute('action', 'logout');
84
        $response = new \Zend\Diactoros\Response\EmptyResponse();
85
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
86
            ->setMethods(['generateUri'])
87
            ->getMockForAbstractClass();
88
        $router->expects(static::at(0))
89
            ->method('generateUri')
90
            ->will(static::returnValue('http://unfinished.dev/admin'));
91
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage([
92
            'user' => '[email protected]',
93
        ]);
94
        $sessionManager = new \Zend\Session\SessionManager();
95
        $sessionManager->setStorage($sessionStorage);
96
        $auth = new \Admin\Controller\AuthController($router, $template, $sessionManager, $adminUserService);
97
        /** @var \Zend\Diactoros\Response\HtmlResponse $response */
98
        $response = $auth($request, $response);
99
        static::assertNull($sessionManager->getStorage()->user);
100
        static::assertSame(302, $response->getStatusCode());
101
        static::assertSame(['http://unfinished.dev/admin'], $response->getHeader('Location'));
102
    }
103
104
    public function testUserLoginHandleWithCorrectCredentialsShouldSetUserInSessionStorage()
105
    {
106
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
107
            ->disableOriginalConstructor()
108
            ->setMethods(['loginUser'])
109
            ->getMockForAbstractClass();
110
        $adminUserService->expects(static::once())
111
            ->method('loginUser')
112
            ->will(static::returnValue(
113
                new class() {
114
                    public $isLoggedIn = true;
115
                }
116
            ));
117
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
118
            ->getMockForAbstractClass();
119
        $request = new \Zend\Diactoros\ServerRequest();
120
        $request = $request->withParsedBody([
121
            'email'    => '[email protected]',
122
            'password' => 'secret',
123
        ]);
124
        $request = $request->withAttribute('action', 'loginHandle');
125
        $response = new \Zend\Diactoros\Response\EmptyResponse();
126
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
127
            ->setMethods(['generateUri'])
128
            ->getMockForAbstractClass();
129
        $router->expects(static::at(0))
130
            ->method('generateUri')
131
            ->will(static::returnValue('http://unfinished.dev/admin'));
132
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
133
        $sessionManager = new \Zend\Session\SessionManager();
134
        $sessionManager->setStorage($sessionStorage);
135
        $auth = new \Admin\Controller\AuthController($router, $template, $sessionManager, $adminUserService);
136
        /** @var \Zend\Diactoros\Response\HtmlResponse $response */
137
        $response = $auth($request, $response);
138
        static::assertTrue($sessionManager->getStorage()->user->isLoggedIn);
139
        static::assertSame(302, $response->getStatusCode());
140
        static::assertSame(['http://unfinished.dev/admin'], $response->getHeader('Location'));
141
    }
142
143
    public function testUserLoginHandleWithWrongCredentialsShouldNotSetUserInSessionStorage()
144
    {
145
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
146
            ->disableOriginalConstructor()
147
            ->setMethods(['loginUser'])
148
            ->getMockForAbstractClass();
149
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
150
            ->getMockForAbstractClass();
151
        $request = new \Zend\Diactoros\ServerRequest();
152
        $request = $request->withParsedBody([
153
            'email'    => 'admin@test',
154
            'password' => 'secretpass',
155
        ]);
156
        $request = $request->withAttribute('action', 'loginHandle');
157
        $response = new \Zend\Diactoros\Response\EmptyResponse();
158
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
159
            ->setMethods(['generateUri'])
160
            ->getMockForAbstractClass();
161
        $router->expects(static::at(0))
162
            ->method('generateUri')
163
            ->will(static::returnValue('http://unfinished.dev/admin'));
164
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
165
        $sessionManager = new \Zend\Session\SessionManager();
166
        $sessionManager->setStorage($sessionStorage);
167
        $sessionManager->getStorage()->user = null;
168
        $auth = new \Admin\Controller\AuthController($router, $template, $sessionManager, $adminUserService);
169
        /** @var \Zend\Diactoros\Response\HtmlResponse $response */
170
        $response = $auth($request, $response);
171
        static::assertNull($sessionManager->getStorage()->user);
172
        static::assertSame(302, $response->getStatusCode());
173
        static::assertSame(['http://unfinished.dev/admin'], $response->getHeader('Location'));
174
    }
175
176
    public function testUserLoginHandleWitAlreadyLoggedInUserShouldRedirectToAdminPage()
177
    {
178
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
179
            ->disableOriginalConstructor()
180
            ->getMockForAbstractClass();
181
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
182
            ->getMockForAbstractClass();
183
        $request = new \Zend\Diactoros\ServerRequest();
184
        $request = $request->withAttribute('action', 'loginHandle');
185
        $response = new \Zend\Diactoros\Response\EmptyResponse();
186
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
187
            ->setMethods(['generateUri'])
188
            ->getMockForAbstractClass();
189
        $router->expects(static::at(0))
190
            ->method('generateUri')
191
            ->will(static::returnValue('http://unfinished.dev/admin'));
192
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage([
193
            'user' => true,
194
        ]);
195
        $sessionManager = new \Zend\Session\SessionManager();
196
        $sessionManager->setStorage($sessionStorage);
197
        $auth = new \Admin\Controller\AuthController($router, $template, $sessionManager, $adminUserService);
198
        /** @var \Zend\Diactoros\Response\HtmlResponse $response */
199
        $response = $auth($request, $response);
200
        static::assertSame(302, $response->getStatusCode());
201
        static::assertSame(['http://unfinished.dev/admin'], $response->getHeader('Location'));
202
    }
203
204
    public function testUserLoginHandleShouldThrowExceptionAndDisplayMessage()
205
    {
206
        $adminUserService = $this->getMockBuilder(\Admin\Service\AdminUserService::class)
207
            ->disableOriginalConstructor()
208
            ->setMethods(['loginUser'])
209
            ->getMockForAbstractClass();
210
        $adminUserService->expects(static::once())
211
            ->method('loginUser')
212
            ->willThrowException(new \Exception('test error'));
213
        $template = $this->getMockBuilder(\Zend\Expressive\Template\TemplateRendererInterface::class)
214
            ->getMockForAbstractClass();
215
        $template->expects(static::once())
216
            ->method('render')
217
            ->will(static::returnCallback(
218
                function ($tpl, $error) {
219
                    return $error['error'];
220
                }
221
            ));
222
        $request = new \Zend\Diactoros\ServerRequest();
223
        $request = $request->withParsedBody([
224
            'email'    => 'admin@test',
225
            'password' => 'secretpass',
226
        ]);
227
        $request = $request->withAttribute('action', 'loginHandle');
228
        $response = new \Zend\Diactoros\Response\EmptyResponse();
229
        $router = $this->getMockBuilder(\Zend\Expressive\Router\RouterInterface::class)
230
            ->getMockForAbstractClass();
231
        $sessionStorage = new \Zend\Session\Storage\ArrayStorage();
232
        $sessionManager = new \Zend\Session\SessionManager();
233
        $sessionManager->setStorage($sessionStorage);
234
        $sessionManager->getStorage()->user = null;
235
        $auth = new \Admin\Controller\AuthController($router, $template, $sessionManager, $adminUserService);
236
        /** @var \Zend\Diactoros\Response\HtmlResponse $response */
237
        $response = $auth($request, $response);
238
        static::assertNull($sessionManager->getStorage()->user);
239
        static::assertSame(200, $response->getStatusCode());
240
        static::assertSame('test error', $response->getBody()->getContents());
241
    }
242
}
243