3 declare(strict_types
=1);
5 namespace Shaarli\Front\Controller
;
7 use PHPUnit\Framework\TestCase
;
8 use Shaarli\Bookmark\BookmarkServiceInterface
;
9 use Shaarli\Config\ConfigManager
;
10 use Shaarli\Container\ShaarliContainer
;
11 use Shaarli\Feed\FeedBuilder
;
12 use Shaarli\Formatter\FormatterFactory
;
13 use Shaarli\Plugin\PluginManager
;
14 use Shaarli\Render\PageBuilder
;
15 use Shaarli\Render\PageCacheManager
;
16 use Shaarli\Security\LoginManager
;
17 use Slim\Http\Request
;
18 use Slim\Http\Response
;
20 class FeedControllerTest
extends TestCase
22 /** @var ShaarliContainer */
25 /** @var FeedController */
26 protected $controller;
28 public function setUp(): void
30 $this->container
= $this->createMock(ShaarliContainer
::class);
31 $this->controller
= new FeedController($this->container
);
35 * Feed Controller - RSS default behaviour
37 public function testDefaultRssController(): void
39 $this->createValidContainerMockSet();
41 $request = $this->createMock(Request
::class);
42 $response = new Response();
44 $this->container
->feedBuilder
->expects(static::once())->method('setLocale');
45 $this->container
->feedBuilder
->expects(static::once())->method('setHideDates')->with(false);
46 $this->container
->feedBuilder
->expects(static::once())->method('setUsePermalinks')->with(true);
48 // Save RainTPL assigned variables
49 $assignedVariables = [];
50 $this->assignTemplateVars($assignedVariables);
52 $this->container
->feedBuilder
->method('buildData')->willReturn(['content' => 'data']);
54 // Make sure that PluginManager hook is triggered
55 $this->container
->pluginManager
56 ->expects(static::at(0))
57 ->method('executeHooks')
58 ->willReturnCallback(function (string $hook, array $data, array $param): void {
59 static::assertSame('render_feed', $hook);
60 static::assertSame('data', $data['content']);
62 static::assertArrayHasKey('loggedin', $param);
63 static::assertSame('rss', $param['target']);
67 $result = $this->controller
->rss($request, $response);
69 static::assertSame(200, $result->getStatusCode());
70 static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]);
71 static::assertSame('feed.rss', (string) $result->getBody());
72 static::assertSame('data', $assignedVariables['content']);
76 * Feed Controller - ATOM default behaviour
78 public function testDefaultAtomController(): void
80 $this->createValidContainerMockSet();
82 $request = $this->createMock(Request
::class);
83 $response = new Response();
85 $this->container
->feedBuilder
->expects(static::once())->method('setLocale');
86 $this->container
->feedBuilder
->expects(static::once())->method('setHideDates')->with(false);
87 $this->container
->feedBuilder
->expects(static::once())->method('setUsePermalinks')->with(true);
89 // Save RainTPL assigned variables
90 $assignedVariables = [];
91 $this->assignTemplateVars($assignedVariables);
93 $this->container
->feedBuilder
->method('buildData')->willReturn(['content' => 'data']);
95 // Make sure that PluginManager hook is triggered
96 $this->container
->pluginManager
97 ->expects(static::at(0))
98 ->method('executeHooks')
99 ->willReturnCallback(function (string $hook, array $data, array $param): void {
100 static::assertSame('render_feed', $hook);
101 static::assertSame('data', $data['content']);
103 static::assertArrayHasKey('loggedin', $param);
104 static::assertSame('atom', $param['target']);
108 $result = $this->controller
->atom($request, $response);
110 static::assertSame(200, $result->getStatusCode());
111 static::assertStringContainsString('application/atom', $result->getHeader('Content-Type')[0]);
112 static::assertSame('feed.atom', (string) $result->getBody());
113 static::assertSame('data', $assignedVariables['content']);
117 * Feed Controller - ATOM with parameters
119 public function testAtomControllerWithParameters(): void
121 $this->createValidContainerMockSet();
123 $request = $this->createMock(Request
::class);
124 $request->method('getParams')->willReturn(['parameter' => 'value']);
125 $response = new Response();
127 // Save RainTPL assigned variables
128 $assignedVariables = [];
129 $this->assignTemplateVars($assignedVariables);
131 $this->container
->feedBuilder
132 ->method('buildData')
133 ->with('atom', ['parameter' => 'value'])
134 ->willReturn(['content' => 'data'])
137 // Make sure that PluginManager hook is triggered
138 $this->container
->pluginManager
139 ->expects(static::at(0))
140 ->method('executeHooks')
141 ->willReturnCallback(function (string $hook, array $data, array $param): void {
142 static::assertSame('render_feed', $hook);
143 static::assertSame('data', $data['content']);
145 static::assertArrayHasKey('loggedin', $param);
146 static::assertSame('atom', $param['target']);
150 $result = $this->controller
->atom($request, $response);
152 static::assertSame(200, $result->getStatusCode());
153 static::assertStringContainsString('application/atom', $result->getHeader('Content-Type')[0]);
154 static::assertSame('feed.atom', (string) $result->getBody());
155 static::assertSame('data', $assignedVariables['content']);
158 protected function createValidContainerMockSet(): void
160 $loginManager = $this->createMock(LoginManager
::class);
161 $this->container
->loginManager
= $loginManager;
164 $conf = $this->createMock(ConfigManager
::class);
165 $this->container
->conf
= $conf;
166 $this->container
->conf
->method('get')->willReturnCallback(function (string $parameter, $default) {
171 $pageBuilder = $this->createMock(PageBuilder
::class);
174 ->willReturnCallback(function (string $template): string {
178 $this->container
->pageBuilder
= $pageBuilder;
180 $bookmarkService = $this->createMock(BookmarkServiceInterface
::class);
181 $this->container
->bookmarkService
= $bookmarkService;
184 $pluginManager = $this->createMock(PluginManager
::class);
185 $this->container
->pluginManager
= $pluginManager;
188 $formatterFactory = $this->createMock(FormatterFactory
::class);
189 $this->container
->formatterFactory
= $formatterFactory;
192 $pageCacheManager = $this->createMock(PageCacheManager
::class);
193 $this->container
->pageCacheManager
= $pageCacheManager;
196 $feedBuilder = $this->createMock(FeedBuilder
::class);
197 $this->container
->feedBuilder
= $feedBuilder;
200 $this->container
->environment
= [
201 'SERVER_NAME' => 'shaarli',
202 'SERVER_PORT' => '80',
203 'REQUEST_URI' => '/daily-rss',
207 protected function assignTemplateVars(array &$variables): void
209 $this->container
->pageBuilder
210 ->expects(static::atLeastOnce())
212 ->willReturnCallback(function ($key, $value) use (&$variables) {
213 $variables[$key] = $value;