3 declare(strict_types
=1);
5 namespace Shaarli\Front\Controller\Visitor
;
7 use Shaarli\Bookmark\BookmarkFilter
;
10 use Slim\Http\Response
;
13 * Class ShaarliControllerTest
15 * This class is used to test default behavior of ShaarliVisitorController abstract class.
16 * It uses a dummy non abstract controller.
18 class ShaarliVisitorControllerTest
extends TestCase
20 use FrontControllerMockHelper
;
22 /** @var LoginController */
23 protected $controller;
25 /** @var mixed[] List of variable assigned to the template */
26 protected $assignedValues;
31 public function setUp(): void
33 $this->createContainer();
35 $this->controller
= new class($this->container
) extends ShaarliVisitorController
37 public function assignView(string $key, $value): ShaarliVisitorController
39 return parent
::assignView($key, $value);
42 public function render(string $template): string
44 return parent
::render($template);
47 public function redirectFromReferer(
50 array $loopTerms = [],
51 array $clearParams = [],
54 return parent
::redirectFromReferer($request, $response, $loopTerms, $clearParams, $anchor);
57 $this->assignedValues
= [];
59 $this->request
= $this->createMock(Request
::class);
62 public function testAssignView(): void
64 $this->assignTemplateVars($this->assignedValues
);
66 $self = $this->controller
->assignView('variableName', 'variableValue');
68 static::assertInstanceOf(ShaarliVisitorController
::class, $self);
69 static::assertSame('variableValue', $this->assignedValues
['variableName']);
72 public function testRender(): void
74 $this->assignTemplateVars($this->assignedValues
);
76 $this->container
->bookmarkService
78 ->willReturnCallback(function (string $visibility): int {
79 return $visibility === BookmarkFilter
::$PRIVATE ? 5 : 10;
83 $this->container
->pluginManager
84 ->method('executeHooks')
85 ->willReturnCallback(function (string $hook, array &$data, array $params): array {
86 return $data[$hook] = $params;
88 $this->container
->pluginManager
->method('getErrors')->willReturn(['error']);
90 $this->container
->loginManager
->method('isLoggedIn')->willReturn(true);
92 $render = $this->controller
->render('templateName');
94 static::assertSame('templateName', $render);
96 static::assertSame(10, $this->assignedValues
['linkcount']);
97 static::assertSame(5, $this->assignedValues
['privateLinkcount']);
98 static::assertSame(['error'], $this->assignedValues
['plugin_errors']);
100 static::assertSame('templateName', $this->assignedValues
['plugins_includes']['render_includes']['target']);
101 static::assertTrue($this->assignedValues
['plugins_includes']['render_includes']['loggedin']);
102 static::assertSame('templateName', $this->assignedValues
['plugins_header']['render_header']['target']);
103 static::assertTrue($this->assignedValues
['plugins_header']['render_header']['loggedin']);
104 static::assertSame('templateName', $this->assignedValues
['plugins_footer']['render_footer']['target']);
105 static::assertTrue($this->assignedValues
['plugins_footer']['render_footer']['loggedin']);
109 * Test redirectFromReferer() - Default behaviour
111 public function testRedirectFromRefererDefault(): void
113 $this->container
->environment
['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
115 $response = new Response();
117 $result = $this->controller
->redirectFromReferer($this->request
, $response);
119 static::assertSame(302, $result->getStatusCode());
120 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
124 * Test redirectFromReferer() - With a loop term not matched in the referer
126 public function testRedirectFromRefererWithUnmatchedLoopTerm(): void
128 $this->container
->environment
['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
130 $response = new Response();
132 $result = $this->controller
->redirectFromReferer($this->request
, $response, ['nope']);
134 static::assertSame(302, $result->getStatusCode());
135 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
139 * Test redirectFromReferer() - With a loop term matching the referer in its path -> redirect to default
141 public function testRedirectFromRefererWithMatchingLoopTermInPath(): void
143 $this->container
->environment
['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
145 $response = new Response();
147 $result = $this->controller
->redirectFromReferer($this->request
, $response, ['nope', 'controller']);
149 static::assertSame(302, $result->getStatusCode());
150 static::assertSame(['/subfolder/'], $result->getHeader('location'));
154 * Test redirectFromReferer() - With a loop term matching the referer in its query parameters -> redirect to default
156 public function testRedirectFromRefererWithMatchingLoopTermInQueryParam(): void
158 $this->container
->environment
['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
160 $response = new Response();
162 $result = $this->controller
->redirectFromReferer($this->request
, $response, ['nope', 'other']);
164 static::assertSame(302, $result->getStatusCode());
165 static::assertSame(['/subfolder/'], $result->getHeader('location'));
169 * Test redirectFromReferer() - With a loop term matching the referer in its query value
170 * -> we do not block redirection for query parameter values.
172 public function testRedirectFromRefererWithMatchingLoopTermInQueryValue(): void
174 $this->container
->environment
['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
176 $response = new Response();
178 $result = $this->controller
->redirectFromReferer($this->request
, $response, ['nope', 'param']);
180 static::assertSame(302, $result->getStatusCode());
181 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
185 * Test redirectFromReferer() - With a loop term matching the referer in its domain name
186 * -> we do not block redirection for shaarli's hosts
188 public function testRedirectFromRefererWithLoopTermInDomain(): void
190 $this->container
->environment
['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
192 $response = new Response();
194 $result = $this->controller
->redirectFromReferer($this->request
, $response, ['shaarli']);
196 static::assertSame(302, $result->getStatusCode());
197 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
201 * Test redirectFromReferer() - With a loop term matching a query parameter AND clear this query param
202 * -> the param should be cleared before checking if it matches the redir loop terms
204 public function testRedirectFromRefererWithMatchingClearedParam(): void
206 $this->container
->environment
['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
208 $response = new Response();
210 $result = $this->controller
->redirectFromReferer($this->request
, $response, ['query'], ['query']);
212 static::assertSame(302, $result->getStatusCode());
213 static::assertSame(['/subfolder/controller?other=2'], $result->getHeader('location'));
217 * Test redirectFromReferer() - From another domain -> we ignore the given referrer.
219 public function testRedirectExternalReferer(): void
221 $this->container
->environment
['HTTP_REFERER'] = 'http://other.domain.tld/controller?query=param&other=2';
223 $response = new Response();
225 $result = $this->controller
->redirectFromReferer($this->request
, $response, ['query'], ['query']);
227 static::assertSame(302, $result->getStatusCode());
228 static::assertSame(['/subfolder/'], $result->getHeader('location'));
232 * Test redirectFromReferer() - From another domain -> we ignore the given referrer.
234 public function testRedirectExternalRefererExplicitDomainName(): void
236 $this->container
->environment
['SERVER_NAME'] = 'my.shaarli.tld';
237 $this->container
->environment
['HTTP_REFERER'] = 'http://your.shaarli.tld/controller?query=param&other=2';
239 $response = new Response();
241 $result = $this->controller
->redirectFromReferer($this->request
, $response, ['query'], ['query']);
243 static::assertSame(302, $result->getStatusCode());
244 static::assertSame(['/subfolder/'], $result->getHeader('location'));