Refactor front controller tests to create container mock using a trait

This commit is contained in:
ArthurHoaro 2020-05-20 12:43:40 +02:00
parent 5ec4708ced
commit dd09ec52b2
12 changed files with 232 additions and 465 deletions

View file

@ -21,3 +21,5 @@ function is_iterable($var)
require_once 'tests/utils/ReferenceLinkDB.php'; require_once 'tests/utils/ReferenceLinkDB.php';
require_once 'tests/utils/ReferenceHistory.php'; require_once 'tests/utils/ReferenceHistory.php';
require_once 'tests/utils/FakeBookmarkService.php'; require_once 'tests/utils/FakeBookmarkService.php';
require_once 'tests/container/ShaarliTestContainer.php';
require_once 'tests/front/controller/FrontControllerMockHelper.php';

View file

@ -0,0 +1,38 @@
<?php
declare(strict_types=1);
namespace Shaarli\Container;
use PHPUnit\Framework\MockObject\MockObject;
use Shaarli\Bookmark\BookmarkServiceInterface;
use Shaarli\Config\ConfigManager;
use Shaarli\Feed\FeedBuilder;
use Shaarli\Formatter\FormatterFactory;
use Shaarli\History;
use Shaarli\Plugin\PluginManager;
use Shaarli\Render\PageBuilder;
use Shaarli\Render\PageCacheManager;
use Shaarli\Security\LoginManager;
use Shaarli\Security\SessionManager;
/**
* Test helper allowing auto-completion for MockObjects.
*
* @property mixed[] $environment $_SERVER automatically injected by Slim
* @property MockObject|ConfigManager $conf
* @property MockObject|SessionManager $sessionManager
* @property MockObject|LoginManager $loginManager
* @property MockObject|string $webPath
* @property MockObject|History $history
* @property MockObject|BookmarkServiceInterface $bookmarkService
* @property MockObject|PageBuilder $pageBuilder
* @property MockObject|PluginManager $pluginManager
* @property MockObject|FormatterFactory $formatterFactory
* @property MockObject|PageCacheManager $pageCacheManager
* @property MockObject|FeedBuilder $feedBuilder
*/
class ShaarliTestContainer extends ShaarliContainer
{
}

View file

