]>
Commit | Line | Data |
---|---|---|
af290059 A |
1 | <?php |
2 | ||
3 | declare(strict_types=1); | |
4 | ||
2899ebb5 | 5 | namespace Shaarli\Front\Controller\Admin; |
af290059 A |
6 | |
7 | use PHPUnit\Framework\TestCase; | |
2899ebb5 | 8 | use Shaarli\Security\LoginManager; |
af290059 A |
9 | use Shaarli\Security\SessionManager; |
10 | use Slim\Http\Request; | |
11 | use Slim\Http\Response; | |
2899ebb5 | 12 | use Slim\Http\Uri; |
af290059 A |
13 | |
14 | class SessionFilterControllerTest extends TestCase | |
15 | { | |
2899ebb5 | 16 | use FrontAdminControllerMockHelper; |
af290059 A |
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 | { | |
af290059 A |
33 | $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc']; |
34 | ||
35 | $request = $this->createMock(Request::class); | |
2899ebb5 A |
36 | $request->method('getUri')->willReturnCallback(function (): Uri { |
37 | $uri = $this->createMock(Uri::class); | |
38 | $uri->method('getBasePath')->willReturn('/subfolder'); | |
39 | ||
40 | return $uri; | |
41 | }); | |
af290059 A |
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 | { | |
af290059 | 63 | $request = $this->createMock(Request::class); |
2899ebb5 A |
64 | $request->method('getUri')->willReturnCallback(function (): Uri { |
65 | $uri = $this->createMock(Uri::class); | |
66 | $uri->method('getBasePath')->willReturn('/subfolder'); | |
67 | ||
68 | return $uri; | |
69 | }); | |
af290059 A |
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()); | |
2899ebb5 | 83 | static::assertSame(['/subfolder'], $result->getHeader('location')); |
af290059 A |
84 | } |
85 | ||
86 | /** | |
87 | * Visibility - Default call for private filter while logged in without current value | |
88 | */ | |
89 | public function testVisibility(): void | |
90 | { | |
af290059 A |
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); | |
2899ebb5 A |
103 | $request->method('getUri')->willReturnCallback(function (): Uri { |
104 | $uri = $this->createMock(Uri::class); | |
105 | $uri->method('getBasePath')->willReturn('/subfolder'); | |
106 | ||
107 | return $uri; | |
108 | }); | |
af290059 A |
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 | { | |
af290059 A |
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); | |
2899ebb5 A |
144 | $request->method('getUri')->willReturnCallback(function (): Uri { |
145 | $uri = $this->createMock(Uri::class); | |
146 | $uri->method('getBasePath')->willReturn('/subfolder'); | |
147 | ||
148 | return $uri; | |
149 | }); | |
af290059 A |
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 | { | |
af290059 A |
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); | |
2899ebb5 A |
179 | $request->method('getUri')->willReturnCallback(function (): Uri { |
180 | $uri = $this->createMock(Uri::class); | |
181 | $uri->method('getBasePath')->willReturn('/subfolder'); | |
182 | ||
183 | return $uri; | |
184 | }); | |
af290059 A |
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()); | |
2899ebb5 | 191 | static::assertSame(['/subfolder'], $result->getHeader('location')); |
af290059 A |
192 | } |
193 | ||
194 | /** | |
195 | * Visibility - With invalid value - should remove any visibility setting | |
196 | */ | |
197 | public function testVisibilityInvalidValue(): void | |
198 | { | |
af290059 A |
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); | |
2899ebb5 A |
215 | $request->method('getUri')->willReturnCallback(function (): Uri { |
216 | $uri = $this->createMock(Uri::class); | |
217 | $uri->method('getBasePath')->willReturn('/subfolder'); | |
218 | ||
219 | return $uri; | |
220 | }); | |
af290059 A |
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 | { | |
af290059 A |
235 | $arg = ['visibility' => 'test']; |
236 | ||
237 | $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc']; | |
238 | ||
2899ebb5 | 239 | $this->container->loginManager = $this->createMock(LoginManager::class); |
af290059 A |
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); | |
2899ebb5 A |
252 | $request->method('getUri')->willReturnCallback(function (): Uri { |
253 | $uri = $this->createMock(Uri::class); | |
254 | $uri->method('getBasePath')->willReturn('/subfolder'); | |
255 | ||
256 | return $uri; | |
257 | }); | |
af290059 A |
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 | { | |
af290059 A |
272 | $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc']; |
273 | ||
274 | $request = $this->createMock(Request::class); | |
2899ebb5 A |
275 | $request->method('getUri')->willReturnCallback(function (): Uri { |
276 | $uri = $this->createMock(Uri::class); | |
277 | $uri->method('getBasePath')->willReturn('/subfolder'); | |
278 | ||
279 | return $uri; | |
280 | }); | |
af290059 A |
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 | { | |
af290059 A |
301 | $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc']; |
302 | ||
303 | $request = $this->createMock(Request::class); | |
2899ebb5 A |
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 | ||
af290059 A |
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 | } |