3 declare(strict_types
=1);
5 namespace Shaarli\Front\Controller\Visitor
;
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
;
13 class DailyControllerTest
extends TestCase
15 use FrontControllerMockHelper
;
17 /** @var DailyController */
18 protected $controller;
20 public function setUp(): void
22 $this->createContainer();
24 $this->controller
= new DailyController($this->container
);
25 DailyController
::$DAILY_RSS_NB_DAYS = 2;
28 public function testValidIndexControllerInvokeDefault(): void
30 $currentDay = new \
DateTimeImmutable('2020-05-13');
32 $request = $this->createMock(Request
::class);
33 $request->method('getQueryParam')->willReturn($currentDay->format('Ymd'));
34 $response = new Response();
36 // Save RainTPL assigned variables
37 $assignedVariables = [];
38 $this->assignTemplateVars($assignedVariables);
40 // Links dataset: 2 links with thumbnails
41 $this->container
->bookmarkService
42 ->expects(static::once())
44 ->willReturnCallback(function () use ($currentDay): array {
47 $currentDay->format('Ymd'),
52 $this->container
->bookmarkService
53 ->expects(static::once())
55 ->willReturnCallback(function (): array {
59 ->setUrl('http://url.tld')
60 ->setTitle(static::generateString(50))
61 ->setDescription(static::generateString(500))
65 ->setUrl('http://url2.tld')
66 ->setTitle(static::generateString(50))
67 ->setDescription(static::generateString(500))
71 ->setUrl('http://url3.tld')
72 ->setTitle(static::generateString(50))
73 ->setDescription(static::generateString(500))
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);
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']);
93 static::assertArrayHasKey('loggedin', $param);
99 $result = $this->controller
->index($request, $response);
101 static::assertSame(200, $result->getStatusCode());
102 static::assertSame('daily', (string) $result->getBody());
104 'Daily - '. format_date($currentDay, false, true) .' - Shaarli',
105 $assignedVariables['pagetitle']
107 static::assertEquals($currentDay, $assignedVariables['dayDate']);
108 static::assertEquals($currentDay->getTimestamp(), $assignedVariables['day']);
109 static::assertCount(3, $assignedVariables['linksToDisplay']);
111 $link = $assignedVariables['linksToDisplay'][0];
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']);
119 $link = $assignedVariables['linksToDisplay'][1];
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']);
127 $link = $assignedVariables['linksToDisplay'][2];
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']);
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]);
140 $link = $assignedVariables['cols'][0][0];
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']);
148 $link = $assignedVariables['cols'][1][0];
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']);
156 $link = $assignedVariables['cols'][2][0];
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']);
166 * Daily page - test that everything goes fine with no future or past bookmarks
168 public function testValidIndexControllerInvokeNoFutureOrPast(): void
170 $currentDay = new \
DateTimeImmutable('2020-05-13');
172 $request = $this->createMock(Request
::class);
173 $response = new Response();
175 // Save RainTPL assigned variables
176 $assignedVariables = [];
177 $this->assignTemplateVars($assignedVariables);
179 // Links dataset: 2 links with thumbnails
180 $this->container
->bookmarkService
181 ->expects(static::once())
183 ->willReturnCallback(function () use ($currentDay): array {
185 $currentDay->format($currentDay->format('Ymd')),
189 $this->container
->bookmarkService
190 ->expects(static::once())
191 ->method('filterDay')
192 ->willReturnCallback(function (): array {
196 ->setUrl('http://url.tld')
197 ->setTitle(static::generateString(50))
198 ->setDescription(static::generateString(500))
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);
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']);
218 static::assertArrayHasKey('loggedin', $param);
223 $result = $this->controller
->index($request, $response);
225 static::assertSame(200, $result->getStatusCode());
226 static::assertSame('daily', (string) $result->getBody());
228 'Daily - '. format_date($currentDay, false, true) .' - Shaarli',
229 $assignedVariables['pagetitle']
231 static::assertCount(1, $assignedVariables['linksToDisplay']);
233 $link = $assignedVariables['linksToDisplay'][0];
234 static::assertSame(1, $link['id']);
238 * Daily page - test that height adjustment in columns is working
240 public function testValidIndexControllerInvokeHeightAdjustment(): void
242 $currentDay = new \
DateTimeImmutable('2020-05-13');
244 $request = $this->createMock(Request
::class);
245 $response = new Response();
247 // Save RainTPL assigned variables
248 $assignedVariables = [];
249 $this->assignTemplateVars($assignedVariables);
251 // Links dataset: 2 links with thumbnails
252 $this->container
->bookmarkService
253 ->expects(static::once())
255 ->willReturnCallback(function () use ($currentDay): array {
257 $currentDay->format($currentDay->format('Ymd')),
261 $this->container
->bookmarkService
262 ->expects(static::once())
263 ->method('filterDay')
264 ->willReturnCallback(function (): array {
266 (new Bookmark())->setId(1)->setUrl('http://url.tld')->setTitle('title'),
269 ->setUrl('http://url.tld')
270 ->setTitle(static::generateString(50))
271 ->setDescription(static::generateString(5000))
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'),
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 {
291 $result = $this->controller
->index($request, $response);
293 static::assertSame(200, $result->getStatusCode());
294 static::assertSame('daily', (string) $result->getBody());
295 static::assertCount(7, $assignedVariables['linksToDisplay']);
297 $columnIds = function (array $column): array {
298 return array_map(function (array $item): int {
return $item
['id']; }, $column);
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]));
307 * Daily page - no bookmark
309 public function testValidIndexControllerInvokeNoBookmark(): void
311 $request = $this->createMock(Request
::class);
312 $response = new Response();
314 // Save RainTPL assigned variables
315 $assignedVariables = [];
316 $this->assignTemplateVars($assignedVariables);
318 // Links dataset: 2 links with thumbnails
319 $this->container
->bookmarkService
320 ->expects(static::once())
322 ->willReturnCallback(function (): array {
326 $this->container
->bookmarkService
327 ->expects(static::once())
328 ->method('filterDay')
329 ->willReturnCallback(function (): array {
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 {
343 $result = $this->controller
->index($request, $response);
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']);
354 * Daily RSS - default behaviour
356 public function testValidRssControllerInvokeDefault(): void
359 new \
DateTimeImmutable('2020-05-17'),
360 new \
DateTimeImmutable('2020-05-15'),
361 new \
DateTimeImmutable('2020-05-13'),
364 $request = $this->createMock(Request
::class);
365 $response = new Response();
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'),
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');
385 // Save RainTPL assigned variables
386 $assignedVariables = [];
387 $this->assignTemplateVars($assignedVariables);
389 $result = $this->controller
->rss($request, $response);
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', $assignedVariables['index_url']);
396 static::assertSame('http://shaarli/daily-rss', $assignedVariables['page_url']);
397 static::assertFalse($assignedVariables['hide_timestamps']);
398 static::assertCount(2, $assignedVariables['days']);
400 $day = $assignedVariables['days'][$dates[0]->format('Ymd')];
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/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']);
411 $day = $assignedVariables['days'][$dates[1]->format('Ymd')];
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/daily?day='. $dates[1]->format('Ymd'), $day['absolute_url']);
417 static::assertCount(2, $day['links']);
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']);
428 * Daily RSS - trigger cache rendering
430 public function testValidRssControllerInvokeTriggerCache(): void
432 $request = $this->createMock(Request
::class);
433 $response = new Response();
435 $this->container
->pageCacheManager
->method('getCachePage')->willReturnCallback(function (): CachedPage
{
436 $cachedPage = $this->createMock(CachedPage
::class);
437 $cachedPage->method('cachedVersion')->willReturn('this is cache!');
442 $this->container
->bookmarkService
->expects(static::never())->method('search');
444 $result = $this->controller
->rss($request, $response);
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());
452 * Daily RSS - No bookmark
454 public function testValidRssControllerInvokeNoBookmark(): void
456 $request = $this->createMock(Request
::class);
457 $response = new Response();
459 $this->container
->bookmarkService
->expects(static::once())->method('search')->willReturn([]);
461 // Save RainTPL assigned variables
462 $assignedVariables = [];
463 $this->assignTemplateVars($assignedVariables);
465 $result = $this->controller
->rss($request, $response);
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', $assignedVariables['index_url']);
472 static::assertSame('http://shaarli/daily-rss', $assignedVariables['page_url']);
473 static::assertFalse($assignedVariables['hide_timestamps']);
474 static::assertCount(0, $assignedVariables['days']);