<?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]);
}
}