@ -6,31 +6,21 @@
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\Bookmark; use Shaarli\Bookmark\Bookmark;
use Shaarli\Bookmark\BookmarkServiceInterface;
use Shaarli\Config\ConfigManager;
use Shaarli\Container\ShaarliContainer;
use Shaarli\Feed\CachedPage; use Shaarli\Feed\CachedPage;
use Shaarli\Formatter\BookmarkFormatter;
use Shaarli\Formatter\BookmarkRawFormatter;
use Shaarli\Formatter\FormatterFactory;
use Shaarli\Plugin\PluginManager;
use Shaarli\Render\PageBuilder;
use Shaarli\Render\PageCacheManager;
use Shaarli\Security\LoginManager;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
class DailyControllerTest extends TestCase class DailyControllerTest extends TestCase
{ {
/** @var ShaarliContainer */ use FrontControllerMockHelper;
protected $container;
/** @var DailyController */ /** @var DailyController */
protected $controller; protected $controller;
public function setUp(): void public function setUp(): void
{ {
$this->container = $this->createMock(ShaarliContainer::class); $this->createContainer();
$this->controller = new DailyController($this->container); $this->controller = new DailyController($this->container);
DailyController::$DAILY_RSS_NB_DAYS = 2; DailyController::$DAILY_RSS_NB_DAYS = 2;
} }
@ -105,7 +95,8 @@ public function testValidIndexControllerInvokeDefault(): void
static::assertArrayHasKey('loggedin', $param); static::assertArrayHasKey('loggedin', $param);
return $data; return $data;
}); })
;
$result = $this->controller->index($request, $response); $result = $this->controller->index($request, $response);
@ -497,71 +488,6 @@ public function testValidRssControllerInvokeNoBookmark(): void
static::assertCount(0, $assignedVariables['days']); static::assertCount(0, $assignedVariables['days']);
} }
protected function createValidContainerMockSet(): void
{
$loginManager = $this->createMock(LoginManager::class);
$this->container->loginManager = $loginManager;
// Config
$conf = $this->createMock(ConfigManager::class);
$this->container->conf = $conf;
$this->container->conf->method('get')->willReturnCallback(function (string $parameter, $default) {
return $default;
});
// PageBuilder
$pageBuilder = $this->createMock(PageBuilder::class);
$pageBuilder
->method('render')
->willReturnCallback(function (string $template): string {
return $template;
})
;
$this->container->pageBuilder = $pageBuilder;
// Plugin Manager
$pluginManager = $this->createMock(PluginManager::class);
$this->container->pluginManager = $pluginManager;
// BookmarkService
$bookmarkService = $this->createMock(BookmarkServiceInterface::class);
$this->container->bookmarkService = $bookmarkService;
// Formatter
$formatterFactory = $this->createMock(FormatterFactory::class);
$formatterFactory
->method('getFormatter')
->willReturnCallback(function (): BookmarkFormatter {
return new BookmarkRawFormatter($this->container->conf, true);
})
;
$this->container->formatterFactory = $formatterFactory;
// CacheManager
$pageCacheManager = $this->createMock(PageCacheManager::class);
$this->container->pageCacheManager = $pageCacheManager;
// $_SERVER
$this->container->environment = [
'SERVER_NAME' => 'shaarli',
'SERVER_PORT' => '80',
'REQUEST_URI' => '/daily-rss',
];
}
protected function assignTemplateVars(array &$variables): void
{
$this->container->pageBuilder
->expects(static::atLeastOnce())
->method('assign')
->willReturnCallback(function ($key, $value) use (&$variables) {
$variables[$key] = $value;
return $this;
})
;
}
protected static function generateContent(int $length): string protected static function generateContent(int $length): string
{ {
// bin2hex(random_bytes) generates string twice as long as given parameter // bin2hex(random_bytes) generates string twice as long as given parameter

View file

@ -5,29 +5,23 @@
namespace Shaarli\Front\Controller; namespace Shaarli\Front\Controller;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\BookmarkServiceInterface;
use Shaarli\Config\ConfigManager;
use Shaarli\Container\ShaarliContainer;
use Shaarli\Feed\FeedBuilder; use Shaarli\Feed\FeedBuilder;
use Shaarli\Formatter\FormatterFactory;
use Shaarli\Plugin\PluginManager;
use Shaarli\Render\PageBuilder;
use Shaarli\Render\PageCacheManager;
use Shaarli\Security\LoginManager;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
class FeedControllerTest extends TestCase class FeedControllerTest extends TestCase
{ {
/** @var ShaarliContainer */ use FrontControllerMockHelper;
protected $container;
/** @var FeedController */ /** @var FeedController */
protected $controller; protected $controller;
public function setUp(): void public function setUp(): void
{ {
$this->container = $this->createMock(ShaarliContainer::class); $this->createContainer();
$this->container->feedBuilder = $this->createMock(FeedBuilder::class);
$this->controller = new FeedController($this->container); $this->controller = new FeedController($this->container);
} }
@ -154,66 +148,4 @@ public function testAtomControllerWithParameters(): void
static::assertSame('feed.atom', (string) $result->getBody()); static::assertSame('feed.atom', (string) $result->getBody());
static::assertSame('data', $assignedVariables['content']); static::assertSame('data', $assignedVariables['content']);
} }
protected function createValidContainerMockSet(): void
{
$loginManager = $this->createMock(LoginManager::class);
$this->container->loginManager = $loginManager;
// Config
$conf = $this->createMock(ConfigManager::class);
$this->container->conf = $conf;
$this->container->conf->method('get')->willReturnCallback(function (string $parameter, $default) {
return $default;
});
// PageBuilder
$pageBuilder = $this->createMock(PageBuilder::class);
$pageBuilder
->method('render')
->willReturnCallback(function (string $template): string {
return $template;
})
;
$this->container->pageBuilder = $pageBuilder;
$bookmarkService = $this->createMock(BookmarkServiceInterface::class);
$this->container->bookmarkService = $bookmarkService;
// Plugin Manager
$pluginManager = $this->createMock(PluginManager::class);
$this->container->pluginManager = $pluginManager;
// Formatter
$formatterFactory = $this->createMock(FormatterFactory::class);
$this->container->formatterFactory = $formatterFactory;
// CacheManager
$pageCacheManager = $this->createMock(PageCacheManager::class);
$this->container->pageCacheManager = $pageCacheManager;
// FeedBuilder
$feedBuilder = $this->createMock(FeedBuilder::class);
$this->container->feedBuilder = $feedBuilder;
// $_SERVER
$this->container->environment = [
'SERVER_NAME' => 'shaarli',
'SERVER_PORT' => '80',
'REQUEST_URI' => '/daily-rss',
];
}
protected function assignTemplateVars(array &$variables): void
{
$this->container->pageBuilder
->expects(static::atLeastOnce())
->method('assign')
->willReturnCallback(function ($key, $value) use (&$variables) {
$variables[$key] = $value;
return $this;
})
;
}
} }

