]>
Commit | Line | Data |
---|---|---|
6c50a6cc A |
1 | <?php |
2 | ||
3 | declare(strict_types=1); | |
4 | ||
5 | namespace Shaarli\Front\Controller; | |
6 | ||
7 | use PHPUnit\Framework\TestCase; | |
8 | use Shaarli\Config\ConfigManager; | |
9 | use Shaarli\Container\ShaarliContainer; | |
10 | use Shaarli\Front\Exception\LoginBannedException; | |
11 | use Shaarli\Render\PageBuilder; | |
12 | use Shaarli\Security\LoginManager; | |
13 | use Slim\Http\Request; | |
14 | use Slim\Http\Response; | |
15 | ||
16 | class LoginControllerTest extends TestCase | |
17 | { | |
18 | /** @var ShaarliContainer */ | |
19 | protected $container; | |
20 | ||
21 | /** @var LoginController */ | |
22 | protected $controller; | |
23 | ||
24 | public function setUp(): void | |
25 | { | |
26 | $this->container = $this->createMock(ShaarliContainer::class); | |
27 | $this->controller = new LoginController($this->container); | |
28 | } | |
29 | ||
30 | public function testValidControllerInvoke(): void | |
31 | { | |
32 | $this->createValidContainerMockSet(); | |
33 | ||
34 | $request = $this->createMock(Request::class); | |
35 | $request->expects(static::once())->method('getServerParam')->willReturn('> referer'); | |
36 | $response = new Response(); | |
37 | ||
38 | $assignedVariables = []; | |
39 | $this->container->pageBuilder | |
40 | ->expects(static::exactly(3)) | |
41 | ->method('assign') | |
42 | ->willReturnCallback(function ($key, $value) use (&$assignedVariables) { | |
43 | $assignedVariables[$key] = $value; | |
44 | ||
45 | return $this; | |
46 | }) | |
47 | ; | |
48 | ||
49 | $result = $this->controller->index($request, $response); | |
50 | ||
51 | static::assertInstanceOf(Response::class, $result); | |
52 | static::assertSame(200, $result->getStatusCode()); | |
53 | static::assertSame('loginform', (string) $result->getBody()); | |
54 | ||
55 | static::assertSame('> referer', $assignedVariables['returnurl']); | |
56 | static::assertSame(true, $assignedVariables['remember_user_default']); | |
57 | static::assertSame('Login - Shaarli', $assignedVariables['pagetitle']); | |
58 | } | |
59 | ||
60 | public function testValidControllerInvokeWithUserName(): void | |
61 | { | |
62 | $this->createValidContainerMockSet(); | |
63 | ||
64 | $request = $this->createMock(Request::class); | |
65 | $request->expects(static::once())->method('getServerParam')->willReturn('> referer'); | |
66 | $request->expects(static::exactly(2))->method('getParam')->willReturn('myUser>'); | |
67 | $response = new Response(); | |
68 | ||
69 | $assignedVariables = []; | |
70 | $this->container->pageBuilder | |
71 | ->expects(static::exactly(4)) | |
72 | ->method('assign') | |
73 | ->willReturnCallback(function ($key, $value) use (&$assignedVariables) { | |
74 | $assignedVariables[$key] = $value; | |
75 | ||
76 | return $this; | |
77 | }) | |
78 | ; | |
79 | ||
80 | $result = $this->controller->index($request, $response); | |
81 | ||
82 | static::assertInstanceOf(Response::class, $result); | |
83 | static::assertSame(200, $result->getStatusCode()); | |
84 | static::assertSame('loginform', (string) $result->getBody()); | |
85 | ||
86 | static::assertSame('myUser>', $assignedVariables['username']); | |
87 | static::assertSame('> referer', $assignedVariables['returnurl']); | |
88 | static::assertSame(true, $assignedVariables['remember_user_default']); | |
89 | static::assertSame('Login - Shaarli', $assignedVariables['pagetitle']); | |
90 | } | |
91 | ||
92 | public function testLoginControllerWhileLoggedIn(): void | |
93 | { | |
94 | $request = $this->createMock(Request::class); | |
95 | $response = new Response(); | |
96 | ||
97 | $loginManager = $this->createMock(LoginManager::class); | |
98 | $loginManager->expects(static::once())->method('isLoggedIn')->willReturn(true); | |
99 | $this->container->loginManager = $loginManager; | |
100 | ||
101 | $result = $this->controller->index($request, $response); | |
102 | ||
103 | static::assertInstanceOf(Response::class, $result); | |
104 | static::assertSame(302, $result->getStatusCode()); | |
105 | static::assertSame(['./'], $result->getHeader('Location')); | |
106 | } | |
107 | ||
108 | public function testLoginControllerOpenShaarli(): void | |
109 | { | |
110 | $this->createValidContainerMockSet(); | |
111 | ||
112 | $request = $this->createMock(Request::class); | |
113 | $response = new Response(); | |
114 | ||
115 | $conf = $this->createMock(ConfigManager::class); | |
116 | $conf->method('get')->willReturnCallback(function (string $parameter, $default) { | |
117 | if ($parameter === 'security.open_shaarli') { | |
118 | return true; | |
119 | } | |
120 | return $default; | |
121 | }); | |
122 | $this->container->conf = $conf; | |
123 | ||
124 | $result = $this->controller->index($request, $response); | |
125 | ||
126 | static::assertInstanceOf(Response::class, $result); | |
127 | static::assertSame(302, $result->getStatusCode()); | |
128 | static::assertSame(['./'], $result->getHeader('Location')); | |
129 | } | |
130 | ||
131 | public function testLoginControllerWhileBanned(): void | |
132 | { | |
133 | $this->createValidContainerMockSet(); | |
134 | ||
135 | $request = $this->createMock(Request::class); | |
136 | $response = new Response(); | |
137 | ||
138 | $loginManager = $this->createMock(LoginManager::class); | |
139 | $loginManager->method('isLoggedIn')->willReturn(false); | |
140 | $loginManager->method('canLogin')->willReturn(false); | |
141 | $this->container->loginManager = $loginManager; | |
142 | ||
143 | $this->expectException(LoginBannedException::class); | |
144 | ||
145 | $this->controller->index($request, $response); | |
146 | } | |
147 | ||
148 | protected function createValidContainerMockSet(): void | |
149 | { | |
150 | // User logged out | |
151 | $loginManager = $this->createMock(LoginManager::class); | |
152 | $loginManager->method('isLoggedIn')->willReturn(false); | |
153 | $loginManager->method('canLogin')->willReturn(true); | |
154 | $this->container->loginManager = $loginManager; | |
155 | ||
156 | // Config | |
157 | $conf = $this->createMock(ConfigManager::class); | |
158 | $conf->method('get')->willReturnCallback(function (string $parameter, $default) { | |
159 | return $default; | |
160 | }); | |
161 | $this->container->conf = $conf; | |
162 | ||
163 | // PageBuilder | |
164 | $pageBuilder = $this->createMock(PageBuilder::class); | |
165 | $pageBuilder | |
166 | ->method('render') | |
167 | ->willReturnCallback(function (string $template): string { | |
168 | return $template; | |
169 | }) | |
170 | ; | |
171 | $this->container->pageBuilder = $pageBuilder; | |
172 | } | |
173 | } |