3 declare(strict_types
=1);
5 namespace Shaarli\Front\Controller
;
7 use PHPUnit\Framework\TestCase
;
8 use Shaarli\Bookmark\BookmarkFilter
;
9 use Shaarli\Bookmark\BookmarkServiceInterface
;
10 use Shaarli\Config\ConfigManager
;
11 use Shaarli\Container\ShaarliContainer
;
12 use Shaarli\Plugin\PluginManager
;
13 use Shaarli\Render\PageBuilder
;
14 use Shaarli\Security\LoginManager
;
15 use Shaarli\Security\SessionManager
;
16 use Slim\Http\Request
;
17 use Slim\Http\Response
;
19 class TagCloudControllerTest
extends TestCase
21 /** @var ShaarliContainer */
24 /** @var TagCloudController */
25 protected $controller;
27 public function setUp(): void
29 $this->container
= $this->createMock(ShaarliContainer
::class);
30 $this->controller
= new TagCloudController($this->container
);
33 public function testValidCloudControllerInvokeDefault(): void
35 $this->createValidContainerMockSet();
42 $expectedOrder = ['abc', 'def', 'ghi'];
44 $request = $this->createMock(Request
::class);
45 $request->expects(static::once())->method('getQueryParam')->with('searchtags')->willReturn(null);
46 $response = new Response();
48 // Save RainTPL assigned variables
49 $assignedVariables = [];
50 $this->assignTemplateVars($assignedVariables);
52 $this->container
->bookmarkService
53 ->expects(static::once())
54 ->method('bookmarksCountPerTag')
56 ->willReturnCallback(function () use ($allTags): array {
61 // Make sure that PluginManager hook is triggered
62 $this->container
->pluginManager
63 ->expects(static::at(0))
64 ->method('executeHooks')
65 ->willReturnCallback(function (string $hook, array $data, array $param): array {
66 static::assertSame('render_tagcloud', $hook);
67 static::assertSame('', $data['search_tags']);
68 static::assertCount(3, $data['tags']);
70 static::assertArrayHasKey('loggedin', $param);
76 $result = $this->controller
->cloud($request, $response);
78 static::assertSame(200, $result->getStatusCode());
79 static::assertSame('tag.cloud', (string) $result->getBody());
80 static::assertSame('Tag cloud - Shaarli', $assignedVariables['pagetitle']);
82 static::assertSame('', $assignedVariables['search_tags']);
83 static::assertCount(3, $assignedVariables['tags']);
84 static::assertSame($expectedOrder, array_keys($assignedVariables['tags']));
86 foreach ($allTags as $tag => $count) {
87 static::assertArrayHasKey($tag, $assignedVariables['tags']);
88 static::assertSame($count, $assignedVariables['tags'][$tag]['count']);
89 static::assertGreaterThan(0, $assignedVariables['tags'][$tag]['size']);
90 static::assertLessThan(5, $assignedVariables['tags'][$tag]['size']);
95 * Additional parameters:
97 * - visibility private
98 * - search tags: `ghi` and `def` (note that filtered tags are not displayed anymore)
100 public function testValidCloudControllerInvokeWithParameters(): void
102 $this->createValidContainerMockSet();
110 $request = $this->createMock(Request
::class);
112 ->expects(static::once())
113 ->method('getQueryParam')
115 ->willReturn('ghi def')
117 $response = new Response();
119 // Save RainTPL assigned variables
120 $assignedVariables = [];
121 $this->assignTemplateVars($assignedVariables);
123 $this->container
->loginManager
->method('isLoggedin')->willReturn(true);
124 $this->container
->sessionManager
->expects(static::once())->method('getSessionParameter')->willReturn('private');
126 $this->container
->bookmarkService
127 ->expects(static::once())
128 ->method('bookmarksCountPerTag')
129 ->with(['ghi', 'def'], BookmarkFilter
::$PRIVATE)
130 ->willReturnCallback(function (): array {
135 // Make sure that PluginManager hook is triggered
136 $this->container
->pluginManager
137 ->expects(static::at(0))
138 ->method('executeHooks')
139 ->willReturnCallback(function (string $hook, array $data, array $param): array {
140 static::assertSame('render_tagcloud', $hook);
141 static::assertSame('ghi def', $data['search_tags']);
142 static::assertCount(1, $data['tags']);
144 static::assertArrayHasKey('loggedin', $param);
150 $result = $this->controller
->cloud($request, $response);
152 static::assertSame(200, $result->getStatusCode());
153 static::assertSame('tag.cloud', (string) $result->getBody());
154 static::assertSame('ghi def - Tag cloud - Shaarli', $assignedVariables['pagetitle']);
156 static::assertSame('ghi def', $assignedVariables['search_tags']);
157 static::assertCount(1, $assignedVariables['tags']);
159 static::assertArrayHasKey('abc', $assignedVariables['tags']);
160 static::assertSame(3, $assignedVariables['tags']['abc']['count']);
161 static::assertGreaterThan(0, $assignedVariables['tags']['abc']['size']);
162 static::assertLessThan(5, $assignedVariables['tags']['abc']['size']);
165 public function testEmptyCloud(): void
167 $this->createValidContainerMockSet();
169 $request = $this->createMock(Request
::class);
170 $request->expects(static::once())->method('getQueryParam')->with('searchtags')->willReturn(null);
171 $response = new Response();
173 // Save RainTPL assigned variables
174 $assignedVariables = [];
175 $this->assignTemplateVars($assignedVariables);
177 $this->container
->bookmarkService
178 ->expects(static::once())
179 ->method('bookmarksCountPerTag')
181 ->willReturnCallback(function (array $parameters, ?string $visibility): array {
186 // Make sure that PluginManager hook is triggered
187 $this->container
->pluginManager
188 ->expects(static::at(0))
189 ->method('executeHooks')
190 ->willReturnCallback(function (string $hook, array $data, array $param): array {
191 static::assertSame('render_tagcloud', $hook);
192 static::assertSame('', $data['search_tags']);
193 static::assertCount(0, $data['tags']);
195 static::assertArrayHasKey('loggedin', $param);
201 $result = $this->controller
->cloud($request, $response);
203 static::assertSame(200, $result->getStatusCode());
204 static::assertSame('tag.cloud', (string) $result->getBody());
205 static::assertSame('Tag cloud - Shaarli', $assignedVariables['pagetitle']);
207 static::assertSame('', $assignedVariables['search_tags']);
208 static::assertCount(0, $assignedVariables['tags']);
211 protected function createValidContainerMockSet(): void
213 $loginManager = $this->createMock(LoginManager
::class);
214 $this->container
->loginManager
= $loginManager;
216 $sessionManager = $this->createMock(SessionManager
::class);
217 $this->container
->sessionManager
= $sessionManager;
220 $conf = $this->createMock(ConfigManager
::class);
221 $this->container
->conf
= $conf;
223 $this->container
->conf
->method('get')->willReturnCallback(function (string $parameter, $default) {
228 $pageBuilder = $this->createMock(PageBuilder
::class);
231 ->willReturnCallback(function (string $template): string {
235 $this->container
->pageBuilder
= $pageBuilder;
238 $pluginManager = $this->createMock(PluginManager
::class);
239 $this->container
->pluginManager
= $pluginManager;
242 $bookmarkService = $this->createMock(BookmarkServiceInterface
::class);
243 $this->container
->bookmarkService
= $bookmarkService;
246 protected function assignTemplateVars(array &$variables): void
248 $this->container
->pageBuilder
249 ->expects(static::atLeastOnce())
251 ->willReturnCallback(function ($key, $value) use (&$variables) {
252 $variables[$key] = $value;