View file

@ -0,0 +1,114 @@
<?php
declare(strict_types=1);
namespace Shaarli\Front\Controller;
use PHPUnit\Framework\MockObject\MockObject;
use Shaarli\Bookmark\BookmarkServiceInterface;
use Shaarli\Config\ConfigManager;
use Shaarli\Container\ShaarliTestContainer;
use Shaarli\Formatter\BookmarkFormatter;
use Shaarli\Formatter\BookmarkRawFormatter;
use Shaarli\Formatter\FormatterFactory;
use Shaarli\Plugin\PluginManager;
use Shaarli\Render\PageBuilder;
use Shaarli\Render\PageCacheManager;
use Shaarli\Security\LoginManager;
use Shaarli\Security\SessionManager;
/**
* Trait FrontControllerMockHelper
*
* Helper trait used to initialize the ShaarliContainer and mock its services for controller tests.
*
* @property ShaarliTestContainer $container
* @package Shaarli\Front\Controller
*/
trait FrontControllerMockHelper
{
/** @var ShaarliTestContainer */
protected $container;
/**
* Mock the container instance
*/
protected function createContainer(): void
{
$this->container = $this->createMock(ShaarliTestContainer::class);
}
/**
* Initialize container's services used by tests
*/
protected function createValidContainerMockSet(): void
{
$this->container->loginManager = $this->createMock(LoginManager::class);
// Config
$this->container->conf = $this->createMock(ConfigManager::class);
$this->container->conf->method('get')->willReturnCallback(function (string $parameter, $default) {
return $default;
});
// PageBuilder
$this->container->pageBuilder = $this->createMock(PageBuilder::class);
$this->container->pageBuilder
->method('render')
->willReturnCallback(function (string $template): string {
return $template;
})
;
// Plugin Manager
$this->container->pluginManager = $this->createMock(PluginManager::class);
// BookmarkService
$this->container->bookmarkService = $this->createMock(BookmarkServiceInterface::class);
// Formatter
$this->container->formatterFactory = $this->createMock(FormatterFactory::class);
$this->container->formatterFactory
->method('getFormatter')
->willReturnCallback(function (): BookmarkFormatter {
return new BookmarkRawFormatter($this->container->conf, true);
})
;
// CacheManager
$this->container->pageCacheManager = $this->createMock(PageCacheManager::class);
// SessionManager
$this->container->sessionManager = $this->createMock(SessionManager::class);
// $_SERVER
$this->container->environment = [
'SERVER_NAME' => 'shaarli',
'SERVER_PORT' => '80',
'REQUEST_URI' => '/daily-rss',
];
}
/**
* Pass a reference of an array which will be populated by `pageBuilder->assign` calls during execution.
*
* @param mixed $variables Array reference to populate.
*/
protected function assignTemplateVars(array &$variables): void
{
$this->container->pageBuilder
->expects(static::atLeastOnce())
->method('assign')
->willReturnCallback(function ($key, $value) use (&$variables) {
$variables[$key] = $value;
return $this;
})
;
}
/**
* Force to be used in PHPUnit context.
*/
protected abstract function createMock($originalClassName): MockObject;
}

View file

