]> git.immae.eu Git - github/shaarli/Shaarli.git/blobdiff - tests/front/controller/DailyControllerTest.php
Refactor front controller tests to create container mock using a trait
[github/shaarli/Shaarli.git] / tests / front / controller / DailyControllerTest.php
index 2714bfd9e1c44d37281384d4c2938a8d62eaa57d..7ec99030c8e838e15c7943f651b4572ae320bfb6 100644 (file)
@@ -6,33 +6,26 @@ namespace Shaarli\Front\Controller;
 
 use PHPUnit\Framework\TestCase;
 use Shaarli\Bookmark\Bookmark;
-use Shaarli\Bookmark\BookmarkServiceInterface;
-use Shaarli\Config\ConfigManager;
-use Shaarli\Container\ShaarliContainer;
-use Shaarli\Formatter\BookmarkFormatter;
-use Shaarli\Formatter\BookmarkRawFormatter;
-use Shaarli\Formatter\FormatterFactory;
-use Shaarli\Plugin\PluginManager;
-use Shaarli\Render\PageBuilder;
-use Shaarli\Security\LoginManager;
+use Shaarli\Feed\CachedPage;
 use Slim\Http\Request;
 use Slim\Http\Response;
 
 class DailyControllerTest extends TestCase
 {
-    /** @var ShaarliContainer */
-    protected $container;
+    use FrontControllerMockHelper;
 
     /** @var DailyController */
     protected $controller;
 
     public function setUp(): void
     {
-        $this->container = $this->createMock(ShaarliContainer::class);
+        $this->createContainer();
+
         $this->controller = new DailyController($this->container);
+        DailyController::$DAILY_RSS_NB_DAYS = 2;
     }
 
-    public function testValidControllerInvokeDefault(): void
+    public function testValidIndexControllerInvokeDefault(): void
     {
         $this->createValidContainerMockSet();
 
@@ -102,7 +95,8 @@ class DailyControllerTest extends TestCase
                 static::assertArrayHasKey('loggedin', $param);
 
                 return $data;
-            });
+            })
+        ;
 
         $result = $this->controller->index($request, $response);
 
@@ -173,7 +167,7 @@ class DailyControllerTest extends TestCase
     /**
      * Daily page - test that everything goes fine with no future or past bookmarks
      */
