3 declare(strict_types
=1);
5 namespace Shaarli\Front\Controller\Admin
;
7 use PHPUnit\Framework\TestCase
;
8 use Shaarli\Config\ConfigManager
;
9 use Shaarli\Front\Exception\WrongTokenException
;
10 use Shaarli\Security\SessionManager
;
11 use Shaarli\Thumbnailer
;
12 use Slim\Http\Request
;
13 use Slim\Http\Response
;
15 class ConfigureControllerTest
extends TestCase
17 use FrontAdminControllerMockHelper
;
19 /** @var ConfigureController */
20 protected $controller;
22 public function setUp(): void
24 $this->createContainer();
26 $this->controller
= new ConfigureController($this->container
);
30 * Test displaying configure page - it should display all config variables
32 public function testIndex(): void
34 $assignedVariables = [];
35 $this->assignTemplateVars($assignedVariables);
37 $request = $this->createMock(Request
::class);
38 $response = new Response();
40 $this->container
->conf
= $this->createMock(ConfigManager
::class);
41 $this->container
->conf
->method('get')->willReturnCallback(function (string $key) {
45 $result = $this->controller
->index($request, $response);
47 static::assertSame(200, $result->getStatusCode());
48 static::assertSame('configure', (string) $result->getBody());
50 static::assertSame('Configure - general.title', $assignedVariables['pagetitle']);
51 static::assertSame('general.title', $assignedVariables['title']);
52 static::assertSame('resource.theme', $assignedVariables['theme']);
53 static::assertEmpty($assignedVariables['theme_available']);
54 static::assertSame(['default', 'markdown'], $assignedVariables['formatter_available']);
55 static::assertNotEmpty($assignedVariables['continents']);
56 static::assertNotEmpty($assignedVariables['cities']);
57 static::assertSame('general.retrieve_description', $assignedVariables['retrieve_description']);
58 static::assertSame('privacy.default_private_links', $assignedVariables['private_links_default']);
59 static::assertSame('security.session_protection_disabled', $assignedVariables['session_protection_disabled']);
60 static::assertSame('feed.rss_permalinks', $assignedVariables['enable_rss_permalinks']);
61 static::assertSame('updates.check_updates', $assignedVariables['enable_update_check']);
62 static::assertSame('privacy.hide_public_links', $assignedVariables['hide_public_links']);
63 static::assertSame('api.enabled', $assignedVariables['api_enabled']);
64 static::assertSame('api.secret', $assignedVariables['api_secret']);
65 static::assertCount(5, $assignedVariables['languages']);
66 static::assertArrayHasKey('gd_enabled', $assignedVariables);
67 static::assertSame('thumbnails.mode', $assignedVariables['thumbnails_mode']);
71 * Test posting a new config - make sure that everything is saved properly, without errors.
73 public function testSaveNewConfig(): void
76 $this->assignSessionVars($session);
80 'continent' => 'Europe',
84 'retrieveDescription' => 'on',
86 'disablesessionprotection' => null,
87 'privateLinkByDefault' => true,
88 'enableRssPermalinks' => true,
89 'updateCheck' => false,
90 'hidePublicLinks' => 'on',
92 'apiSecret' => 'abcdef',
93 'formatter' => 'markdown',
95 'enableThumbnails' => Thumbnailer
::MODE_NONE
,
98 $parametersConfigMapping = [
99 'general.timezone' => $parameters['continent'] . '/' . $parameters['city'],
100 'general.title' => $parameters['title'],
101 'general.header_link' => $parameters['titleLink'],
102 'general.retrieve_description' => !!$parameters['retrieveDescription'],
103 'resource.theme' => $parameters['theme'],
104 'security.session_protection_disabled' => !!$parameters['disablesessionprotection'],
105 'privacy.default_private_links' => !!$parameters['privateLinkByDefault'],
106 'feed.rss_permalinks' => !!$parameters['enableRssPermalinks'],
107 'updates.check_updates' => !!$parameters['updateCheck'],
108 'privacy.hide_public_links' => !!$parameters['hidePublicLinks'],
109 'api.enabled' => !!$parameters['enableApi'],
110 'api.secret' => $parameters['apiSecret'],
111 'formatter' => $parameters['formatter'],
112 'translation.language' => $parameters['language'],
113 'thumbnails.mode' => $parameters['enableThumbnails'],
116 $request = $this->createMock(Request
::class);
118 ->expects(static::atLeastOnce())
119 ->method('getParam')->willReturnCallback(function (string $key) use ($parameters) {
120 if (false === array_key_exists($key, $parameters)) {
121 static::fail('unknown key: ' . $key);
124 return $parameters[$key];
128 $response = new Response();
130 $this->container
->conf
= $this->createMock(ConfigManager
::class);
131 $this->container
->conf
132 ->expects(static::atLeastOnce())
134 ->willReturnCallback(function (string $key, $value) use ($parametersConfigMapping): void {
135 if (false === array_key_exists($key, $parametersConfigMapping)) {
136 static::fail('unknown key: ' . $key);
139 static::assertSame($parametersConfigMapping[$key], $value);
143 $result = $this->controller
->save($request, $response);
144 static::assertSame(302, $result->getStatusCode());
145 static::assertSame(['/subfolder/admin/configure'], $result->getHeader('Location'));
147 static::assertArrayNotHasKey(SessionManager
::KEY_WARNING_MESSAGES
, $session);
148 static::assertArrayNotHasKey(SessionManager
::KEY_ERROR_MESSAGES
, $session);
149 static::assertArrayHasKey(SessionManager
::KEY_SUCCESS_MESSAGES
, $session);
150 static::assertSame(['Configuration was saved.'], $session[SessionManager
::KEY_SUCCESS_MESSAGES
]);
154 * Test posting a new config - wrong token.
156 public function testSaveNewConfigWrongToken(): void
158 $this->container
->sessionManager
= $this->createMock(SessionManager
::class);
159 $this->container
->sessionManager
->method('checkToken')->willReturn(false);
161 $this->container
->conf
->expects(static::never())->method('set');
162 $this->container
->conf
->expects(static::never())->method('write');
164 $request = $this->createMock(Request
::class);
165 $response = new Response();
167 $this->expectException(WrongTokenException
::class);
169 $this->controller
->save($request, $response);
173 * Test posting a new config - thumbnail activation.
175 public function testSaveNewConfigThumbnailsActivation(): void
178 $this->assignSessionVars($session);
180 $request = $this->createMock(Request
::class);
182 ->expects(static::atLeastOnce())
183 ->method('getParam')->willReturnCallback(function (string $key) {
184 if ('enableThumbnails' === $key) {
185 return Thumbnailer
::MODE_ALL
;
191 $response = new Response();
193 $result = $this->controller
->save($request, $response);
195 static::assertSame(302, $result->getStatusCode());
196 static::assertSame(['/subfolder/admin/configure'], $result->getHeader('Location'));
198 static::assertArrayNotHasKey(SessionManager
::KEY_ERROR_MESSAGES
, $session);
199 static::assertArrayHasKey(SessionManager
::KEY_WARNING_MESSAGES
, $session);
200 static::assertStringContainsString(
201 'You have enabled or changed thumbnails mode',
202 $session[SessionManager
::KEY_WARNING_MESSAGES
][0]
204 static::assertArrayHasKey(SessionManager
::KEY_SUCCESS_MESSAGES
, $session);
205 static::assertSame(['Configuration was saved.'], $session[SessionManager
::KEY_SUCCESS_MESSAGES
]);
209 * Test posting a new config - thumbnail activation.
211 public function testSaveNewConfigThumbnailsAlreadyActive(): void
214 $this->assignSessionVars($session);
216 $request = $this->createMock(Request
::class);
218 ->expects(static::atLeastOnce())
219 ->method('getParam')->willReturnCallback(function (string $key) {
220 if ('enableThumbnails' === $key) {
221 return Thumbnailer
::MODE_ALL
;
227 $response = new Response();
229 $this->container
->conf
= $this->createMock(ConfigManager
::class);
230 $this->container
->conf
231 ->expects(static::atLeastOnce())
233 ->willReturnCallback(function (string $key): string {
234 if ('thumbnails.mode' === $key) {
235 return Thumbnailer
::MODE_ALL
;
242 $result = $this->controller
->save($request, $response);
244 static::assertSame(302, $result->getStatusCode());
245 static::assertSame(['/subfolder/admin/configure'], $result->getHeader('Location'));
247 static::assertArrayNotHasKey(SessionManager
::KEY_ERROR_MESSAGES
, $session);
248 static::assertArrayNotHasKey(SessionManager
::KEY_WARNING_MESSAGES
, $session);
249 static::assertArrayHasKey(SessionManager
::KEY_SUCCESS_MESSAGES
, $session);
250 static::assertSame(['Configuration was saved.'], $session[SessionManager
::KEY_SUCCESS_MESSAGES
]);