@ -5,27 +5,22 @@
namespace Shaarli\Front\Controller; namespace Shaarli\Front\Controller;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\BookmarkServiceInterface;
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\Container\ShaarliContainer;
use Shaarli\Front\Exception\LoginBannedException; use Shaarli\Front\Exception\LoginBannedException;
use Shaarli\Plugin\PluginManager;
use Shaarli\Render\PageBuilder;
use Shaarli\Security\LoginManager;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
class LoginControllerTest extends TestCase class LoginControllerTest extends TestCase
{ {
/** @var ShaarliContainer */ use FrontControllerMockHelper;
protected $container;
/** @var LoginController */ /** @var LoginController */
protected $controller; protected $controller;
public function setUp(): void public function setUp(): void
{ {
$this->container = $this->createMock(ShaarliContainer::class); $this->createContainer();
$this->controller = new LoginController($this->container); $this->controller = new LoginController($this->container);
} }
@ -47,6 +42,8 @@ public function testValidControllerInvoke(): void
}) })
; ;
$this->container->loginManager->method('canLogin')->willReturn(true);
$result = $this->controller->index($request, $response); $result = $this->controller->index($request, $response);
static::assertInstanceOf(Response::class, $result); static::assertInstanceOf(Response::class, $result);
@ -77,6 +74,8 @@ public function testValidControllerInvokeWithUserName(): void
}) })
; ;
$this->container->loginManager->expects(static::once())->method('canLogin')->willReturn(true);
$result = $this->controller->index($request, $response); $result = $this->controller->index($request, $response);
static::assertInstanceOf(Response::class, $result); static::assertInstanceOf(Response::class, $result);
@ -91,12 +90,12 @@ public function testValidControllerInvokeWithUserName(): void
public function testLoginControllerWhileLoggedIn(): void public function testLoginControllerWhileLoggedIn(): void
{ {
$this->createValidContainerMockSet();
$request = $this->createMock(Request::class); $request = $this->createMock(Request::class);
$response = new Response(); $response = new Response();
$loginManager = $this->createMock(LoginManager::class); $this->container->loginManager->expects(static::once())->method('isLoggedIn')->willReturn(true);
$loginManager->expects(static::once())->method('isLoggedIn')->willReturn(true);
$this->container->loginManager = $loginManager;
$result = $this->controller->index($request, $response); $result = $this->controller->index($request, $response);
@ -135,44 +134,11 @@ public function testLoginControllerWhileBanned(): void
$request = $this->createMock(Request::class); $request = $this->createMock(Request::class);
$response = new Response(); $response = new Response();
$loginManager = $this->createMock(LoginManager::class); $this->container->loginManager->method('isLoggedIn')->willReturn(false);
$loginManager->method('isLoggedIn')->willReturn(false); $this->container->loginManager->method('canLogin')->willReturn(false);
$loginManager->method('canLogin')->willReturn(false);
$this->container->loginManager = $loginManager;
$this->expectException(LoginBannedException::class); $this->expectException(LoginBannedException::class);
$this->controller->index($request, $response); $this->controller->index($request, $response);
} }
protected function createValidContainerMockSet(): void
{
// User logged out
$loginManager = $this->createMock(LoginManager::class);
$loginManager->method('isLoggedIn')->willReturn(false);
$loginManager->method('canLogin')->willReturn(true);
$this->container->loginManager = $loginManager;
// Config
$conf = $this->createMock(ConfigManager::class);
$conf->method('get')->willReturnCallback(function (string $parameter, $default) {
return $default;
});
$this->container->conf = $conf;
// PageBuilder
$pageBuilder = $this->createMock(PageBuilder::class);
$pageBuilder
->method('render')
->willReturnCallback(function (string $template): string {
return $template;
})
;
$this->container->pageBuilder = $pageBuilder;
$pluginManager = $this->createMock(PluginManager::class);
$this->container->pluginManager = $pluginManager;
$bookmarkService = $this->createMock(BookmarkServiceInterface::class);
$this->container->bookmarkService = $bookmarkService;
}
} }

View file