-    public function testValidControllerInvokeNoFutureOrPast(): void
+    public function testValidIndexControllerInvokeNoFutureOrPast(): void
     {
         $this->createValidContainerMockSet();
 
@@ -247,7 +241,7 @@ class DailyControllerTest extends TestCase
     /**
      * Daily page - test that height adjustment in columns is working
      */
-    public function testValidControllerInvokeHeightAdjustment(): void
+    public function testValidIndexControllerInvokeHeightAdjustment(): void
     {
         $this->createValidContainerMockSet();
 
@@ -318,7 +312,7 @@ class DailyControllerTest extends TestCase
     /**
      * Daily page - no bookmark
      */
-    public function testValidControllerInvokeNoBookmark(): void
+    public function testValidIndexControllerInvokeNoBookmark(): void
     {
         $this->createValidContainerMockSet();
 
@@ -364,58 +358,134 @@ class DailyControllerTest extends TestCase
         static::assertEquals((new \DateTime())->setTime(0, 0), $assignedVariables['dayDate']);
     }
 
-    protected function createValidContainerMockSet(): void
+    /**
+     * Daily RSS - default behaviour
+     */
+    public function testValidRssControllerInvokeDefault(): void
+    {
+        $this->createValidContainerMockSet();
+
+        $dates = [
+            new \DateTimeImmutable('2020-05-17'),
+            new \DateTimeImmutable('2020-05-15'),
+            new \DateTimeImmutable('2020-05-13'),
+        ];
+
+        $request = $this->createMock(Request::class);
+        $response = new Response();
+
+        $this->container->bookmarkService->expects(static::once())->method('search')->willReturn([
+            (new Bookmark())->setId(1)->setCreated($dates[0])->setUrl('http://domain.tld/1'),
+            (new Bookmark())->setId(2)->setCreated($dates[1])->setUrl('http://domain.tld/2'),
+            (new Bookmark())->setId(3)->setCreated($dates[1])->setUrl('http://domain.tld/3'),
+            (new Bookmark())->setId(4)->setCreated($dates[2])->setUrl('http://domain.tld/4'),
+        ]);
+
+        $this->container->pageCacheManager
+            ->expects(static::once())
+            ->method('getCachePage')
+            ->willReturnCallback(function (): CachedPage {
+                $cachedPage = $this->createMock(CachedPage::class);
+                $cachedPage->expects(static::once())->method('cache')->with('dailyrss');
+
+                return $cachedPage;
+            }
+        );
+
+        // Save RainTPL assigned variables
+        $assignedVariables = [];
+        $this->assignTemplateVars($assignedVariables);
+
+        $result = $this->controller->rss($request, $response);
+
+        static::assertSame(200, $result->getStatusCode());
+        static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]);
+        static::assertSame('dailyrss', (string) $result->getBody());
+        static::assertSame('Shaarli', $assignedVariables['title']);
+        static::assertSame('http://shaarli', $assignedVariables['index_url']);
+        static::assertSame('http://shaarli/daily-rss', $assignedVariables['page_url']);
+        static::assertFalse($assignedVariables['hide_timestamps']);
+        static::assertCount(2, $assignedVariables['days']);
+
+        $day = $assignedVariables['days'][$dates[0]->format('Ymd')];
+
+        static::assertEquals($dates[0], $day['date']);
+        static::assertSame($dates[0]->format(\DateTime::RSS), $day['date_rss']);
+        static::assertSame(format_date($dates[0], false), $day['date_human']);
+        static::assertSame('http://shaarli/daily?day='. $dates[0]->format('Ymd'), $day['absolute_url']);
+        static::assertCount(1, $day['links']);
+        static::assertSame(1, $day['links'][0]['id']);
+        static::assertSame('http://domain.tld/1', $day['links'][0]['url']);
+        static::assertEquals($dates[0], $day['links'][0]['created']);
+
+        $day = $assignedVariables['days'][$dates[1]->format('Ymd')];
+
+        static::assertEquals($dates[1], $day['date']);
+        static::assertSame($dates[1]->format(\DateTime::RSS), $day['date_rss']);
+        static::assertSame(format_date($dates[1], false), $day['date_human']);
+        static::assertSame('http://shaarli/daily?day='. $dates[1]->format('Ymd'), $day['absolute_url']);
+        static::assertCount(2, $day['links']);
+
+        static::assertSame(2, $day['links'][0]['id']);
+        static::assertSame('http://domain.tld/2', $day['links'][0]['url']);
+        static::assertEquals($dates[1], $day['links'][0]['created']);
+        static::assertSame(3, $day['links'][1]['id']);
+        static::assertSame('http://domain.tld/3', $day['links'][1]['url']);
+        static::assertEquals($dates[1], $day['links'][1]['created']);
+    }
+
+    /**
+     * Daily RSS - trigger cache rendering
+     */
+    public function testValidRssControllerInvokeTriggerCache(): void
     {
-        $loginManager = $this->createMock(LoginManager::class);
-        $this->container->loginManager = $loginManager;
-
-        // Config
-        $conf = $this->createMock(ConfigManager::class);
-        $this->container->conf = $conf;
-        $this->container->conf->method('get')->willReturnCallback(function (string $parameter, $default) {
-            return $default;
+        $this->createValidContainerMockSet();
+
+        $request = $this->createMock(Request::class);
+        $response = new Response();
+
+        $this->container->pageCacheManager->method('getCachePage')->willReturnCallback(function (): CachedPage {
+            $cachedPage = $this->createMock(CachedPage::class);
+            $cachedPage->method('cachedVersion')->willReturn('this is cache!');
+
+            return $cachedPage;
         });
 
-        // PageBuilder
-        $pageBuilder = $this->createMock(PageBuilder::class);
-        $pageBuilder
-            ->method('render')
-            ->willReturnCallback(function (string $template): string {
-                return $template;
-            })
-        ;
-        $this->container->pageBuilder = $pageBuilder;
-
-        // Plugin Manager
-        $pluginManager = $this->createMock(PluginManager::class);
-        $this->container->pluginManager = $pluginManager;
-
-        // BookmarkService
-        $bookmarkService = $this->createMock(BookmarkServiceInterface::class);
-        $this->container->bookmarkService = $bookmarkService;
-
-        // Formatter
-        $formatterFactory = $this->createMock(FormatterFactory::class);
-        $formatterFactory
-            ->method('getFormatter')
-            ->willReturnCallback(function (): BookmarkFormatter {
-                return new BookmarkRawFormatter($this->container->conf, true);
-            })
-        ;
-        $this->container->formatterFactory = $formatterFactory;
+        $this->container->bookmarkService->expects(static::never())->method('search');
+
+        $result = $this->controller->rss($request, $response);
+
+        static::assertSame(200, $result->getStatusCode());
+        static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]);
+        static::assertSame('this is cache!', (string) $result->getBody());
     }
 
-    protected function assignTemplateVars(array &$variables): void
+    /**
+     * Daily RSS - No bookmark
+     */
+    public function testValidRssControllerInvokeNoBookmark(): void
     {
-        $this->container->pageBuilder
-            ->expects(static::atLeastOnce())
-            ->method('assign')
-            ->willReturnCallback(function ($key, $value) use (&$variables) {
-                $variables[$key] = $value;
+        $this->createValidContainerMockSet();
 
-                return $this;
-            })
-        ;
+        $request = $this->createMock(Request::class);
+        $response = new Response();
+
+        $this->container->bookmarkService->expects(static::once())->method('search')->willReturn([]);
+
+        // Save RainTPL assigned variables
+        $assignedVariables = [];
+        $this->assignTemplateVars($assignedVariables);
+
+        $result = $this->controller->rss($request, $response);
+
+        static::assertSame(200, $result->getStatusCode());
+        static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]);
+        static::assertSame('dailyrss', (string) $result->getBody());
+        static::assertSame('Shaarli', $assignedVariables['title']);
+        static::assertSame('http://shaarli', $assignedVariables['index_url']);
+        static::assertSame('http://shaarli/daily-rss', $assignedVariables['page_url']);
+        static::assertFalse($assignedVariables['hide_timestamps']);
+        static::assertCount(0, $assignedVariables['days']);
     }
 
     protected static function generateContent(int $length): string