]> git.immae.eu Git - github/shaarli/Shaarli.git/blame - tests/front/controller/visitor/ShaarliVisitorControllerTest.php
Explicitly define base and asset path in templates
[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
A
6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\BookmarkFilter;
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']);
818b3193
A
99 static::assertSame('/subfolder', $this->assignedValues['base_path']);
100 static::assertSame('/subfolder/tpl/default', $this->assignedValues['asset_path']);
0498b209
A
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 }
af290059
A
109
110 /**
111 * Test redirectFromReferer() - Default behaviour
112 */
113 public function testRedirectFromRefererDefault(): void
114 {
af290059
A
115 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
116
117 $response = new Response();
118
2899ebb5 119 $result = $this->controller->redirectFromReferer($this->request, $response);
af290059
A
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 {
af290059
A
130 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
131
132 $response = new Response();
133
2899ebb5 134 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope']);
af290059
A
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 {
af290059
A
145 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
146
147 $response = new Response();
148
2899ebb5 149 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope', 'controller']);
af290059
A
150
151 static::assertSame(302, $result->getStatusCode());
818b3193 152 static::assertSame(['/subfolder/'], $result->getHeader('location'));
af290059
A
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 {
af290059
A
160 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
161
162 $response = new Response();
163
2899ebb5 164 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope', 'other']);
af290059
A
165
166 static::assertSame(302, $result->getStatusCode());
818b3193 167 static::assertSame(['/subfolder/'], $result->getHeader('location'));
af290059
A
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 {
af290059
A
176 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
177
178 $response = new Response();
179
2899ebb5 180 $result = $this->controller->redirectFromReferer($this->request, $response, ['nope', 'param']);
af290059
A
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 {
af290059
A
192 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
193
194 $response = new Response();
195
2899ebb5 196 $result = $this->controller->redirectFromReferer($this->request, $response, ['shaarli']);
af290059
A
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 {
af290059
A
208 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2';
209
210 $response = new Response();
211
2899ebb5 212 $result = $this->controller->redirectFromReferer($this->request, $response, ['query'], ['query']);
af290059
A
213
214 static::assertSame(302, $result->getStatusCode());
215 static::assertSame(['/subfolder/controller?other=2'], $result->getHeader('location'));
216 }
0498b209 217}