@ -12,8 +12,6 @@ function setcookie(string $name, string $value): void {
} }
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Shaarli\Container\ShaarliContainer;
use Shaarli\Render\PageCacheManager;
use Shaarli\Security\LoginManager; use Shaarli\Security\LoginManager;
use Shaarli\Security\SessionManager; use Shaarli\Security\SessionManager;
use Slim\Http\Request; use Slim\Http\Request;
@ -21,15 +19,15 @@ function setcookie(string $name, string $value): void {
class LogoutControllerTest extends TestCase class LogoutControllerTest extends TestCase
{ {
/** @var ShaarliContainer */ use FrontControllerMockHelper;
protected $container;
/** @var LogoutController */ /** @var LogoutController */
protected $controller; protected $controller;
public function setUp(): void public function setUp(): void
{ {
$this->container = $this->createMock(ShaarliContainer::class); $this->createContainer();
$this->controller = new LogoutController($this->container); $this->controller = new LogoutController($this->container);
setcookie(LoginManager::$STAY_SIGNED_IN_COOKIE, $cookie = 'hi there'); setcookie(LoginManager::$STAY_SIGNED_IN_COOKIE, $cookie = 'hi there');
@ -37,16 +35,15 @@ public function setUp(): void
public function testValidControllerInvoke(): void public function testValidControllerInvoke(): void
{ {
$this->createValidContainerMockSet();
$request = $this->createMock(Request::class); $request = $this->createMock(Request::class);
$response = new Response(); $response = new Response();
$pageCacheManager = $this->createMock(PageCacheManager::class); $this->container->pageCacheManager->expects(static::once())->method('invalidateCaches');
$pageCacheManager->expects(static::once())->method('invalidateCaches');
$this->container->pageCacheManager = $pageCacheManager;
$sessionManager = $this->createMock(SessionManager::class); $this->container->sessionManager = $this->createMock(SessionManager::class);
$sessionManager->expects(static::once())->method('logout'); $this->container->sessionManager->expects(static::once())->method('logout');
$this->container->sessionManager = $sessionManager;
static::assertSame('hi there', $_COOKIE[LoginManager::$STAY_SIGNED_IN_COOKIE]); static::assertSame('hi there', $_COOKIE[LoginManager::$STAY_SIGNED_IN_COOKIE]);

View file

@ -5,26 +5,22 @@
namespace front\controller; namespace front\controller;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\BookmarkServiceInterface; use Shaarli\Front\Controller\FrontControllerMockHelper;
use Shaarli\Container\ShaarliContainer;
use Shaarli\Front\Controller\OpenSearchController; use Shaarli\Front\Controller\OpenSearchController;
use Shaarli\Plugin\PluginManager;
use Shaarli\Render\PageBuilder;
use Shaarli\Security\LoginManager;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
class OpenSearchControllerTest extends TestCase class OpenSearchControllerTest extends TestCase
{ {
/** @var ShaarliContainer */ use FrontControllerMockHelper;
protected $container;
/** @var OpenSearchController */ /** @var OpenSearchController */
protected $controller; protected $controller;
public function setUp(): void public function setUp(): void
{ {
$this->container = $this->createMock(ShaarliContainer::class); $this->createContainer();
$this->controller = new OpenSearchController($this->container); $this->controller = new OpenSearchController($this->container);
} }
@ -42,51 +38,11 @@ public function testOpenSearchController(): void
$result = $this->controller->index($request, $response); $result = $this->controller->index($request, $response);
static::assertSame(200, $result->getStatusCode()); static::assertSame(200, $result->getStatusCode());
static::assertStringContainsString('application/xml', $result->getHeader('Content-Type')[0]); static::assertStringContainsString(
'application/opensearchdescription+xml',
$result->getHeader('Content-Type')[0]
);
static::assertSame('opensearch', (string) $result->getBody()); static::assertSame('opensearch', (string) $result->getBody());
static::assertSame('http://shaarli', $assignedVariables['serverurl']); static::assertSame('http://shaarli', $assignedVariables['serverurl']);
} }
protected function createValidContainerMockSet(): void
{
$loginManager = $this->createMock(LoginManager::class);
$this->container->loginManager = $loginManager;
// PageBuilder
$pageBuilder = $this->createMock(PageBuilder::class);
$pageBuilder
->method('render')
->willReturnCallback(function (string $template): string {
return $template;
})
;
$this->container->pageBuilder = $pageBuilder;
$bookmarkService = $this->createMock(BookmarkServiceInterface::class);
$this->container->bookmarkService = $bookmarkService;
// Plugin Manager
$pluginManager = $this->createMock(PluginManager::class);
$this->container->pluginManager = $pluginManager;
// $_SERVER
$this->container->environment = [
'SERVER_NAME' => 'shaarli',
'SERVER_PORT' => '80',
'REQUEST_URI' => '/open-search',
];
}
protected function assignTemplateVars(array &$variables): void
{
$this->container->pageBuilder
->expects(static::atLeastOnce())
->method('assign')
->willReturnCallback(function ($key, $value) use (&$variables) {
$variables[$key] = $value;
return $this;
})
;
}
} }

View file

@ -6,31 +6,23 @@
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\Bookmark; use Shaarli\Bookmark\Bookmark;
use Shaarli\Bookmark\BookmarkServiceInterface;
use Shaarli\Config\ConfigManager; use Shaarli\Config\ConfigManager;
use Shaarli\Container\ShaarliContainer;
use Shaarli\Formatter\BookmarkFormatter;
use Shaarli\Formatter\BookmarkRawFormatter;
use Shaarli\Formatter\FormatterFactory;
use Shaarli\Front\Exception\ThumbnailsDisabledException; use Shaarli\Front\Exception\ThumbnailsDisabledException;
use Shaarli\Plugin\PluginManager;
use Shaarli\Render\PageBuilder;
use Shaarli\Security\LoginManager;
use Shaarli\Thumbnailer; use Shaarli\Thumbnailer;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
class PictureWallControllerTest extends TestCase class PictureWallControllerTest extends TestCase
{ {
/** @var ShaarliContainer */ use FrontControllerMockHelper;
protected $container;
/** @var PictureWallController */ /** @var PictureWallController */
protected $controller; protected $controller;
public function setUp(): void public function setUp(): void
{ {
$this->container = $this->createMock(ShaarliContainer::class); $this->createContainer();
$this->controller = new PictureWallController($this->container); $this->controller = new PictureWallController($this->container);
} }
@ -43,6 +35,7 @@ public function testValidControllerInvokeDefault(): void
$response = new Response(); $response = new Response();
// ConfigManager: thumbnails are enabled // ConfigManager: thumbnails are enabled
$this->container->conf = $this->createMock(ConfigManager::class);
$this->container->conf->method('get')->willReturnCallback(function (string $parameter, $default) { $this->container->conf->method('get')->willReturnCallback(function (string $parameter, $default) {
if ($parameter === 'thumbnails.mode') { if ($parameter === 'thumbnails.mode') {
return Thumbnailer::MODE_COMMON; return Thumbnailer::MODE_COMMON;
@ -53,15 +46,7 @@ public function testValidControllerInvokeDefault(): void
// Save RainTPL assigned variables // Save RainTPL assigned variables
$assignedVariables = []; $assignedVariables = [];
$this->container->pageBuilder $this->assignTemplateVars($assignedVariables);
->expects(static::atLeastOnce())
->method('assign')
->willReturnCallback(function ($key, $value) use (&$assignedVariables) {
$assignedVariables[$key] = $value;
return $this;
})
;
// Links dataset: 2 links with thumbnails // Links dataset: 2 links with thumbnails
$this->container->bookmarkService $this->container->bookmarkService
@ -137,44 +122,4 @@ public function testControllerWithThumbnailsDisabled(): void
$this->controller->index($request, $response); $this->controller->index($request, $response);
} }
protected function createValidContainerMockSet(): void
{
$loginManager = $this->createMock(LoginManager::class);
$this->container->loginManager = $loginManager;
// Config
$conf = $this->createMock(ConfigManager::class);
$this->container->conf = $conf;
// PageBuilder
$pageBuilder = $this->createMock(PageBuilder::class);
$pageBuilder
->method('render')
->willReturnCallback(function (string $template): string {
return $template;
})
;
$this->container->pageBuilder = $pageBuilder;
// Plugin Manager
$pluginManager = $this->createMock(PluginManager::class);
$this->container->pluginManager = $pluginManager;
// BookmarkService
$bookmarkService = $this->createMock(BookmarkServiceInterface::class);
$this->container->bookmarkService = $bookmarkService;
// Formatter
$formatterFactory = $this->createMock(FormatterFactory::class);
$formatterFactory
->method('getFormatter')
->willReturnCallback(function (string $type): BookmarkFormatter {
if ($type === 'raw') {
return new BookmarkRawFormatter($this->container->conf, true);
}
})
;
$this->container->formatterFactory = $formatterFactory;
}
} }

View file

@ -6,11 +6,6 @@
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\BookmarkFilter; use Shaarli\Bookmark\BookmarkFilter;
use Shaarli\Bookmark\BookmarkServiceInterface;
use Shaarli\Container\ShaarliContainer;
use Shaarli\Plugin\PluginManager;
use Shaarli\Render\PageBuilder;
use Shaarli\Security\LoginManager;
/** /**
* Class ShaarliControllerTest * Class ShaarliControllerTest
@ -20,8 +15,7 @@
*/ */
class ShaarliControllerTest extends TestCase class ShaarliControllerTest extends TestCase
{ {
/** @var ShaarliContainer */ use FrontControllerMockHelper;
protected $container;
/** @var LoginController */ /** @var LoginController */
protected $controller; protected $controller;
@ -31,7 +25,8 @@ class ShaarliControllerTest extends TestCase
public function setUp(): void public function setUp(): void
{ {
$this->container = $this->createMock(ShaarliContainer::class); $this->createContainer();
$this->controller = new class($this->container) extends ShaarliController $this->controller = new class($this->container) extends ShaarliController
{ {
public function assignView(string $key, $value): ShaarliController public function assignView(string $key, $value): ShaarliController
@ -51,6 +46,8 @@ public function testAssignView(): void
{ {
$this->createValidContainerMockSet(); $this->createValidContainerMockSet();
$this->assignTemplateVars($this->assignedValues);
$self = $this->controller->assignView('variableName', 'variableValue'); $self = $this->controller->assignView('variableName', 'variableValue');
static::assertInstanceOf(ShaarliController::class, $self); static::assertInstanceOf(ShaarliController::class, $self);
@ -61,6 +58,24 @@ public function testRender(): void
{ {
$this->createValidContainerMockSet(); $this->createValidContainerMockSet();
$this->assignTemplateVars($this->assignedValues);
$this->container->bookmarkService
->method('count')
->willReturnCallback(function (string $visibility): int {
return $visibility === BookmarkFilter::$PRIVATE ? 5 : 10;
})
;
$this->container->pluginManager
->method('executeHooks')
->willReturnCallback(function (string $hook, array &$data, array $params): array {
return $data[$hook] = $params;
});
$this->container->pluginManager->method('getErrors')->willReturn(['error']);
$this->container->loginManager->method('isLoggedIn')->willReturn(true);
$render = $this->controller->render('templateName'); $render = $this->controller->render('templateName');
static::assertSame('templateName', $render); static::assertSame('templateName', $render);
@ -76,41 +91,4 @@ public function testRender(): void
static::assertSame('templateName', $this->assignedValues['plugins_footer']['render_footer']['target']); static::assertSame('templateName', $this->assignedValues['plugins_footer']['render_footer']['target']);
static::assertTrue($this->assignedValues['plugins_footer']['render_footer']['loggedin']); static::assertTrue($this->assignedValues['plugins_footer']['render_footer']['loggedin']);
} }
protected function createValidContainerMockSet(): void
{
$pageBuilder = $this->createMock(PageBuilder::class);
$pageBuilder
->method('assign')
->willReturnCallback(function (string $key, $value): void {
$this->assignedValues[$key] = $value;
});
$pageBuilder
->method('render')
->willReturnCallback(function (string $template): string {
return $template;
});
$this->container->pageBuilder = $pageBuilder;
$bookmarkService = $this->createMock(BookmarkServiceInterface::class);
$bookmarkService
->method('count')
->willReturnCallback(function (string $visibility): int {
return $visibility === BookmarkFilter::$PRIVATE ? 5 : 10;
});
$this->container->bookmarkService = $bookmarkService;
$pluginManager = $this->createMock(PluginManager::class);
$pluginManager
->method('executeHooks')
->willReturnCallback(function (string $hook, array &$data, array $params): array {
return $data[$hook] = $params;
});
$pluginManager->method('getErrors')->willReturn(['error']);
$this->container->pluginManager = $pluginManager;
$loginManager = $this->createMock(LoginManager::class);
$loginManager->method('isLoggedIn')->willReturn(true);
$this->container->loginManager = $loginManager;
}
} }

View file

@ -6,27 +6,20 @@
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\BookmarkFilter; use Shaarli\Bookmark\BookmarkFilter;
use Shaarli\Bookmark\BookmarkServiceInterface;
use Shaarli\Config\ConfigManager;
use Shaarli\Container\ShaarliContainer;
use Shaarli\Plugin\PluginManager;
use Shaarli\Render\PageBuilder;
use Shaarli\Security\LoginManager;
use Shaarli\Security\SessionManager;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
class TagCloudControllerTest extends TestCase class TagCloudControllerTest extends TestCase
{ {
/** @var ShaarliContainer */ use FrontControllerMockHelper;
protected $container;
/** @var TagCloudController */ /** @var TagCloudController */
protected $controller; protected $controller;
public function setUp(): void public function setUp(): void
{ {
$this->container = $this->createMock(ShaarliContainer::class); $this->createContainer();
$this->controller = new TagCloudController($this->container); $this->controller = new TagCloudController($this->container);
} }
@ -385,53 +378,4 @@ public function testEmptyList(): void
static::assertSame('', $assignedVariables['search_tags']); static::assertSame('', $assignedVariables['search_tags']);
static::assertCount(0, $assignedVariables['tags']); static::assertCount(0, $assignedVariables['tags']);
} }
protected function createValidContainerMockSet(): void
{
$loginManager = $this->createMock(LoginManager::class);
$this->container->loginManager = $loginManager;
$sessionManager = $this->createMock(SessionManager::class);
$this->container->sessionManager = $sessionManager;
// Config
$conf = $this->createMock(ConfigManager::class);
$this->container->conf = $conf;
$this->container->conf->method('get')->willReturnCallback(function (string $parameter, $default) {
return $default;
});
// PageBuilder
$pageBuilder = $this->createMock(PageBuilder::class);
$pageBuilder
->method('render')
->willReturnCallback(function (string $template): string {
return $template;
})
;
$this->container->pageBuilder = $pageBuilder;
// Plugin Manager
$pluginManager = $this->createMock(PluginManager::class);
$this->container->pluginManager = $pluginManager;
// BookmarkService
$bookmarkService = $this->createMock(BookmarkServiceInterface::class);
$this->container->bookmarkService = $bookmarkService;
}
protected function assignTemplateVars(array &$variables): void
{
$this->container->pageBuilder
->expects(static::atLeastOnce())
->method('assign')
->willReturnCallback(function ($key, $value) use (&$variables) {
$variables[$key] = $value;
return $this;
})
;
}
} }

View file

@ -5,32 +5,27 @@
namespace Shaarli\Front\Controller; namespace Shaarli\Front\Controller;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Shaarli\Bookmark\BookmarkServiceInterface;
use Shaarli\Config\ConfigManager;
use Shaarli\Container\ShaarliContainer;
use Shaarli\Plugin\PluginManager;
use Shaarli\Render\PageBuilder;
use Shaarli\Security\LoginManager;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
class TagControllerTest extends TestCase class TagControllerTest extends TestCase
{ {
/** @var ShaarliContainer */ use FrontControllerMockHelper;
protected $container;
/** @var TagController */ /** @var TagController */
protected $controller; protected $controller;
public function setUp(): void public function setUp(): void
{ {
$this->container = $this->createMock(ShaarliContainer::class); $this->createContainer();
$this->controller = new TagController($this->container); $this->controller = new TagController($this->container);
} }
public function testAddTagWithReferer(): void public function testAddTagWithReferer(): void
{ {
$this->createValidContainerMockSet(); $this->createValidContainerMockSet();
$this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/']; $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/'];
$request = $this->createMock(Request::class); $request = $this->createMock(Request::class);
@ -48,6 +43,7 @@ public function testAddTagWithReferer(): void
public function testAddTagWithRefererAndExistingSearch(): void public function testAddTagWithRefererAndExistingSearch(): void
{ {
$this->createValidContainerMockSet(); $this->createValidContainerMockSet();
$this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/?searchtags=def']; $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/?searchtags=def'];
$request = $this->createMock(Request::class); $request = $this->createMock(Request::class);
@ -81,6 +77,7 @@ public function testAddTagWithoutRefererAndExistingSearch(): void
public function testAddTagRemoveLegacyQueryParam(): void public function testAddTagRemoveLegacyQueryParam(): void
{ {
$this->createValidContainerMockSet(); $this->createValidContainerMockSet();
$this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/?searchtags=def&addtag=abc']; $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/?searchtags=def&addtag=abc'];
$request = $this->createMock(Request::class); $request = $this->createMock(Request::class);
@ -98,6 +95,7 @@ public function testAddTagRemoveLegacyQueryParam(): void
public function testAddTagResetPagination(): void public function testAddTagResetPagination(): void
{ {
$this->createValidContainerMockSet(); $this->createValidContainerMockSet();
$this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/?searchtags=def&page=12']; $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/?searchtags=def&page=12'];
$request = $this->createMock(Request::class); $request = $this->createMock(Request::class);
@ -115,6 +113,7 @@ public function testAddTagResetPagination(): void
public function testAddTagWithRefererAndEmptySearch(): void public function testAddTagWithRefererAndEmptySearch(): void
{ {
$this->createValidContainerMockSet(); $this->createValidContainerMockSet();
$this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/?searchtags=']; $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/?searchtags='];
$request = $this->createMock(Request::class); $request = $this->createMock(Request::class);
@ -132,6 +131,7 @@ public function testAddTagWithRefererAndEmptySearch(): void
public function testAddTagWithoutNewTagWithReferer(): void public function testAddTagWithoutNewTagWithReferer(): void
{ {
$this->createValidContainerMockSet(); $this->createValidContainerMockSet();
$this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/?searchtags=def']; $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/controller/?searchtags=def'];
$request = $this->createMock(Request::class); $request = $this->createMock(Request::class);
@ -157,35 +157,4 @@ public function testAddTagWithoutNewTagWithoutReferer(): void
static::assertSame(302, $result->getStatusCode()); static::assertSame(302, $result->getStatusCode());
static::assertSame(['./'], $result->getHeader('location')); static::assertSame(['./'], $result->getHeader('location'));
} }
protected function createValidContainerMockSet(): void
{
// User logged out
$loginManager = $this->createMock(LoginManager::class);
$loginManager->method('isLoggedIn')->willReturn(false);
$loginManager->method('canLogin')->willReturn(true);
$this->container->loginManager = $loginManager;
// Config
$conf = $this->createMock(ConfigManager::class);
$conf->method('get')->willReturnCallback(function (string $parameter, $default) {
return $default;
});
$this->container->conf = $conf;
// PageBuilder
$pageBuilder = $this->createMock(PageBuilder::class);
$pageBuilder
->method('render')
->willReturnCallback(function (string $template): string {
return $template;
})
;
$this->container->pageBuilder = $pageBuilder;
$pluginManager = $this->createMock(PluginManager::class);
$this->container->pluginManager = $pluginManager;
$bookmarkService = $this->createMock(BookmarkServiceInterface::class);
$this->container->bookmarkService = $bookmarkService;
}
} }