]> git.immae.eu Git - github/shaarli/Shaarli.git/blob - tests/front/controller/admin/SessionFilterControllerTest.php
096963cf46d041b2cd4d45b919e94b4d27459086
[github/shaarli/Shaarli.git] / tests / front / controller / admin / SessionFilterControllerTest.php
1 <?php
2
3 declare(strict_types=1);
4
5 namespace Shaarli\Front\Controller\Admin;
6
7 use PHPUnit\Framework\TestCase;
8 use Shaarli\Security\LoginManager;
9 use Shaarli\Security\SessionManager;
10 use Slim\Http\Request;
11 use Slim\Http\Response;
12 use Slim\Http\Uri;
13
14 class SessionFilterControllerTest extends TestCase
15 {
16 use FrontAdminControllerMockHelper;
17
18 /** @var SessionFilterController */
19 protected $controller;
20
21 public function setUp(): void
22 {
23 $this->createContainer();
24
25 $this->controller = new SessionFilterController($this->container);
26 }
27
28 /**
29 * Link per page - Default call with valid parameter and a referer.
30 */
31 public function testLinksPerPage(): void
32 {
33 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc'];
34
35 $request = $this->createMock(Request::class);
36 $request->method('getUri')->willReturnCallback(function (): Uri {
37 $uri = $this->createMock(Uri::class);
38 $uri->method('getBasePath')->willReturn('/subfolder');
39
40 return $uri;
41 });
42 $request->method('getParam')->with('nb')->willReturn('8');
43 $response = new Response();
44
45 $this->container->sessionManager
46 ->expects(static::once())
47 ->method('setSessionParameter')
48 ->with(SessionManager::KEY_LINKS_PER_PAGE, 8)
49 ;
50
51 $result = $this->controller->linksPerPage($request, $response);
52
53 static::assertInstanceOf(Response::class, $result);
54 static::assertSame(302, $result->getStatusCode());
55 static::assertSame(['/subfolder/controller/?searchtag=abc'], $result->getHeader('location'));
56 }
57
58 /**
59 * Link per page - Invalid value, should use default value (20)
60 */
61 public function testLinksPerPageNotValid(): void
62 {
63 $request = $this->createMock(Request::class);
64 $request->method('getUri')->willReturnCallback(function (): Uri {
65 $uri = $this->createMock(Uri::class);
66 $uri->method('getBasePath')->willReturn('/subfolder');
67
68 return $uri;
69 });
70 $request->method('getParam')->with('nb')->willReturn('test');
71 $response = new Response();
72
73 $this->container->sessionManager
74 ->expects(static::once())
75 ->method('setSessionParameter')
76 ->with(SessionManager::KEY_LINKS_PER_PAGE, 20)
77 ;
78
79 $result = $this->controller->linksPerPage($request, $response);
80
81 static::assertInstanceOf(Response::class, $result);
82 static::assertSame(302, $result->getStatusCode());
83 static::assertSame(['/subfolder'], $result->getHeader('location'));
84 }
85
86 /**
87 * Visibility - Default call for private filter while logged in without current value
88 */
89 public function testVisibility(): void
90 {
91 $arg = ['visibility' => 'private'];
92
93 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc'];
94
95 $this->container->loginManager->method('isLoggedIn')->willReturn(true);
96 $this->container->sessionManager
97 ->expects(static::once())
98 ->method('setSessionParameter')
99 ->with(SessionManager::KEY_VISIBILITY, 'private')
100 ;
101
102 $request = $this->createMock(Request::class);
103 $request->method('getUri')->willReturnCallback(function (): Uri {
104 $uri = $this->createMock(Uri::class);
105 $uri->method('getBasePath')->willReturn('/subfolder');
106
107 return $uri;
108 });
109 $response = new Response();
110
111 $result = $this->controller->visibility($request, $response, $arg);
112
113 static::assertInstanceOf(Response::class, $result);
114 static::assertSame(302, $result->getStatusCode());
115 static::assertSame(['/subfolder/controller/?searchtag=abc'], $result->getHeader('location'));
116 }
117
118 /**
119 * Visibility - Toggle off private visibility
120 */
121 public function testVisibilityToggleOff(): void
122 {
123 $arg = ['visibility' => 'private'];
124
125 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc'];
126
127 $this->container->loginManager->method('isLoggedIn')->willReturn(true);
128 $this->container->sessionManager
129 ->method('getSessionParameter')
130 ->with(SessionManager::KEY_VISIBILITY)
131 ->willReturn('private')
132 ;
133 $this->container->sessionManager
134 ->expects(static::never())
135 ->method('setSessionParameter')
136 ;
137 $this->container->sessionManager
138 ->expects(static::once())
139 ->method('deleteSessionParameter')
140 ->with(SessionManager::KEY_VISIBILITY)
141 ;
142
143 $request = $this->createMock(Request::class);
144 $request->method('getUri')->willReturnCallback(function (): Uri {
145 $uri = $this->createMock(Uri::class);
146 $uri->method('getBasePath')->willReturn('/subfolder');
147
148 return $uri;
149 });
150 $response = new Response();
151
152 $result = $this->controller->visibility($request, $response, $arg);
153
154 static::assertInstanceOf(Response::class, $result);
155 static::assertSame(302, $result->getStatusCode());
156 static::assertSame(['/subfolder/controller/?searchtag=abc'], $result->getHeader('location'));
157 }
158
159 /**
160 * Visibility - Change private to public
161 */
162 public function testVisibilitySwitch(): void
163 {
164 $arg = ['visibility' => 'private'];
165
166 $this->container->loginManager->method('isLoggedIn')->willReturn(true);
167 $this->container->sessionManager
168 ->method('getSessionParameter')
169 ->with(SessionManager::KEY_VISIBILITY)
170 ->willReturn('public')
171 ;
172 $this->container->sessionManager
173 ->expects(static::once())
174 ->method('setSessionParameter')
175 ->with(SessionManager::KEY_VISIBILITY, 'private')
176 ;
177
178 $request = $this->createMock(Request::class);
179 $request->method('getUri')->willReturnCallback(function (): Uri {
180 $uri = $this->createMock(Uri::class);
181 $uri->method('getBasePath')->willReturn('/subfolder');
182
183 return $uri;
184 });
185 $response = new Response();
186
187 $result = $this->controller->visibility($request, $response, $arg);
188
189 static::assertInstanceOf(Response::class, $result);
190 static::assertSame(302, $result->getStatusCode());
191 static::assertSame(['/subfolder'], $result->getHeader('location'));
192 }
193
194 /**
195 * Visibility - With invalid value - should remove any visibility setting
196 */
197 public function testVisibilityInvalidValue(): void
198 {
199 $arg = ['visibility' => 'test'];
200
201 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc'];
202
203 $this->container->loginManager->method('isLoggedIn')->willReturn(true);
204 $this->container->sessionManager
205 ->expects(static::never())
206 ->method('setSessionParameter')
207 ;
208 $this->container->sessionManager
209 ->expects(static::once())
210 ->method('deleteSessionParameter')
211 ->with(SessionManager::KEY_VISIBILITY)
212 ;
213
214 $request = $this->createMock(Request::class);
215 $request->method('getUri')->willReturnCallback(function (): Uri {
216 $uri = $this->createMock(Uri::class);
217 $uri->method('getBasePath')->willReturn('/subfolder');
218
219 return $uri;
220 });
221 $response = new Response();
222
223 $result = $this->controller->visibility($request, $response, $arg);
224
225 static::assertInstanceOf(Response::class, $result);
226 static::assertSame(302, $result->getStatusCode());
227 static::assertSame(['/subfolder/controller/?searchtag=abc'], $result->getHeader('location'));
228 }
229
230 /**
231 * Visibility - Try to change visibility while logged out
232 */
233 public function testVisibilityLoggedOut(): void
234 {
235 $arg = ['visibility' => 'test'];
236
237 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc'];
238
239 $this->container->loginManager = $this->createMock(LoginManager::class);
240 $this->container->loginManager->method('isLoggedIn')->willReturn(false);
241 $this->container->sessionManager
242 ->expects(static::never())
243 ->method('setSessionParameter')
244 ;
245 $this->container->sessionManager
246 ->expects(static::never())
247 ->method('deleteSessionParameter')
248 ->with(SessionManager::KEY_VISIBILITY)
249 ;
250
251 $request = $this->createMock(Request::class);
252 $request->method('getUri')->willReturnCallback(function (): Uri {
253 $uri = $this->createMock(Uri::class);
254 $uri->method('getBasePath')->willReturn('/subfolder');
255
256 return $uri;
257 });
258 $response = new Response();
259
260 $result = $this->controller->visibility($request, $response, $arg);
261
262 static::assertInstanceOf(Response::class, $result);
263 static::assertSame(302, $result->getStatusCode());
264 static::assertSame(['/subfolder/controller/?searchtag=abc'], $result->getHeader('location'));
265 }
266
267 /**
268 * Untagged only - valid call
269 */
270 public function testUntaggedOnly(): void
271 {
272 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc'];
273
274 $request = $this->createMock(Request::class);
275 $request->method('getUri')->willReturnCallback(function (): Uri {
276 $uri = $this->createMock(Uri::class);
277 $uri->method('getBasePath')->willReturn('/subfolder');
278
279 return $uri;
280 });
281 $response = new Response();
282
283 $this->container->sessionManager
284 ->expects(static::once())
285 ->method('setSessionParameter')
286 ->with(SessionManager::KEY_UNTAGGED_ONLY, true)
287 ;
288
289 $result = $this->controller->untaggedOnly($request, $response);
290
291 static::assertInstanceOf(Response::class, $result);
292 static::assertSame(302, $result->getStatusCode());
293 static::assertSame(['/subfolder/controller/?searchtag=abc'], $result->getHeader('location'));
294 }
295
296 /**
297 * Untagged only - toggle off
298 */
299 public function testUntaggedOnlyToggleOff(): void
300 {
301 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc'];
302
303 $request = $this->createMock(Request::class);
304 $request->method('getUri')->willReturnCallback(function (): Uri {
305 $uri = $this->createMock(Uri::class);
306 $uri->method('getBasePath')->willReturn('/subfolder');
307
308 return $uri;
309 });
310
311 $response = new Response();
312
313 $this->container->sessionManager
314 ->method('getSessionParameter')
315 ->with(SessionManager::KEY_UNTAGGED_ONLY)
316 ->willReturn(true)
317 ;
318 $this->container->sessionManager
319 ->expects(static::once())
320 ->method('setSessionParameter')
321 ->with(SessionManager::KEY_UNTAGGED_ONLY, false)
322 ;
323
324 $result = $this->controller->untaggedOnly($request, $response);
325
326 static::assertInstanceOf(Response::class, $result);
327 static::assertSame(302, $result->getStatusCode());
328 static::assertSame(['/subfolder/controller/?searchtag=abc'], $result->getHeader('location'));
329 }
330 }