]> git.immae.eu Git - github/shaarli/Shaarli.git/blobdiff - tests/front/controller/admin/ConfigureControllerTest.php
Process configure page through Slim controller
[github/shaarli/Shaarli.git] / tests / front / controller / admin / ConfigureControllerTest.php
diff --git a/tests/front/controller/admin/ConfigureControllerTest.php b/tests/front/controller/admin/ConfigureControllerTest.php
new file mode 100644 (file)
index 0000000..40304a1
--- /dev/null
@@ -0,0 +1,252 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Shaarli\Front\Controller\Admin;
+
+use PHPUnit\Framework\TestCase;
+use Shaarli\Config\ConfigManager;
+use Shaarli\Front\Exception\WrongTokenException;
+use Shaarli\Security\SessionManager;
+use Shaarli\Thumbnailer;
+use Slim\Http\Request;
+use Slim\Http\Response;
+
+class ConfigureControllerTest extends TestCase
+{
+    use FrontAdminControllerMockHelper;
+
+    /** @var ConfigureController */
+    protected $controller;
+
+    public function setUp(): void
+    {
+        $this->createContainer();
+
+        $this->controller = new ConfigureController($this->container);
+    }
+
+    /**
+     * Test displaying configure page - it should display all config variables
+     */
+    public function testIndex(): void
+    {
+        $assignedVariables = [];
+        $this->assignTemplateVars($assignedVariables);
+
+        $request = $this->createMock(Request::class);
+        $response = new Response();
+
+        $this->container->conf = $this->createMock(ConfigManager::class);
+        $this->container->conf->method('get')->willReturnCallback(function (string $key) {
+            return $key;
+        });
+
+        $result = $this->controller->index($request, $response);
+
+        static::assertSame(200, $result->getStatusCode());
+        static::assertSame('configure', (string) $result->getBody());
+
+        static::assertSame('Configure - general.title', $assignedVariables['pagetitle']);
+        static::assertSame('general.title', $assignedVariables['title']);
+        static::assertSame('resource.theme', $assignedVariables['theme']);
+        static::assertEmpty($assignedVariables['theme_available']);
+        static::assertSame(['default', 'markdown'], $assignedVariables['formatter_available']);
+        static::assertNotEmpty($assignedVariables['continents']);
+        static::assertNotEmpty($assignedVariables['cities']);
+        static::assertSame('general.retrieve_description', $assignedVariables['retrieve_description']);
+        static::assertSame('privacy.default_private_links', $assignedVariables['private_links_default']);
+        static::assertSame('security.session_protection_disabled', $assignedVariables['session_protection_disabled']);
+        static::assertSame('feed.rss_permalinks', $assignedVariables['enable_rss_permalinks']);
+        static::assertSame('updates.check_updates', $assignedVariables['enable_update_check']);
+        static::assertSame('privacy.hide_public_links', $assignedVariables['hide_public_links']);
+        static::assertSame('api.enabled', $assignedVariables['api_enabled']);
+        static::assertSame('api.secret', $assignedVariables['api_secret']);
+        static::assertCount(4, $assignedVariables['languages']);
+        static::assertArrayHasKey('gd_enabled', $assignedVariables);
+        static::assertSame('thumbnails.mode', $assignedVariables['thumbnails_mode']);
+    }
+
+    /**
+     * Test posting a new config - make sure that everything is saved properly, without errors.
+     */
+    public function testSaveNewConfig(): void
+    {
+        $session = [];
+        $this->assignSessionVars($session);
+
+        $parameters = [
+            'token' => 'token',
+            'continent' => 'Europe',
+            'city' => 'Moscow',
+            'title' => 'Shaarli',
+            'titleLink' => './',
+            'retrieveDescription' => 'on',
+            'theme' => 'vintage',
+            'disablesessionprotection' => null,
+            'privateLinkByDefault' => true,
+            'enableRssPermalinks' => true,
+            'updateCheck' => false,
+            'hidePublicLinks' => 'on',
+            'enableApi' => 'on',
+            'apiSecret' => 'abcdef',
+            'formatter' => 'markdown',
+            'language' => 'fr',
+            'enableThumbnails' => Thumbnailer::MODE_NONE,
+        ];
+
+        $parametersConfigMapping = [
+            'general.timezone' => $parameters['continent'] . '/' . $parameters['city'],
+            'general.title' => $parameters['title'],
+            'general.header_link' => $parameters['titleLink'],
+            'general.retrieve_description' => !!$parameters['retrieveDescription'],
+            'resource.theme' => $parameters['theme'],
+            'security.session_protection_disabled' => !!$parameters['disablesessionprotection'],
+            'privacy.default_private_links' => !!$parameters['privateLinkByDefault'],
+            'feed.rss_permalinks' => !!$parameters['enableRssPermalinks'],
+            'updates.check_updates' => !!$parameters['updateCheck'],
+            'privacy.hide_public_links' => !!$parameters['hidePublicLinks'],
+            'api.enabled' => !!$parameters['enableApi'],
+            'api.secret' => $parameters['apiSecret'],
+            'formatter' => $parameters['formatter'],
+            'translation.language' => $parameters['language'],
+            'thumbnails.mode' => $parameters['enableThumbnails'],
+        ];
+
+        $request = $this->createMock(Request::class);
+        $request
+            ->expects(static::atLeastOnce())
+            ->method('getParam')->willReturnCallback(function (string $key) use ($parameters) {
+                if (false === array_key_exists($key, $parameters)) {
+                    static::fail('unknown key: ' . $key);
+                }
+
+                return $parameters[$key];
+            }
+        );
+
+        $response = new Response();
+
+        $this->container->conf = $this->createMock(ConfigManager::class);
+        $this->container->conf
+            ->expects(static::atLeastOnce())
+            ->method('set')
+            ->willReturnCallback(function (string $key, $value) use ($parametersConfigMapping): void {
+                if (false === array_key_exists($key, $parametersConfigMapping)) {
+                    static::fail('unknown key: ' . $key);
+                }
+
+                static::assertSame($parametersConfigMapping[$key], $value);
+            }
+        );
+
+        $result = $this->controller->save($request, $response);
+        static::assertSame(302, $result->getStatusCode());
+        static::assertSame(['./configure'], $result->getHeader('Location'));
+
+        static::assertArrayNotHasKey(SessionManager::KEY_WARNING_MESSAGES, $session);
+        static::assertArrayNotHasKey(SessionManager::KEY_ERROR_MESSAGES, $session);
+        static::assertArrayHasKey(SessionManager::KEY_SUCCESS_MESSAGES, $session);
+        static::assertSame(['Configuration was saved.'], $session[SessionManager::KEY_SUCCESS_MESSAGES]);
+    }
+
+    /**
+     * Test posting a new config - wrong token.
+     */
+    public function testSaveNewConfigWrongToken(): void
+    {
+        $this->container->sessionManager = $this->createMock(SessionManager::class);
+        $this->container->sessionManager->method('checkToken')->willReturn(false);
+
+        $this->container->conf->expects(static::never())->method('set');
+        $this->container->conf->expects(static::never())->method('write');
+
+        $request = $this->createMock(Request::class);
+        $response = new Response();
+
+        $this->expectException(WrongTokenException::class);
+
+        $this->controller->save($request, $response);
+    }
+
+    /**
+     * Test posting a new config - thumbnail activation.
+     */
+    public function testSaveNewConfigThumbnailsActivation(): void
+    {
+        $session = [];
+        $this->assignSessionVars($session);
+
+        $request = $this->createMock(Request::class);
+        $request
+            ->expects(static::atLeastOnce())
+            ->method('getParam')->willReturnCallback(function (string $key) {
+                if ('enableThumbnails' === $key) {
+                    return Thumbnailer::MODE_ALL;
+                }
+
+                return $key;
+            })
+        ;
+        $response = new Response();
+
+        $result = $this->controller->save($request, $response);
+
+        static::assertSame(302, $result->getStatusCode());
+        static::assertSame(['./configure'], $result->getHeader('Location'));
+
+        static::assertArrayNotHasKey(SessionManager::KEY_ERROR_MESSAGES, $session);
+        static::assertArrayHasKey(SessionManager::KEY_WARNING_MESSAGES, $session);
+        static::assertStringContainsString(
+            'You have enabled or changed thumbnails mode',
+            $session[SessionManager::KEY_WARNING_MESSAGES][0]
+        );
+        static::assertArrayHasKey(SessionManager::KEY_SUCCESS_MESSAGES, $session);
+        static::assertSame(['Configuration was saved.'], $session[SessionManager::KEY_SUCCESS_MESSAGES]);
+    }
+
+    /**
+     * Test posting a new config - thumbnail activation.
+     */
+    public function testSaveNewConfigThumbnailsAlreadyActive(): void
+    {
+        $session = [];
+        $this->assignSessionVars($session);
+
+        $request = $this->createMock(Request::class);
+        $request
+            ->expects(static::atLeastOnce())
+            ->method('getParam')->willReturnCallback(function (string $key) {
+                if ('enableThumbnails' === $key) {
+                    return Thumbnailer::MODE_ALL;
+                }
+
+                return $key;
+            })
+        ;
+        $response = new Response();
+
+        $this->container->conf = $this->createMock(ConfigManager::class);
+        $this->container->conf
+            ->expects(static::atLeastOnce())
+            ->method('get')
+            ->willReturnCallback(function (string $key): string {
+                if ('thumbnails.mode' === $key) {
+                    return Thumbnailer::MODE_ALL;
+                }
+
+                return $key;
+            })
+        ;
+
+        $result = $this->controller->save($request, $response);
+
+        static::assertSame(302, $result->getStatusCode());
+        static::assertSame(['./configure'], $result->getHeader('Location'));
+
+        static::assertArrayNotHasKey(SessionManager::KEY_ERROR_MESSAGES, $session);
+        static::assertArrayNotHasKey(SessionManager::KEY_WARNING_MESSAGES, $session);
+        static::assertArrayHasKey(SessionManager::KEY_SUCCESS_MESSAGES, $session);
+        static::assertSame(['Configuration was saved.'], $session[SessionManager::KEY_SUCCESS_MESSAGES]);
+    }
+}