]> git.immae.eu Git - github/shaarli/Shaarli.git/blob - tests/front/controller/visitor/ShaarliVisitorControllerTest.php
83d0835850a664f893997e4ea9b1d502ae4e3f5c
[github/shaarli/Shaarli.git] / tests / front / controller / visitor / ShaarliVisitorControllerTest.php
1 <?php
2
3 declare(strict_types=1);
4
5 namespace Shaarli\Front\Controller\Visitor;
6
7 use PHPUnit\Framework\TestCase;
8 use Shaarli\Bookmark\BookmarkFilter;
9 use Slim\Http\Request;
10 use Slim\Http\Response;
11
12 /**
13 * Class ShaarliControllerTest
14 *
15 * This class is used to test default behavior of ShaarliVisitorController abstract class.
16 * It uses a dummy non abstract controller.
17 */
18 class ShaarliVisitorControllerTest extends TestCase
19 {
20 use FrontControllerMockHelper;
21
22 /** @var LoginController */
23 protected $controller;
24
25 /** @var mixed[] List of variable assigned to the template */
26 protected $assignedValues;
27
28 /** @var Request */
29 protected $request;
30
31 public function setUp(): void
32 {
33 $this->createContainer();
34
35 $this->controller = new class($this->container) extends ShaarliVisitorController
36 {
37 public function assignView(string $key, $value): ShaarliVisitorController
38 {
39 return parent::assignView($key, $value);
40 }
41
42 public function render(string $template): string
43 {
44 return parent::render($template);
45 }
46
47 public function redirectFromReferer(
48 Request $request,
49 Response $response,
50 array $loopTerms = [],
51 array $clearParams = [],
52 string $anchor = null
53 ): Response {
54 return parent::redirectFromReferer($request, $response, $loopTerms, $clearParams, $anchor);
55 }
56 };
57 $this->assignedValues = [];
58
59 $this->request = $this->createMock(Request::class);
60 }
61
62 public function testAssignView(): void
63 {
64 $this->assignTemplateVars($this->assignedValues);
65
66 $self = $this->controller->assignView('variableName', 'variableValue');
67
68 static::assertInstanceOf(ShaarliVisitorController::class, $self);
69 static::assertSame('variableValue', $this->assignedValues['variableName']);
70 }
71
72 public function testRender(): void
73 {
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
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 static::assertSame('/subfolder', $this->assignedValues['base_path']);
100 static::assertSame('/subfolder/tpl/default', $this->assignedValues['asset_path']);
101
102 static::assertSame('templateName', $this->assignedValues['plugins_includes']['render_includes']['target']);
103 static::assertTrue($this->assignedValues['plugins_includes']['render_includes']['loggedin']);
104 static::assertSame('templateName', $this->assignedValues['plugins_header']['render_header']['target']);
105 static::assertTrue($this->assignedValues['plugins_header']['render_header']['loggedin']);
106 static::assertSame('templateName', $this->assignedValues['plugins_footer']['render_footer']['target']);
107 static::assertTrue($this->assignedValues['plugins_footer']['render_footer']['loggedin']);
108 }
109
110 /**
111 * Test redirectFromReferer() - Default behaviour
112 */
113 public function testRedirectFromRefererDefault(): void
114 {
115 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
116
117 $response = new Response();
118
119 $result = $this->controller->redirectFromReferer($this->request, $response);
120
121 static::assertSame(302, $result->getStatusCode());
122 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
123 }
124
125 /**
126 * Test redirectFromReferer() - With a loop term not matched in the referer
127 */
128 public function testRedirectFromRefererWithUnmatchedLoopTerm(): void
129 {
130 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
131
132 $response = new Response();
133
134 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope']);
135
136 static::assertSame(302, $result->getStatusCode());
137 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
138 }
139
140 /**
141 * Test redirectFromReferer() - With a loop term matching the referer in its path -> redirect to default
142 */
143 public function testRedirectFromRefererWithMatchingLoopTermInPath(): void
144 {
145 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
146
147 $response = new Response();
148
149 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope', 'controller']);
150
151 static::assertSame(302, $result->getStatusCode());
152 static::assertSame(['/subfolder/'], $result->getHeader('location'));
153 }
154
155 /**
156 * Test redirectFromReferer() - With a loop term matching the referer in its query parameters -> redirect to default
157 */
158 public function testRedirectFromRefererWithMatchingLoopTermInQueryParam(): void
159 {
160 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
161
162 $response = new Response();
163
164 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope', 'other']);
165
166 static::assertSame(302, $result->getStatusCode());
167 static::assertSame(['/subfolder/'], $result->getHeader('location'));
168 }
169
170 /**
171 * Test redirectFromReferer() - With a loop term matching the referer in its query value
172 * -> we do not block redirection for query parameter values.
173 */
174 public function testRedirectFromRefererWithMatchingLoopTermInQueryValue(): void
175 {
176 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
177
178 $response = new Response();
179
180 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope', 'param']);
181
182 static::assertSame(302, $result->getStatusCode());
183 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
184 }
185
186 /**
187 * Test redirectFromReferer() - With a loop term matching the referer in its domain name
188 * -> we do not block redirection for shaarli's hosts
189 */
190 public function testRedirectFromRefererWithLoopTermInDomain(): void
191 {
192 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
193
194 $response = new Response();
195
196 $result = $this->controller->redirectFromReferer($this->request, $response, ['shaarli']);
197
198 static::assertSame(302, $result->getStatusCode());
199 static::assertSame(['/subfolder/controller?query=param&other=2'], $result->getHeader('location'));
200 }
201
202 /**
203 * Test redirectFromReferer() - With a loop term matching a query parameter AND clear this query param
204 * -> the param should be cleared before checking if it matches the redir loop terms
205 */
206 public function testRedirectFromRefererWithMatchingClearedParam(): void
207 {
208 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
209
210 $response = new Response();
211
212 $result = $this->controller->redirectFromReferer($this->request, $response, ['query'], ['query']);
213
214 static::assertSame(302, $result->getStatusCode());
215 static::assertSame(['/subfolder/controller?other=2'], $result->getHeader('location'));
216 }
217 }