<?php
declare(strict_types=1);
namespace Shaarli\Front\Controller\Admin;
use Shaarli\Config\ConfigManager;
use Shaarli\Security\SessionManager;
use Shaarli\TestCase;
use Slim\Http\Request;
use Slim\Http\Response;
/**
* Test Server administration controller.
*/
class ServerControllerTest extends TestCase
{
use FrontAdminControllerMockHelper;
/** @var ServerController */
protected $controller;
public function setUp(): void
{
$this->createContainer();
$this->controller = new ServerController($this->container);
// initialize dummy cache
@mkdir('sandbox/');
foreach (['pagecache', 'tmp', 'cache'] as $folder) {
@mkdir('sandbox/' . $folder);
@touch('sandbox/' . $folder . '/.htaccess');
@touch('sandbox/' . $folder . '/1');
@touch('sandbox/' . $folder . '/2');
}
}
public function tearDown(): void
{
foreach (['pagecache', 'tmp', 'cache'] as $folder) {
@unlink('sandbox/' . $folder . '/.htaccess');
@unlink('sandbox/' . $folder . '/1');
@unlink('sandbox/' . $folder . '/2');
@rmdir('sandbox/' . $folder);
}
}
/**
* Test default display of server administration page.
*/
public function testIndex(): void
{
$request = $this->createMock(Request::class);
$response = new Response();
// Save RainTPL assigned variables
$assignedVariables = [];
$this->assignTemplateVars($assignedVariables);
$result = $this->controller->index($request, $response);
static::assertSame(200, $result->getStatusCode());
static::assertSame('server', (string) $result->getBody());
static::assertSame(PHP_VERSION, $assignedVariables['php_version']);
static::assertArrayHasKey('php_has_reached_eol', $assignedVariables);
static::assertArrayHasKey('php_eol', $assignedVariables);
static::assertArrayHasKey('php_extensions', $assignedVariables);
static::assertArrayHasKey('permissions', $assignedVariables);
static::assertEmpty($assignedVariables['permissions']);
static::assertRegExp(
'#https://github\.com/shaarli/Shaarli/releases/tag/v\d+\.\d+\.\d+#',
$assignedVariables['release_url']
);
static::assertRegExp('#v\d+\.\d+\.\d+#', $assignedVariables['latest_version']);
static::assertRegExp('#(v\d+\.\d+\.\d+|dev)#', $assignedVariables['current_version']);
static::assertArrayHasKey('index_url', $assignedVariables);
static::assertArrayHasKey('client_ip', $assignedVariables);
static::assertArrayHasKey('trusted_proxies', $assignedVariables);
static::assertSame('Server administration - Shaarli', $assignedVariables['pagetitle']);
}
/**
* Test clearing the main cache
*/
public function testClearMainCache(): void
{
$this->container->conf = $this->createMock(ConfigManager::class);
$this->container->conf->method('get')->willReturnCallback(function (string $key, $default) {
if ($key === 'resource.page_cache') {
return 'sandbox/pagecache';
} elseif ($key === 'resource.raintpl_tmp') {
return 'sandbox/tmp';
} elseif ($key === 'resource.thumbnails_cache') {
return 'sandbox/cache';
} else {
return $default;
}
});
$this->container->sessionManager
->expects(static::once())
->method('setSessionParameter')
->with(SessionManager::KEY_SUCCESS_MESSAGES, ['Shaarli\'s cache folder has been cleared!'])
;
$request = $this->createMock(Request::class);
$request->method('getQueryParam')->with('type')->willReturn('main');
$response = new Response();
$result = $this->controller->clearCache($request, $response);
static::assertSame(302, $result->getStatusCode());
static::assertSame('/subfolder/admin/server', (string) $result->getHeaderLine('Location'));
static::assertFileNotExists('sandbox/pagecache/1');
static::assertFileNotExists('sandbox/pagecache/2');
static::assertFileNotExists('sandbox/tmp/1');
static::assertFileNotExists('sandbox/tmp/2');
static::assertFileExists('sandbox/pagecache/.htaccess');
static::assertFileExists('sandbox/tmp/.htaccess');
static::assertFileExists('sandbox/cache');
static::assertFileExists('sandbox/cache/.htaccess');
static::assertFileExists('sandbox/cache/1');
static::assertFileExists('sandbox/cache/2');
}
/**
* Test clearing thumbnails cache
*/
public function testClearThumbnailsCache(): void
{
$this->container->conf = $this->createMock(ConfigManager::class);
$this->container->conf->method('get')->willReturnCallback(function (string $key, $default) {
if ($key === 'resource.page_cache') {
return 'sandbox/pagecache';
} elseif ($key === 'resource.raintpl_tmp') {
return 'sandbox/tmp';
} elseif ($key === 'resource.thumbnails_cache') {
return 'sandbox/cache';
} else {
return $default;
}
});
$this->container->sessionManager
->expects(static::once())
->method('setSessionParameter')
->willReturnCallback(function (string $key, array $value): SessionManager {
static::assertSame(SessionManager::KEY_WARNING_MESSAGES, $key);
static::assertCount(1, $value);
static::assertStringStartsWith('Thumbnails cache has been cleared.', $value[0]);
return $this->container->sessionManager;
});
;
$request = $this->createMock(Request::class);
$request->method('getQueryParam')->with('type')->willReturn('thumbnails');
$response = new Response();
$result = $this->controller->clearCache($request, $response);
static::assertSame(302, $result->getStatusCode());
static::assertSame('/subfolder/admin/server', (string) $result->getHeaderLine('Location'));
static::assertFileNotExists('sandbox/cache/1');
static::assertFileNotExists('sandbox/cache/2');
static::assertFileExists('sandbox/cache/.htaccess');
static::assertFileExists('sandbox/pagecache');
static::assertFileExists('sandbox/pagecache/.htaccess');
static::assertFileExists('sandbox/pagecache/1');
static::assertFileExists('sandbox/pagecache/2');
static::assertFileExists('sandbox/tmp');
static::assertFileExists('sandbox/tmp/.htaccess');
static::assertFileExists('sandbox/tmp/1');
static::assertFileExists('sandbox/tmp/2');
}
}