]> git.immae.eu Git - github/shaarli/Shaarli.git/blame - tests/front/controller/visitor/ShaarliVisitorControllerTest.php
Compatibility with PHPUnit 9
[github/shaarli/Shaarli.git] / tests / front / controller / visitor / ShaarliVisitorControllerTest.php
CommitLineData
0498b209
A
1<?php
2
3declare(strict_types=1);
4
2899ebb5 5namespace Shaarli\Front\Controller\Visitor;
0498b209 6
0498b209 7use Shaarli\Bookmark\BookmarkFilter;
a5a9cf23 8use Shaarli\TestCase;
2899ebb5 9use Slim\Http\Request;
af290059 10use Slim\Http\Response;
0498b209
A
11
12/**
13 * Class ShaarliControllerTest
14 *
818b3193 15 * This class is used to test default behavior of ShaarliVisitorController abstract class.
0498b209
A
16 * It uses a dummy non abstract controller.
17 */
818b3193 18class ShaarliVisitorControllerTest extends TestCase
0498b209 19{
dd09ec52 20 use FrontControllerMockHelper;
0498b209
A
21
22 /** @var LoginController */
23 protected $controller;
24
25 /** @var mixed[] List of variable assigned to the template */
26 protected $assignedValues;
27
2899ebb5
A
28 /** @var Request */
29 protected $request;
30
0498b209
A
31 public function setUp(): void
32 {
dd09ec52
A
33 $this->createContainer();
34
2899ebb5 35 $this->controller = new class($this->container) extends ShaarliVisitorController
0498b209 36 {
2899ebb5 37 public function assignView(string $key, $value): ShaarliVisitorController
0498b209
A
38 {
39 return parent::assignView($key, $value);
40 }
41
42 public function render(string $template): string
43 {
44 return parent::render($template);
45 }
af290059
A
46
47 public function redirectFromReferer(
2899ebb5 48 Request $request,
af290059
A
49 Response $response,
50 array $loopTerms = [],
818b3193
A
51 array $clearParams = [],
52 string $anchor = null
af290059 53 ): Response {
818b3193 54 return parent::redirectFromReferer($request, $response, $loopTerms, $clearParams, $anchor);
af290059 55 }
0498b209
A
56 };
57 $this->assignedValues = [];
2899ebb5
A
58
59 $this->request = $this->createMock(Request::class);
0498b209
A
60 }
61
62 public function testAssignView(): void
63 {
dd09ec52
A
64 $this->assignTemplateVars($this->assignedValues);
65
0498b209
A
66 $self = $this->controller->assignView('variableName', 'variableValue');
67
2899ebb5 68 static::assertInstanceOf(ShaarliVisitorController::class, $self);
0498b209
A
69 static::assertSame('variableValue', $this->assignedValues['variableName']);
70 }
71
72 public function testRender(): void
73 {
dd09ec52
A
74 $this->assignTemplateVars($this->assignedValues);
75
76 $this->container->bookmarkService
77 ->method('count')
78 ->willReturnCallback(function (string $visibility): int {
79 return $visibility === BookmarkFilter::$PRIVATE ? 5 : 10;
80 })
81 ;
82
83 $this->container->pluginManager
84 ->method('executeHooks')
85 ->willReturnCallback(function (string $hook, array &$data, array $params): array {
86 return $data[$hook] = $params;
87 });
88 $this->container->pluginManager->method('getErrors')->willReturn(['error']);
89
90 $this->container->loginManager->method('isLoggedIn')->willReturn(true);
91
0498b209
A
92 $render = $this->controller->render('templateName');
93
94 static::assertSame('templateName', $render);
95
96 static::assertSame(10, $this->assignedValues['linkcount']);
97 static::assertSame(5, $this->assignedValues['privateLinkcount']);
98 static::assertSame(['error'], $this->assignedValues['plugin_errors']);
99
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']);
106 }
af290059
A
107
108 /**
109 * Test redirectFromReferer() - Default behaviour
110 */
111 public function testRedirectFromRefererDefault(): void
112 {
abe033be 113 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
af290059
A
114
115 $response = new Response();
116
2899ebb5 117 $result = $this->controller->redirectFromReferer($this->request, $response);
af290059
A
118
119 static::assertSame(302, $result->getStatusCode());
120 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
121 }
122
123 /**
124 * Test redirectFromReferer() - With a loop term not matched in the referer
125 */
126 public function testRedirectFromRefererWithUnmatchedLoopTerm(): void
127 {
abe033be 128 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
af290059
A
129
130 $response = new Response();
131
2899ebb5 132 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope']);
af290059
A
133
134 static::assertSame(302, $result->getStatusCode());
135 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
136 }
137
138 /**
139 * Test redirectFromReferer() - With a loop term matching the referer in its path -> redirect to default
140 */
141 public function testRedirectFromRefererWithMatchingLoopTermInPath(): void
142 {
abe033be 143 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
af290059
A
144
145 $response = new Response();
146
2899ebb5 147 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope', 'controller']);
af290059
A
148
149 static::assertSame(302, $result->getStatusCode());
818b3193 150 static::assertSame(['/subfolder/'], $result->getHeader('location'));
af290059
A
151 }
152
153 /**
154 * Test redirectFromReferer() - With a loop term matching the referer in its query parameters -> redirect to default
155 */
156 public function testRedirectFromRefererWithMatchingLoopTermInQueryParam(): void
157 {
abe033be 158 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
af290059
A
159
160 $response = new Response();
161
2899ebb5 162 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope', 'other']);
af290059
A
163
164 static::assertSame(302, $result->getStatusCode());
818b3193 165 static::assertSame(['/subfolder/'], $result->getHeader('location'));
af290059
A
166 }
167
168 /**
169 * Test redirectFromReferer() - With a loop term matching the referer in its query value
170 * -> we do not block redirection for query parameter values.
171 */
172 public function testRedirectFromRefererWithMatchingLoopTermInQueryValue(): void
173 {
abe033be 174 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
af290059
A
175
176 $response = new Response();
177
2899ebb5 178 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope', 'param']);
af290059
A
179
180 static::assertSame(302, $result->getStatusCode());
181 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
182 }
183
184 /**
185 * Test redirectFromReferer() - With a loop term matching the referer in its domain name
186 * -> we do not block redirection for shaarli's hosts
187 */
188 public function testRedirectFromRefererWithLoopTermInDomain(): void
189 {
abe033be 190 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
af290059
A
191
192 $response = new Response();
193
2899ebb5 194 $result = $this->controller->redirectFromReferer($this->request, $response, ['shaarli']);
af290059
A
195
196 static::assertSame(302, $result->getStatusCode());
197 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
198 }
199
200 /**
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
203 */
204 public function testRedirectFromRefererWithMatchingClearedParam(): void
205 {
abe033be 206 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
af290059
A
207
208 $response = new Response();
209
2899ebb5 210 $result = $this->controller->redirectFromReferer($this->request, $response, ['query'], ['query']);
af290059
A
211
212 static::assertSame(302, $result->getStatusCode());
213 static::assertSame(['/subfolder/controller?other=2'], $result->getHeader('location'));
214 }
abe033be
A
215
216 /**
217 * Test redirectFromReferer() - From another domain -> we ignore the given referrer.
218 */
219 public function testRedirectExternalReferer(): void
220 {
221 $this->container->environment['HTTP_REFERER'] = 'http://other.domain.tld/controller?query=param&other=2';
222
223 $response = new Response();
224
225 $result = $this->controller->redirectFromReferer($this->request, $response, ['query'], ['query']);
226
227 static::assertSame(302, $result->getStatusCode());
228 static::assertSame(['/subfolder/'], $result->getHeader('location'));
229 }
230
231 /**
232 * Test redirectFromReferer() - From another domain -> we ignore the given referrer.
233 */
234 public function testRedirectExternalRefererExplicitDomainName(): void
235 {
236 $this->container->environment['SERVER_NAME'] = 'my.shaarli.tld';
237 $this->container->environment['HTTP_REFERER'] = 'http://your.shaarli.tld/controller?query=param&other=2';
238
239 $response = new Response();
240
241 $result = $this->controller->redirectFromReferer($this->request, $response, ['query'], ['query']);
242
243 static::assertSame(302, $result->getStatusCode());
244 static::assertSame(['/subfolder/'], $result->getHeader('location'));
245 }
0498b209 246}