]>
Commit | Line | Data |
---|---|---|
1 | <?php | |
2 | ||
3 | declare(strict_types=1); | |
4 | ||
5 | namespace Shaarli\Front\Controller\Visitor; | |
6 | ||
7 | use Shaarli\Bookmark\Bookmark; | |
8 | use Shaarli\Bookmark\SearchResult; | |
9 | use Shaarli\Feed\CachedPage; | |
10 | use Shaarli\TestCase; | |
11 | use Slim\Http\Request; | |
12 | use Slim\Http\Response; | |
13 | ||
14 | class DailyControllerTest extends TestCase | |
15 | { | |
16 | use FrontControllerMockHelper; | |
17 | ||
18 | /** @var DailyController */ | |
19 | protected $controller; | |
20 | ||
21 | public function setUp(): void | |
22 | { | |
23 | $this->createContainer(); | |
24 | ||
25 | $this->controller = new DailyController($this->container); | |
26 | DailyController::$DAILY_RSS_NB_DAYS = 2; | |
27 | } | |
28 | ||
29 | public function testValidIndexControllerInvokeDefault(): void | |
30 | { | |
31 | $currentDay = new \DateTimeImmutable('2020-05-13'); | |
32 | $previousDate = new \DateTime('2 days ago 00:00:00'); | |
33 | $nextDate = new \DateTime('today 00:00:00'); | |
34 | ||
35 | $request = $this->createMock(Request::class); | |
36 | $request->method('getQueryParam')->willReturnCallback(function (string $key) use ($currentDay): ?string { | |
37 | return $key === 'day' ? $currentDay->format('Ymd') : null; | |
38 | }); | |
39 | $response = new Response(); | |
40 | ||
41 | // Save RainTPL assigned variables | |
42 | $assignedVariables = []; | |
43 | $this->assignTemplateVars($assignedVariables); | |
44 | ||
45 | $this->container->bookmarkService | |
46 | ->expects(static::once()) | |
47 | ->method('findByDate') | |
48 | ->willReturnCallback( | |
49 | function ($from, $to, &$previous, &$next) use ($currentDay, $previousDate, $nextDate): array { | |
50 | $previous = $previousDate; | |
51 | $next = $nextDate; | |
52 | ||
53 | return [ | |
54 | (new Bookmark()) | |
55 | ->setId(1) | |
56 | ->setUrl('http://url.tld') | |
57 | ->setTitle(static::generateString(50)) | |
58 | ->setDescription(static::generateString(500)) | |
59 | , | |
60 | (new Bookmark()) | |
61 | ->setId(2) | |
62 | ->setUrl('http://url2.tld') | |
63 | ->setTitle(static::generateString(50)) | |
64 | ->setDescription(static::generateString(500)) | |
65 | , | |
66 | (new Bookmark()) | |
67 | ->setId(3) | |
68 | ->setUrl('http://url3.tld') | |
69 | ->setTitle(static::generateString(50)) | |
70 | ->setDescription(static::generateString(500)) | |
71 | , | |
72 | ]; | |
73 | } | |
74 | ) | |
75 | ; | |
76 | ||
77 | // Make sure that PluginManager hook is triggered | |
78 | $this->container->pluginManager | |
79 | ->expects(static::atLeastOnce()) | |
80 | ->method('executeHooks') | |
81 | ->withConsecutive(['render_daily']) | |
82 | ->willReturnCallback( | |
83 | function (string $hook, array $data, array $param) use ($currentDay, $previousDate, $nextDate): array { | |
84 | if ('render_daily' === $hook) { | |
85 | static::assertArrayHasKey('linksToDisplay', $data); | |
86 | static::assertCount(3, $data['linksToDisplay']); | |
87 | static::assertSame(1, $data['linksToDisplay'][0]['id']); | |
88 | static::assertSame($currentDay->getTimestamp(), $data['day']); | |
89 | static::assertSame($previousDate->format('Ymd'), $data['previousday']); | |
90 | static::assertSame($nextDate->format('Ymd'), $data['nextday']); | |
91 | ||
92 | static::assertArrayHasKey('loggedin', $param); | |
93 | } | |
94 | ||
95 | return $data; | |
96 | } | |
97 | ) | |
98 | ; | |
99 | ||
100 | $result = $this->controller->index($request, $response); | |
101 | ||
102 | static::assertSame(200, $result->getStatusCode()); | |
103 | static::assertSame('daily', (string) $result->getBody()); | |
104 | static::assertSame( | |
105 | 'Daily - '. format_date($currentDay, false, true) .' - Shaarli', | |
106 | $assignedVariables['pagetitle'] | |
107 | ); | |
108 | static::assertEquals($currentDay, $assignedVariables['dayDate']); | |
109 | static::assertEquals($currentDay->getTimestamp(), $assignedVariables['day']); | |
110 | static::assertSame($previousDate->format('Ymd'), $assignedVariables['previousday']); | |
111 | static::assertSame($nextDate->format('Ymd'), $assignedVariables['nextday']); | |
112 | static::assertSame('day', $assignedVariables['type']); | |
113 | static::assertSame('May 13, 2020', $assignedVariables['dayDesc']); | |
114 | static::assertSame('Daily', $assignedVariables['localizedType']); | |
115 | static::assertCount(3, $assignedVariables['linksToDisplay']); | |
116 | ||
117 | $link = $assignedVariables['linksToDisplay'][0]; | |
118 | ||
119 | static::assertSame(1, $link['id']); | |
120 | static::assertSame('http://url.tld', $link['url']); | |
121 | static::assertNotEmpty($link['title']); | |
122 | static::assertNotEmpty($link['description']); | |
123 | static::assertNotEmpty($link['formatedDescription']); | |
124 | ||
125 | $link = $assignedVariables['linksToDisplay'][1]; | |
126 | ||
127 | static::assertSame(2, $link['id']); | |
128 | static::assertSame('http://url2.tld', $link['url']); | |
129 | static::assertNotEmpty($link['title']); | |
130 | static::assertNotEmpty($link['description']); | |
131 | static::assertNotEmpty($link['formatedDescription']); | |
132 | ||
133 | $link = $assignedVariables['linksToDisplay'][2]; | |
134 | ||
135 | static::assertSame(3, $link['id']); | |
136 | static::assertSame('http://url3.tld', $link['url']); | |
137 | static::assertNotEmpty($link['title']); | |
138 | static::assertNotEmpty($link['description']); | |
139 | static::assertNotEmpty($link['formatedDescription']); | |
140 | ||
141 | static::assertCount(3, $assignedVariables['cols']); | |
142 | static::assertCount(1, $assignedVariables['cols'][0]); | |
143 | static::assertCount(1, $assignedVariables['cols'][1]); | |
144 | static::assertCount(1, $assignedVariables['cols'][2]); | |
145 | ||
146 | $link = $assignedVariables['cols'][0][0]; | |
147 | ||
148 | static::assertSame(1, $link['id']); | |
149 | static::assertSame('http://url.tld', $link['url']); | |
150 | static::assertNotEmpty($link['title']); | |
151 | static::assertNotEmpty($link['description']); | |
152 | static::assertNotEmpty($link['formatedDescription']); | |
153 | ||
154 | $link = $assignedVariables['cols'][1][0]; | |
155 | ||
156 | static::assertSame(2, $link['id']); | |
157 | static::assertSame('http://url2.tld', $link['url']); | |
158 | static::assertNotEmpty($link['title']); | |
159 | static::assertNotEmpty($link['description']); | |
160 | static::assertNotEmpty($link['formatedDescription']); | |
161 | ||
162 | $link = $assignedVariables['cols'][2][0]; | |
163 | ||
164 | static::assertSame(3, $link['id']); | |
165 | static::assertSame('http://url3.tld', $link['url']); | |
166 | static::assertNotEmpty($link['title']); | |
167 | static::assertNotEmpty($link['description']); | |
168 | static::assertNotEmpty($link['formatedDescription']); | |
169 | } | |
170 | ||
171 | /** | |
172 | * Daily page - test that everything goes fine with no future or past bookmarks | |
173 | */ | |
174 | public function testValidIndexControllerInvokeNoFutureOrPast(): void | |
175 | { | |
176 | $currentDay = new \DateTimeImmutable('2020-05-13'); | |
177 | ||
178 | $request = $this->createMock(Request::class); | |
179 | $request->method('getQueryParam')->willReturnCallback(function (string $key) use ($currentDay): ?string { | |
180 | return $key === 'day' ? $currentDay->format('Ymd') : null; | |
181 | }); | |
182 | $response = new Response(); | |
183 | ||
184 | // Save RainTPL assigned variables | |
185 | $assignedVariables = []; | |
186 | $this->assignTemplateVars($assignedVariables); | |
187 | ||
188 | $this->container->bookmarkService | |
189 | ->expects(static::once()) | |
190 | ->method('findByDate') | |
191 | ->willReturnCallback(function () use ($currentDay): array { | |
192 | return [ | |
193 | (new Bookmark()) | |
194 | ->setId(1) | |
195 | ->setUrl('http://url.tld') | |
196 | ->setTitle(static::generateString(50)) | |
197 | ->setDescription(static::generateString(500)) | |
198 | , | |
199 | ]; | |
200 | }) | |
201 | ; | |
202 | ||
203 | // Make sure that PluginManager hook is triggered | |
204 | $this->container->pluginManager | |
205 | ->expects(static::atLeastOnce()) | |
206 | ->method('executeHooks') | |
207 | ->withConsecutive(['render_daily']) | |
208 | ->willReturnCallback(function (string $hook, array $data, array $param) use ($currentDay): array { | |
209 | if ('render_daily' === $hook) { | |
210 | static::assertArrayHasKey('linksToDisplay', $data); | |
211 | static::assertCount(1, $data['linksToDisplay']); | |
212 | static::assertSame(1, $data['linksToDisplay'][0]['id']); | |
213 | static::assertSame($currentDay->getTimestamp(), $data['day']); | |
214 | static::assertEmpty($data['previousday']); | |
215 | static::assertEmpty($data['nextday']); | |
216 | ||
217 | static::assertArrayHasKey('loggedin', $param); | |
218 | } | |
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 | $this->container->bookmarkService | |
252 | ->expects(static::once()) | |
253 | ->method('findByDate') | |
254 | ->willReturnCallback(function () use ($currentDay): array { | |
255 | return [ | |
256 | (new Bookmark())->setId(1)->setUrl('http://url.tld')->setTitle('title'), | |
257 | (new Bookmark()) | |
258 | ->setId(2) | |
259 | ->setUrl('http://url.tld') | |
260 | ->setTitle(static::generateString(50)) | |
261 | ->setDescription(static::generateString(5000)) | |
262 | , | |
263 | (new Bookmark())->setId(3)->setUrl('http://url.tld')->setTitle('title'), | |
264 | (new Bookmark())->setId(4)->setUrl('http://url.tld')->setTitle('title'), | |
265 | (new Bookmark())->setId(5)->setUrl('http://url.tld')->setTitle('title'), | |
266 | (new Bookmark())->setId(6)->setUrl('http://url.tld')->setTitle('title'), | |
267 | (new Bookmark())->setId(7)->setUrl('http://url.tld')->setTitle('title'), | |
268 | ]; | |
269 | }) | |
270 | ; | |
271 | ||
272 | // Make sure that PluginManager hook is triggered | |
273 | $this->container->pluginManager | |
274 | ->expects(static::atLeastOnce()) | |
275 | ->method('executeHooks') | |
276 | ->willReturnCallback(function (string $hook, array $data, array $param): array { | |
277 | return $data; | |
278 | }) | |
279 | ; | |
280 | ||
281 | $result = $this->controller->index($request, $response); | |
282 | ||
283 | static::assertSame(200, $result->getStatusCode()); | |
284 | static::assertSame('daily', (string) $result->getBody()); | |
285 | static::assertCount(7, $assignedVariables['linksToDisplay']); | |
286 | ||
287 | $columnIds = function (array $column): array { | |
288 | return array_map(function (array $item): int { return $item['id']; }, $column); | |
289 | }; | |
290 | ||
291 | static::assertSame([1, 4, 6], $columnIds($assignedVariables['cols'][0])); | |
292 | static::assertSame([2], $columnIds($assignedVariables['cols'][1])); | |
293 | static::assertSame([3, 5, 7], $columnIds($assignedVariables['cols'][2])); | |
294 | } | |
295 | ||
296 | /** | |
297 | * Daily page - no bookmark | |
298 | */ | |
299 | public function testValidIndexControllerInvokeNoBookmark(): void | |
300 | { | |
301 | $request = $this->createMock(Request::class); | |
302 | $response = new Response(); | |
303 | ||
304 | // Save RainTPL assigned variables | |
305 | $assignedVariables = []; | |
306 | $this->assignTemplateVars($assignedVariables); | |
307 | ||
308 | // Links dataset: 2 links with thumbnails | |
309 | $this->container->bookmarkService | |
310 | ->expects(static::once()) | |
311 | ->method('findByDate') | |
312 | ->willReturnCallback(function (): array { | |
313 | return []; | |
314 | }) | |
315 | ; | |
316 | ||
317 | // Make sure that PluginManager hook is triggered | |
318 | $this->container->pluginManager | |
319 | ->expects(static::atLeastOnce()) | |
320 | ->method('executeHooks') | |
321 | ->willReturnCallback(function (string $hook, array $data, array $param): array { | |
322 | return $data; | |
323 | }) | |
324 | ; | |
325 | ||
326 | $result = $this->controller->index($request, $response); | |
327 | ||
328 | static::assertSame(200, $result->getStatusCode()); | |
329 | static::assertSame('daily', (string) $result->getBody()); | |
330 | static::assertCount(0, $assignedVariables['linksToDisplay']); | |
331 | static::assertSame('Today - ' . (new \DateTime())->format('F j, Y'), $assignedVariables['dayDesc']); | |
332 | static::assertEquals((new \DateTime())->setTime(0, 0)->getTimestamp(), $assignedVariables['day']); | |
333 | static::assertEquals((new \DateTime())->setTime(0, 0), $assignedVariables['dayDate']); | |
334 | } | |
335 | ||
336 | /** | |
337 | * Daily RSS - default behaviour | |
338 | */ | |
339 | public function testValidRssControllerInvokeDefault(): void | |
340 | { | |
341 | $dates = [ | |
342 | new \DateTimeImmutable('2020-05-17'), | |
343 | new \DateTimeImmutable('2020-05-15'), | |
344 | new \DateTimeImmutable('2020-05-13'), | |
345 | new \DateTimeImmutable('+1 month'), | |
346 | ]; | |
347 | ||
348 | $request = $this->createMock(Request::class); | |
349 | $response = new Response(); | |
350 | ||
351 | $this->container->bookmarkService->expects(static::once())->method('search')->willReturn( | |
352 | SearchResult::getSearchResult([ | |
353 | (new Bookmark())->setId(1)->setCreated($dates[0])->setUrl('http://domain.tld/1'), | |
354 | (new Bookmark())->setId(2)->setCreated($dates[1])->setUrl('http://domain.tld/2'), | |
355 | (new Bookmark())->setId(3)->setCreated($dates[1])->setUrl('http://domain.tld/3'), | |
356 | (new Bookmark())->setId(4)->setCreated($dates[2])->setUrl('http://domain.tld/4'), | |
357 | (new Bookmark())->setId(5)->setCreated($dates[3])->setUrl('http://domain.tld/5'), | |
358 | ]) | |
359 | ); | |
360 | ||
361 | $this->container->pageCacheManager | |
362 | ->expects(static::once()) | |
363 | ->method('getCachePage') | |
364 | ->willReturnCallback(function (): CachedPage { | |
365 | $cachedPage = $this->createMock(CachedPage::class); | |
366 | $cachedPage->expects(static::once())->method('cache')->with('dailyrss'); | |
367 | ||
368 | return $cachedPage; | |
369 | } | |
370 | ); | |
371 | ||
372 | // Save RainTPL assigned variables | |
373 | $assignedVariables = []; | |
374 | $this->assignTemplateVars($assignedVariables); | |
375 | ||
376 | $result = $this->controller->rss($request, $response); | |
377 | ||
378 | static::assertSame(200, $result->getStatusCode()); | |
379 | static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]); | |
380 | static::assertSame('dailyrss', (string) $result->getBody()); | |
381 | static::assertSame('Shaarli', $assignedVariables['title']); | |
382 | static::assertSame('http://shaarli/subfolder/', $assignedVariables['index_url']); | |
383 | static::assertSame('http://shaarli/subfolder/daily-rss', $assignedVariables['page_url']); | |
384 | static::assertFalse($assignedVariables['hide_timestamps']); | |
385 | static::assertCount(3, $assignedVariables['days']); | |
386 | ||
387 | $day = $assignedVariables['days'][$dates[0]->format('Ymd')]; | |
388 | $date = $dates[0]->setTime(23, 59, 59); | |
389 | ||
390 | static::assertEquals($date, $day['date']); | |
391 | static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); | |
392 | static::assertSame(format_date($date, false), $day['date_human']); | |
393 | static::assertSame('http://shaarli/subfolder/daily?day='. $dates[0]->format('Ymd'), $day['absolute_url']); | |
394 | static::assertCount(1, $day['links']); | |
395 | static::assertSame(1, $day['links'][0]['id']); | |
396 | static::assertSame('http://domain.tld/1', $day['links'][0]['url']); | |
397 | static::assertEquals($dates[0], $day['links'][0]['created']); | |
398 | ||
399 | $day = $assignedVariables['days'][$dates[1]->format('Ymd')]; | |
400 | $date = $dates[1]->setTime(23, 59, 59); | |
401 | ||
402 | static::assertEquals($date, $day['date']); | |
403 | static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); | |
404 | static::assertSame(format_date($date, false), $day['date_human']); | |
405 | static::assertSame('http://shaarli/subfolder/daily?day='. $dates[1]->format('Ymd'), $day['absolute_url']); | |
406 | static::assertCount(2, $day['links']); | |
407 | ||
408 | static::assertSame(2, $day['links'][0]['id']); | |
409 | static::assertSame('http://domain.tld/2', $day['links'][0]['url']); | |
410 | static::assertEquals($dates[1], $day['links'][0]['created']); | |
411 | static::assertSame(3, $day['links'][1]['id']); | |
412 | static::assertSame('http://domain.tld/3', $day['links'][1]['url']); | |
413 | static::assertEquals($dates[1], $day['links'][1]['created']); | |
414 | ||
415 | $day = $assignedVariables['days'][$dates[2]->format('Ymd')]; | |
416 | $date = $dates[2]->setTime(23, 59, 59); | |
417 | ||
418 | static::assertEquals($date, $day['date']); | |
419 | static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); | |
420 | static::assertSame(format_date($date, false), $day['date_human']); | |
421 | static::assertSame('http://shaarli/subfolder/daily?day='. $dates[2]->format('Ymd'), $day['absolute_url']); | |
422 | static::assertCount(1, $day['links']); | |
423 | static::assertSame(4, $day['links'][0]['id']); | |
424 | static::assertSame('http://domain.tld/4', $day['links'][0]['url']); | |
425 | static::assertEquals($dates[2], $day['links'][0]['created']); | |
426 | } | |
427 | ||
428 | /** | |
429 | * Daily RSS - trigger cache rendering | |
430 | */ | |
431 | public function testValidRssControllerInvokeTriggerCache(): void | |
432 | { | |
433 | $request = $this->createMock(Request::class); | |
434 | $response = new Response(); | |
435 | ||
436 | $this->container->pageCacheManager->method('getCachePage')->willReturnCallback(function (): CachedPage { | |
437 | $cachedPage = $this->createMock(CachedPage::class); | |
438 | $cachedPage->method('cachedVersion')->willReturn('this is cache!'); | |
439 | ||
440 | return $cachedPage; | |
441 | }); | |
442 | ||
443 | $this->container->bookmarkService->expects(static::never())->method('search'); | |
444 | ||
445 | $result = $this->controller->rss($request, $response); | |
446 | ||
447 | static::assertSame(200, $result->getStatusCode()); | |
448 | static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]); | |
449 | static::assertSame('this is cache!', (string) $result->getBody()); | |
450 | } | |
451 | ||
452 | /** | |
453 | * Daily RSS - No bookmark | |
454 | */ | |
455 | public function testValidRssControllerInvokeNoBookmark(): void | |
456 | { | |
457 | $request = $this->createMock(Request::class); | |
458 | $response = new Response(); | |
459 | ||
460 | $this->container->bookmarkService | |
461 | ->expects(static::once())->method('search') | |
462 | ->willReturn(SearchResult::getSearchResult([])); | |
463 | ||
464 | // Save RainTPL assigned variables | |
465 | $assignedVariables = []; | |
466 | $this->assignTemplateVars($assignedVariables); | |
467 | ||
468 | $result = $this->controller->rss($request, $response); | |
469 | ||
470 | static::assertSame(200, $result->getStatusCode()); | |
471 | static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]); | |
472 | static::assertSame('dailyrss', (string) $result->getBody()); | |
473 | static::assertSame('Shaarli', $assignedVariables['title']); | |
474 | static::assertSame('http://shaarli/subfolder/', $assignedVariables['index_url']); | |
475 | static::assertSame('http://shaarli/subfolder/daily-rss', $assignedVariables['page_url']); | |
476 | static::assertFalse($assignedVariables['hide_timestamps']); | |
477 | static::assertCount(0, $assignedVariables['days']); | |
478 | } | |
479 | ||
480 | /** | |
481 | * Test simple display index with week parameter | |
482 | */ | |
483 | public function testSimpleIndexWeekly(): void | |
484 | { | |
485 | $currentDay = new \DateTimeImmutable('2020-05-13'); | |
486 | $expectedDay = new \DateTimeImmutable('2020-05-11'); | |
487 | ||
488 | $request = $this->createMock(Request::class); | |
489 | $request->method('getQueryParam')->willReturnCallback(function (string $key) use ($currentDay): ?string { | |
490 | return $key === 'week' ? $currentDay->format('YW') : null; | |
491 | }); | |
492 | $response = new Response(); | |
493 | ||
494 | // Save RainTPL assigned variables | |
495 | $assignedVariables = []; | |
496 | $this->assignTemplateVars($assignedVariables); | |
497 | ||
498 | $this->container->bookmarkService | |
499 | ->expects(static::once()) | |
500 | ->method('findByDate') | |
501 | ->willReturnCallback( | |
502 | function (): array { | |
503 | return [ | |
504 | (new Bookmark()) | |
505 | ->setId(1) | |
506 | ->setUrl('http://url.tld') | |
507 | ->setTitle(static::generateString(50)) | |
508 | ->setDescription(static::generateString(500)) | |
509 | , | |
510 | (new Bookmark()) | |
511 | ->setId(2) | |
512 | ->setUrl('http://url2.tld') | |
513 | ->setTitle(static::generateString(50)) | |
514 | ->setDescription(static::generateString(500)) | |
515 | , | |
516 | ]; | |
517 | } | |
518 | ) | |
519 | ; | |
520 | ||
521 | $result = $this->controller->index($request, $response); | |
522 | ||
523 | static::assertSame(200, $result->getStatusCode()); | |
524 | static::assertSame('daily', (string) $result->getBody()); | |
525 | static::assertSame( | |
526 | 'Weekly - Week 20 (May 11, 2020) - Shaarli', | |
527 | $assignedVariables['pagetitle'] | |
528 | ); | |
529 | ||
530 | static::assertCount(2, $assignedVariables['linksToDisplay']); | |
531 | static::assertEquals($expectedDay->setTime(0, 0), $assignedVariables['dayDate']); | |
532 | static::assertSame($expectedDay->setTime(0, 0)->getTimestamp(), $assignedVariables['day']); | |
533 | static::assertSame('', $assignedVariables['previousday']); | |
534 | static::assertSame('', $assignedVariables['nextday']); | |
535 | static::assertSame('Week 20 (May 11, 2020)', $assignedVariables['dayDesc']); | |
536 | static::assertSame('week', $assignedVariables['type']); | |
537 | static::assertSame('Weekly', $assignedVariables['localizedType']); | |
538 | } | |
539 | ||
540 | /** | |
541 | * Test simple display index with month parameter | |
542 | */ | |
543 | public function testSimpleIndexMonthly(): void | |
544 | { | |
545 | $currentDay = new \DateTimeImmutable('2020-05-13'); | |
546 | $expectedDay = new \DateTimeImmutable('2020-05-01'); | |
547 | ||
548 | $request = $this->createMock(Request::class); | |
549 | $request->method('getQueryParam')->willReturnCallback(function (string $key) use ($currentDay): ?string { | |
550 | return $key === 'month' ? $currentDay->format('Ym') : null; | |
551 | }); | |
552 | $response = new Response(); | |
553 | ||
554 | // Save RainTPL assigned variables | |
555 | $assignedVariables = []; | |
556 | $this->assignTemplateVars($assignedVariables); | |
557 | ||
558 | $this->container->bookmarkService | |
559 | ->expects(static::once()) | |
560 | ->method('findByDate') | |
561 | ->willReturnCallback( | |
562 | function (): array { | |
563 | return [ | |
564 | (new Bookmark()) | |
565 | ->setId(1) | |
566 | ->setUrl('http://url.tld') | |
567 | ->setTitle(static::generateString(50)) | |
568 | ->setDescription(static::generateString(500)) | |
569 | , | |
570 | (new Bookmark()) | |
571 | ->setId(2) | |
572 | ->setUrl('http://url2.tld') | |
573 | ->setTitle(static::generateString(50)) | |
574 | ->setDescription(static::generateString(500)) | |
575 | , | |
576 | ]; | |
577 | } | |
578 | ) | |
579 | ; | |
580 | ||
581 | $result = $this->controller->index($request, $response); | |
582 | ||
583 | static::assertSame(200, $result->getStatusCode()); | |
584 | static::assertSame('daily', (string) $result->getBody()); | |
585 | static::assertSame( | |
586 | 'Monthly - May, 2020 - Shaarli', | |
587 | $assignedVariables['pagetitle'] | |
588 | ); | |
589 | ||
590 | static::assertCount(2, $assignedVariables['linksToDisplay']); | |
591 | static::assertEquals($expectedDay->setTime(0, 0), $assignedVariables['dayDate']); | |
592 | static::assertSame($expectedDay->setTime(0, 0)->getTimestamp(), $assignedVariables['day']); | |
593 | static::assertSame('', $assignedVariables['previousday']); | |
594 | static::assertSame('', $assignedVariables['nextday']); | |
595 | static::assertSame('May, 2020', $assignedVariables['dayDesc']); | |
596 | static::assertSame('month', $assignedVariables['type']); | |
597 | static::assertSame('Monthly', $assignedVariables['localizedType']); | |
598 | } | |
599 | ||
600 | /** | |
601 | * Test simple display RSS with week parameter | |
602 | */ | |
603 | public function testSimpleRssWeekly(): void | |
604 | { | |
605 | $dates = [ | |
606 | new \DateTimeImmutable('2020-05-19'), | |
607 | new \DateTimeImmutable('2020-05-13'), | |
608 | ]; | |
609 | $expectedDates = [ | |
610 | new \DateTimeImmutable('2020-05-24 23:59:59'), | |
611 | new \DateTimeImmutable('2020-05-17 23:59:59'), | |
612 | ]; | |
613 | ||
614 | $this->container->environment['QUERY_STRING'] = 'week'; | |
615 | $request = $this->createMock(Request::class); | |
616 | $request->method('getQueryParam')->willReturnCallback(function (string $key): ?string { | |
617 | return $key === 'week' ? '' : null; | |
618 | }); | |
619 | $response = new Response(); | |
620 | ||
621 | $this->container->bookmarkService->expects(static::once())->method('search')->willReturn( | |
622 | SearchResult::getSearchResult([ | |
623 | (new Bookmark())->setId(1)->setCreated($dates[0])->setUrl('http://domain.tld/1'), | |
624 | (new Bookmark())->setId(2)->setCreated($dates[1])->setUrl('http://domain.tld/2'), | |
625 | (new Bookmark())->setId(3)->setCreated($dates[1])->setUrl('http://domain.tld/3'), | |
626 | ]) | |
627 | ); | |
628 | ||
629 | // Save RainTPL assigned variables | |
630 | $assignedVariables = []; | |
631 | $this->assignTemplateVars($assignedVariables); | |
632 | ||
633 | $result = $this->controller->rss($request, $response); | |
634 | ||
635 | static::assertSame(200, $result->getStatusCode()); | |
636 | static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]); | |
637 | static::assertSame('dailyrss', (string) $result->getBody()); | |
638 | static::assertSame('Shaarli', $assignedVariables['title']); | |
639 | static::assertSame('http://shaarli/subfolder/', $assignedVariables['index_url']); | |
640 | static::assertSame('http://shaarli/subfolder/daily-rss?week', $assignedVariables['page_url']); | |
641 | static::assertFalse($assignedVariables['hide_timestamps']); | |
642 | static::assertCount(2, $assignedVariables['days']); | |
643 | ||
644 | $day = $assignedVariables['days'][$dates[0]->format('YW')]; | |
645 | $date = $expectedDates[0]; | |
646 | ||
647 | static::assertEquals($date, $day['date']); | |
648 | static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); | |
649 | static::assertSame('Week 21 (May 18, 2020)', $day['date_human']); | |
650 | static::assertSame('http://shaarli/subfolder/daily?week='. $dates[0]->format('YW'), $day['absolute_url']); | |
651 | static::assertCount(1, $day['links']); | |
652 | ||
653 | $day = $assignedVariables['days'][$dates[1]->format('YW')]; | |
654 | $date = $expectedDates[1]; | |
655 | ||
656 | static::assertEquals($date, $day['date']); | |
657 | static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); | |
658 | static::assertSame('Week 20 (May 11, 2020)', $day['date_human']); | |
659 | static::assertSame('http://shaarli/subfolder/daily?week='. $dates[1]->format('YW'), $day['absolute_url']); | |
660 | static::assertCount(2, $day['links']); | |
661 | } | |
662 | ||
663 | /** | |
664 | * Test simple display RSS with month parameter | |
665 | */ | |
666 | public function testSimpleRssMonthly(): void | |
667 | { | |
668 | $dates = [ | |
669 | new \DateTimeImmutable('2020-05-19'), | |
670 | new \DateTimeImmutable('2020-04-13'), | |
671 | ]; | |
672 | $expectedDates = [ | |
673 | new \DateTimeImmutable('2020-05-31 23:59:59'), | |
674 | new \DateTimeImmutable('2020-04-30 23:59:59'), | |
675 | ]; | |
676 | ||
677 | $this->container->environment['QUERY_STRING'] = 'month'; | |
678 | $request = $this->createMock(Request::class); | |
679 | $request->method('getQueryParam')->willReturnCallback(function (string $key): ?string { | |
680 | return $key === 'month' ? '' : null; | |
681 | }); | |
682 | $response = new Response(); | |
683 | ||
684 | $this->container->bookmarkService->expects(static::once())->method('search')->willReturn( | |
685 | SearchResult::getSearchResult([ | |
686 | (new Bookmark())->setId(1)->setCreated($dates[0])->setUrl('http://domain.tld/1'), | |
687 | (new Bookmark())->setId(2)->setCreated($dates[1])->setUrl('http://domain.tld/2'), | |
688 | (new Bookmark())->setId(3)->setCreated($dates[1])->setUrl('http://domain.tld/3'), | |
689 | ]) | |
690 | ); | |
691 | ||
692 | // Save RainTPL assigned variables | |
693 | $assignedVariables = []; | |
694 | $this->assignTemplateVars($assignedVariables); | |
695 | ||
696 | $result = $this->controller->rss($request, $response); | |
697 | ||
698 | static::assertSame(200, $result->getStatusCode()); | |
699 | static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]); | |
700 | static::assertSame('dailyrss', (string) $result->getBody()); | |
701 | static::assertSame('Shaarli', $assignedVariables['title']); | |
702 | static::assertSame('http://shaarli/subfolder/', $assignedVariables['index_url']); | |
703 | static::assertSame('http://shaarli/subfolder/daily-rss?month', $assignedVariables['page_url']); | |
704 | static::assertFalse($assignedVariables['hide_timestamps']); | |
705 | static::assertCount(2, $assignedVariables['days']); | |
706 | ||
707 | $day = $assignedVariables['days'][$dates[0]->format('Ym')]; | |
708 | $date = $expectedDates[0]; | |
709 | ||
710 | static::assertEquals($date, $day['date']); | |
711 | static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); | |
712 | static::assertSame('May, 2020', $day['date_human']); | |
713 | static::assertSame('http://shaarli/subfolder/daily?month='. $dates[0]->format('Ym'), $day['absolute_url']); | |
714 | static::assertCount(1, $day['links']); | |
715 | ||
716 | $day = $assignedVariables['days'][$dates[1]->format('Ym')]; | |
717 | $date = $expectedDates[1]; | |
718 | ||
719 | static::assertEquals($date, $day['date']); | |
720 | static::assertSame($date->format(\DateTime::RSS), $day['date_rss']); | |
721 | static::assertSame('April, 2020', $day['date_human']); | |
722 | static::assertSame('http://shaarli/subfolder/daily?month='. $dates[1]->format('Ym'), $day['absolute_url']); | |
723 | static::assertCount(2, $day['links']); | |
724 | } | |
725 | } |