]> git.immae.eu Git - github/shaarli/Shaarli.git/blob - tests/front/controller/visitor/DailyControllerTest.php
cb5b96f3b557174d5d9bb6f15914f362790861bf
[github/shaarli/Shaarli.git] / tests / front / controller / visitor / DailyControllerTest.php
1 <?php
2
3 declare(strict_types=1);
4
5 namespace Shaarli\Front\Controller\Visitor;
6
7 use PHPUnit\Framework\TestCase;
8 use Shaarli\Bookmark\Bookmark;
9 use Shaarli\Feed\CachedPage;
10 use Slim\Http\Request;
11 use Slim\Http\Response;
12
13 class DailyControllerTest extends TestCase
14 {
15 use FrontControllerMockHelper;
16
17 /** @var DailyController */
18 protected $controller;
19
20 public function setUp(): void
21 {
22 $this->createContainer();
23
24 $this->controller = new DailyController($this->container);
25 DailyController::$DAILY_RSS_NB_DAYS = 2;
26 }
27
28 public function testValidIndexControllerInvokeDefault(): void
29 {
30 $currentDay = new \DateTimeImmutable('2020-05-13');
31
32 $request = $this->createMock(Request::class);
33 $request->method('getQueryParam')->willReturn($currentDay->format('Ymd'));
34 $response = new Response();
35
36 // Save RainTPL assigned variables
37 $assignedVariables = [];
38 $this->assignTemplateVars($assignedVariables);
39
40 // Links dataset: 2 links with thumbnails
41 $this->container->bookmarkService
42 ->expects(static::once())
43 ->method('days')
44 ->willReturnCallback(function () use ($currentDay): array {
45 return [
46 '20200510',
47 $currentDay->format('Ymd'),
48 '20200516',
49 ];
50 })
51 ;
52 $this->container->bookmarkService
53 ->expects(static::once())
54 ->method('filterDay')
55 ->willReturnCallback(function (): array {
56 return [
57 (new Bookmark())
58 ->setId(1)
59 ->setUrl('http://url.tld')
60 ->setTitle(static::generateString(50))
61 ->setDescription(static::generateString(500))
62 ,
63 (new Bookmark())
64 ->setId(2)
65 ->setUrl('http://url2.tld')
66 ->setTitle(static::generateString(50))
67 ->setDescription(static::generateString(500))
68 ,
69 (new Bookmark())
70 ->setId(3)
71 ->setUrl('http://url3.tld')
72 ->setTitle(static::generateString(50))
73 ->setDescription(static::generateString(500))
74 ,
75 ];
76 })
77 ;
78
79 // Make sure that PluginManager hook is triggered
80 $this->container->pluginManager
81 ->expects(static::at(0))
82 ->method('executeHooks')
83 ->willReturnCallback(function (string $hook, array $data, array $param) use ($currentDay): array {
84 static::assertSame('render_daily', $hook);
85
86 static::assertArrayHasKey('linksToDisplay', $data);
87 static::assertCount(3, $data['linksToDisplay']);
88 static::assertSame(1, $data['linksToDisplay'][0]['id']);
89 static::assertSame($currentDay->getTimestamp(), $data['day']);
90 static::assertSame('20200510', $data['previousday']);
91 static::assertSame('20200516', $data['nextday']);
92
93 static::assertArrayHasKey('loggedin', $param);
94
95 return $data;
96 })
97 ;
98
99 $result = $this->controller->index($request, $response);
100
101 static::assertSame(200, $result->getStatusCode());
102 static::assertSame('daily', (string) $result->getBody());
103 static::assertSame(
104 'Daily - '. format_date($currentDay, false, true) .' - Shaarli',
105 $assignedVariables['pagetitle']
106 );
107 static::assertEquals($currentDay, $assignedVariables['dayDate']);
108 static::assertEquals($currentDay->getTimestamp(), $assignedVariables['day']);
109 static::assertCount(3, $assignedVariables['linksToDisplay']);
110
111 $link = $assignedVariables['linksToDisplay'][0];
112
113 static::assertSame(1, $link['id']);
114 static::assertSame('http://url.tld', $link['url']);
115 static::assertNotEmpty($link['title']);
116 static::assertNotEmpty($link['description']);
117 static::assertNotEmpty($link['formatedDescription']);
118
119 $link = $assignedVariables['linksToDisplay'][1];
120
121 static::assertSame(2, $link['id']);
122 static::assertSame('http://url2.tld', $link['url']);
123 static::assertNotEmpty($link['title']);
124 static::assertNotEmpty($link['description']);
125 static::assertNotEmpty($link['formatedDescription']);
126
127 $link = $assignedVariables['linksToDisplay'][2];
128
129 static::assertSame(3, $link['id']);
130 static::assertSame('http://url3.tld', $link['url']);
131 static::assertNotEmpty($link['title']);
132 static::assertNotEmpty($link['description']);
133 static::assertNotEmpty($link['formatedDescription']);
134
135 static::assertCount(3, $assignedVariables['cols']);
136 static::assertCount(1, $assignedVariables['cols'][0]);
137 static::assertCount(1, $assignedVariables['cols'][1]);
138 static::assertCount(1, $assignedVariables['cols'][2]);
139
140 $link = $assignedVariables['cols'][0][0];
141
142 static::assertSame(1, $link['id']);
143 static::assertSame('http://url.tld', $link['url']);
144 static::assertNotEmpty($link['title']);
145 static::assertNotEmpty($link['description']);
146 static::assertNotEmpty($link['formatedDescription']);
147
148 $link = $assignedVariables['cols'][1][0];
149
150 static::assertSame(2, $link['id']);
151 static::assertSame('http://url2.tld', $link['url']);
152 static::assertNotEmpty($link['title']);
153 static::assertNotEmpty($link['description']);
154 static::assertNotEmpty($link['formatedDescription']);
155
156 $link = $assignedVariables['cols'][2][0];
157
158 static::assertSame(3, $link['id']);
159 static::assertSame('http://url3.tld', $link['url']);
160 static::assertNotEmpty($link['title']);
161 static::assertNotEmpty($link['description']);
162 static::assertNotEmpty($link['formatedDescription']);
163 }
164
165 /**
166 * Daily page - test that everything goes fine with no future or past bookmarks
167 */
168 public function testValidIndexControllerInvokeNoFutureOrPast(): void
169 {
170 $currentDay = new \DateTimeImmutable('2020-05-13');
171
172 $request = $this->createMock(Request::class);
173 $response = new Response();
174
175 // Save RainTPL assigned variables
176 $assignedVariables = [];
177 $this->assignTemplateVars($assignedVariables);
178
179 // Links dataset: 2 links with thumbnails
180 $this->container->bookmarkService
181 ->expects(static::once())
182 ->method('days')
183 ->willReturnCallback(function () use ($currentDay): array {
184 return [
185 $currentDay->format($currentDay->format('Ymd')),
186 ];
187 })
188 ;
189 $this->container->bookmarkService
190 ->expects(static::once())
191 ->method('filterDay')
192 ->willReturnCallback(function (): array {
193 return [
194 (new Bookmark())
195 ->setId(1)
196 ->setUrl('http://url.tld')
197 ->setTitle(static::generateString(50))
198 ->setDescription(static::generateString(500))
199 ,
200 ];
201 })
202 ;
203
204 // Make sure that PluginManager hook is triggered
205 $this->container->pluginManager
206 ->expects(static::at(0))
207 ->method('executeHooks')
208 ->willReturnCallback(function (string $hook, array $data, array $param) use ($currentDay): array {
209 static::assertSame('render_daily', $hook);
210
211 static::assertArrayHasKey('linksToDisplay', $data);
212 static::assertCount(1, $data['linksToDisplay']);
213 static::assertSame(1, $data['linksToDisplay'][0]['id']);
214 static::assertSame($currentDay->getTimestamp(), $data['day']);
215 static::assertEmpty($data['previousday']);
216 static::assertEmpty($data['nextday']);
217
218 static::assertArrayHasKey('loggedin', $param);
219
220 return $data;
221 });
222
223 $result = $this->controller->index($request, $response);
224
225 static::assertSame(200, $result->getStatusCode());
226 static::assertSame('daily', (string) $result->getBody());
227 static::assertSame(
228 'Daily - '. format_date($currentDay, false, true) .' - Shaarli',
229 $assignedVariables['pagetitle']
230 );
231 static::assertCount(1, $assignedVariables['linksToDisplay']);
232
233 $link = $assignedVariables['linksToDisplay'][0];
234 static::assertSame(1, $link['id']);
235 }
236
237 /**
238 * Daily page - test that height adjustment in columns is working
239 */
240 public function testValidIndexControllerInvokeHeightAdjustment(): void
241 {
242 $currentDay = new \DateTimeImmutable('2020-05-13');
243
244 $request = $this->createMock(Request::class);
245 $response = new Response();
246
247 // Save RainTPL assigned variables
248 $assignedVariables = [];
249 $this->assignTemplateVars($assignedVariables);
250
251 // Links dataset: 2 links with thumbnails
252 $this->container->bookmarkService
253 ->expects(static::once())
254 ->method('days')
255 ->willReturnCallback(function () use ($currentDay): array {
256 return [
257 $currentDay->format($currentDay->format('Ymd')),
258 ];
259 })
260 ;
261 $this->container->bookmarkService
262 ->expects(static::once())
263 ->method('filterDay')
264 ->willReturnCallback(function (): array {
265 return [
266 (new Bookmark())->setId(1)->setUrl('http://url.tld')->setTitle('title'),
267 (new Bookmark())
268 ->setId(2)
269 ->setUrl('http://url.tld')
270 ->setTitle(static::generateString(50))
271 ->setDescription(static::generateString(5000))
272 ,
273 (new Bookmark())->setId(3)->setUrl('http://url.tld')->setTitle('title'),
274 (new Bookmark())->setId(4)->setUrl('http://url.tld')->setTitle('title'),
275 (new Bookmark())->setId(5)->setUrl('http://url.tld')->setTitle('title'),
276 (new Bookmark())->setId(6)->setUrl('http://url.tld')->setTitle('title'),
277 (new Bookmark())->setId(7)->setUrl('http://url.tld')->setTitle('title'),
278 ];
279 })
280 ;
281
282 // Make sure that PluginManager hook is triggered
283 $this->container->pluginManager
284 ->expects(static::at(0))
285 ->method('executeHooks')
286 ->willReturnCallback(function (string $hook, array $data, array $param): array {
287 return $data;
288 })
289 ;
290
291 $result = $this->controller->index($request, $response);
292
293 static::assertSame(200, $result->getStatusCode());
294 static::assertSame('daily', (string) $result->getBody());
295 static::assertCount(7, $assignedVariables['linksToDisplay']);
296
297 $columnIds = function (array $column): array {
298 return array_map(function (array $item): int { return $item['id']; }, $column);
299 };
300
301 static::assertSame([1, 4, 6], $columnIds($assignedVariables['cols'][0]));
302 static::assertSame([2], $columnIds($assignedVariables['cols'][1]));
303 static::assertSame([3, 5, 7], $columnIds($assignedVariables['cols'][2]));
304 }
305
306 /**
307 * Daily page - no bookmark
308 */
309 public function testValidIndexControllerInvokeNoBookmark(): void
310 {
311 $request = $this->createMock(Request::class);
312 $response = new Response();
313
314 // Save RainTPL assigned variables
315 $assignedVariables = [];
316 $this->assignTemplateVars($assignedVariables);
317
318 // Links dataset: 2 links with thumbnails
319 $this->container->bookmarkService
320 ->expects(static::once())
321 ->method('days')
322 ->willReturnCallback(function (): array {
323 return [];
324 })
325 ;
326 $this->container->bookmarkService
327 ->expects(static::once())
328 ->method('filterDay')
329 ->willReturnCallback(function (): array {
330 return [];
331 })
332 ;
333
334 // Make sure that PluginManager hook is triggered
335 $this->container->pluginManager
336 ->expects(static::at(0))
337 ->method('executeHooks')
338 ->willReturnCallback(function (string $hook, array $data, array $param): array {
339 return $data;
340 })
341 ;
342
343 $result = $this->controller->index($request, $response);
344
345 static::assertSame(200, $result->getStatusCode());
346 static::assertSame('daily', (string) $result->getBody());
347 static::assertCount(0, $assignedVariables['linksToDisplay']);
348 static::assertSame('Today', $assignedVariables['dayDesc']);
349 static::assertEquals((new \DateTime())->setTime(0, 0)->getTimestamp(), $assignedVariables['day']);
350 static::assertEquals((new \DateTime())->setTime(0, 0), $assignedVariables['dayDate']);
351 }
352
353 /**
354 * Daily RSS - default behaviour
355 */
356 public function testValidRssControllerInvokeDefault(): void
357 {
358 $dates = [
359 new \DateTimeImmutable('2020-05-17'),
360 new \DateTimeImmutable('2020-05-15'),
361 new \DateTimeImmutable('2020-05-13'),
362 ];
363
364 $request = $this->createMock(Request::class);
365 $response = new Response();
366
367 $this->container->bookmarkService->expects(static::once())->method('search')->willReturn([
368 (new Bookmark())->setId(1)->setCreated($dates[0])->setUrl('http://domain.tld/1'),
369 (new Bookmark())->setId(2)->setCreated($dates[1])->setUrl('http://domain.tld/2'),
370 (new Bookmark())->setId(3)->setCreated($dates[1])->setUrl('http://domain.tld/3'),
371 (new Bookmark())->setId(4)->setCreated($dates[2])->setUrl('http://domain.tld/4'),
372 ]);
373
374 $this->container->pageCacheManager
375 ->expects(static::once())
376 ->method('getCachePage')
377 ->willReturnCallback(function (): CachedPage {
378 $cachedPage = $this->createMock(CachedPage::class);
379 $cachedPage->expects(static::once())->method('cache')->with('dailyrss');
380
381 return $cachedPage;
382 }
383 );
384
385 // Save RainTPL assigned variables
386 $assignedVariables = [];
387 $this->assignTemplateVars($assignedVariables);
388
389 $result = $this->controller->rss($request, $response);
390
391 static::assertSame(200, $result->getStatusCode());
392 static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]);
393 static::assertSame('dailyrss', (string) $result->getBody());
394 static::assertSame('Shaarli', $assignedVariables['title']);
395 static::assertSame('http://shaarli/subfolder/', $assignedVariables['index_url']);
396 static::assertSame('http://shaarli/subfolder/daily-rss', $assignedVariables['page_url']);
397 static::assertFalse($assignedVariables['hide_timestamps']);
398 static::assertCount(2, $assignedVariables['days']);
399
400 $day = $assignedVariables['days'][$dates[0]->format('Ymd')];
401
402 static::assertEquals($dates[0], $day['date']);
403 static::assertSame($dates[0]->format(\DateTime::RSS), $day['date_rss']);
404 static::assertSame(format_date($dates[0], false), $day['date_human']);
405 static::assertSame('http://shaarli/subfolder/daily?day='. $dates[0]->format('Ymd'), $day['absolute_url']);
406 static::assertCount(1, $day['links']);
407 static::assertSame(1, $day['links'][0]['id']);
408 static::assertSame('http://domain.tld/1', $day['links'][0]['url']);
409 static::assertEquals($dates[0], $day['links'][0]['created']);
410
411 $day = $assignedVariables['days'][$dates[1]->format('Ymd')];
412
413 static::assertEquals($dates[1], $day['date']);
414 static::assertSame($dates[1]->format(\DateTime::RSS), $day['date_rss']);
415 static::assertSame(format_date($dates[1], false), $day['date_human']);
416 static::assertSame('http://shaarli/subfolder/daily?day='. $dates[1]->format('Ymd'), $day['absolute_url']);
417 static::assertCount(2, $day['links']);
418
419 static::assertSame(2, $day['links'][0]['id']);
420 static::assertSame('http://domain.tld/2', $day['links'][0]['url']);
421 static::assertEquals($dates[1], $day['links'][0]['created']);
422 static::assertSame(3, $day['links'][1]['id']);
423 static::assertSame('http://domain.tld/3', $day['links'][1]['url']);
424 static::assertEquals($dates[1], $day['links'][1]['created']);
425 }
426
427 /**
428 * Daily RSS - trigger cache rendering
429 */
430 public function testValidRssControllerInvokeTriggerCache(): void
431 {
432 $request = $this->createMock(Request::class);
433 $response = new Response();
434
435 $this->container->pageCacheManager->method('getCachePage')->willReturnCallback(function (): CachedPage {
436 $cachedPage = $this->createMock(CachedPage::class);
437 $cachedPage->method('cachedVersion')->willReturn('this is cache!');
438
439 return $cachedPage;
440 });
441
442 $this->container->bookmarkService->expects(static::never())->method('search');
443
444 $result = $this->controller->rss($request, $response);
445
446 static::assertSame(200, $result->getStatusCode());
447 static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]);
448 static::assertSame('this is cache!', (string) $result->getBody());
449 }
450
451 /**
452 * Daily RSS - No bookmark
453 */
454 public function testValidRssControllerInvokeNoBookmark(): void
455 {
456 $request = $this->createMock(Request::class);
457 $response = new Response();
458
459 $this->container->bookmarkService->expects(static::once())->method('search')->willReturn([]);
460
461 // Save RainTPL assigned variables
462 $assignedVariables = [];
463 $this->assignTemplateVars($assignedVariables);
464
465 $result = $this->controller->rss($request, $response);
466
467 static::assertSame(200, $result->getStatusCode());
468 static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]);
469 static::assertSame('dailyrss', (string) $result->getBody());
470 static::assertSame('Shaarli', $assignedVariables['title']);
471 static::assertSame('http://shaarli/subfolder/', $assignedVariables['index_url']);
472 static::assertSame('http://shaarli/subfolder/daily-rss', $assignedVariables['page_url']);
473 static::assertFalse($assignedVariables['hide_timestamps']);
474 static::assertCount(0, $assignedVariables['days']);
475 }
476 }