Execute common plugin hooks before rendering login page
This commit is contained in:
parent
9e4cc28e29
commit
0498b209b5
6 changed files with 168 additions and 3 deletions
|
@ -72,6 +72,10 @@ public function build(): ShaarliContainer
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$container['pluginManager'] = function (ShaarliContainer $container): PluginManager {
|
||||||
|
return new PluginManager($container->conf);
|
||||||
|
};
|
||||||
|
|
||||||
return $container;
|
return $container;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
use Shaarli\Bookmark\BookmarkServiceInterface;
|
use Shaarli\Bookmark\BookmarkServiceInterface;
|
||||||
use Shaarli\Config\ConfigManager;
|
use Shaarli\Config\ConfigManager;
|
||||||
use Shaarli\History;
|
use Shaarli\History;
|
||||||
|
use Shaarli\Plugin\PluginManager;
|
||||||
use Shaarli\Render\PageBuilder;
|
use Shaarli\Render\PageBuilder;
|
||||||
use Shaarli\Security\LoginManager;
|
use Shaarli\Security\LoginManager;
|
||||||
use Shaarli\Security\SessionManager;
|
use Shaarli\Security\SessionManager;
|
||||||
|
@ -21,6 +22,7 @@
|
||||||
* @property History $history
|
* @property History $history
|
||||||
* @property BookmarkServiceInterface $bookmarkService
|
* @property BookmarkServiceInterface $bookmarkService
|
||||||
* @property PageBuilder $pageBuilder
|
* @property PageBuilder $pageBuilder
|
||||||
|
* @property PluginManager $pluginManager
|
||||||
*/
|
*/
|
||||||
class ShaarliContainer extends Container
|
class ShaarliContainer extends Container
|
||||||
{
|
{
|
||||||
|
|
|
@ -41,6 +41,6 @@ public function index(Request $request, Response $response): Response
|
||||||
->assignView('pagetitle', t('Login') .' - '. $this->ci->conf->get('general.title', 'Shaarli'))
|
->assignView('pagetitle', t('Login') .' - '. $this->ci->conf->get('general.title', 'Shaarli'))
|
||||||
;
|
;
|
||||||
|
|
||||||
return $response->write($this->ci->pageBuilder->render('loginform'));
|
return $response->write($this->render('loginform'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
namespace Shaarli\Front\Controller;
|
namespace Shaarli\Front\Controller;
|
||||||
|
|
||||||
|
use Shaarli\Bookmark\BookmarkFilter;
|
||||||
use Shaarli\Container\ShaarliContainer;
|
use Shaarli\Container\ShaarliContainer;
|
||||||
|
|
||||||
abstract class ShaarliController
|
abstract class ShaarliController
|
||||||
|
@ -28,4 +29,41 @@ protected function assignView(string $name, $value): self
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function render(string $template): string
|
||||||
|
{
|
||||||
|
$this->assignView('linkcount', $this->ci->bookmarkService->count(BookmarkFilter::$ALL));
|
||||||
|
$this->assignView('privateLinkcount', $this->ci->bookmarkService->count(BookmarkFilter::$PRIVATE));
|
||||||
|
$this->assignView('plugin_errors', $this->ci->pluginManager->getErrors());
|
||||||
|
|
||||||
|
$this->executeDefaultHooks($template);
|
||||||
|
|
||||||
|
return $this->ci->pageBuilder->render($template);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call plugin hooks for header, footer and includes, specifying which page will be rendered.
|
||||||
|
* Then assign generated data to RainTPL.
|
||||||
|
*/
|
||||||
|
protected function executeDefaultHooks(string $template): void
|
||||||
|
{
|
||||||
|
$common_hooks = [
|
||||||
|
'includes',
|
||||||
|
'header',
|
||||||
|
'footer',
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($common_hooks as $name) {
|
||||||
|
$plugin_data = [];
|
||||||
|
$this->ci->pluginManager->executeHooks(
|
||||||
|
'render_' . $name,
|
||||||
|
$plugin_data,
|
||||||
|
[
|
||||||
|
'target' => $template,
|
||||||
|
'loggedin' => $this->ci->loginManager->isLoggedIn()
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$this->assignView('plugins_' . $name, $plugin_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,11 @@
|
||||||
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\Container\ShaarliContainer;
|
||||||
use Shaarli\Front\Exception\LoginBannedException;
|
use Shaarli\Front\Exception\LoginBannedException;
|
||||||
|
use Shaarli\Plugin\PluginManager;
|
||||||
use Shaarli\Render\PageBuilder;
|
use Shaarli\Render\PageBuilder;
|
||||||
use Shaarli\Security\LoginManager;
|
use Shaarli\Security\LoginManager;
|
||||||
use Slim\Http\Request;
|
use Slim\Http\Request;
|
||||||
|
@ -37,7 +39,6 @@ public function testValidControllerInvoke(): void
|
||||||
|
|
||||||
$assignedVariables = [];
|
$assignedVariables = [];
|
||||||
$this->container->pageBuilder
|
$this->container->pageBuilder
|
||||||
->expects(static::exactly(3))
|
|
||||||
->method('assign')
|
->method('assign')
|
||||||
->willReturnCallback(function ($key, $value) use (&$assignedVariables) {
|
->willReturnCallback(function ($key, $value) use (&$assignedVariables) {
|
||||||
$assignedVariables[$key] = $value;
|
$assignedVariables[$key] = $value;
|
||||||
|
@ -68,7 +69,6 @@ public function testValidControllerInvokeWithUserName(): void
|
||||||
|
|
||||||
$assignedVariables = [];
|
$assignedVariables = [];
|
||||||
$this->container->pageBuilder
|
$this->container->pageBuilder
|
||||||
->expects(static::exactly(4))
|
|
||||||
->method('assign')
|
->method('assign')
|
||||||
->willReturnCallback(function ($key, $value) use (&$assignedVariables) {
|
->willReturnCallback(function ($key, $value) use (&$assignedVariables) {
|
||||||
$assignedVariables[$key] = $value;
|
$assignedVariables[$key] = $value;
|
||||||
|
@ -169,5 +169,10 @@ protected function createValidContainerMockSet(): void
|
||||||
})
|
})
|
||||||
;
|
;
|
||||||
$this->container->pageBuilder = $pageBuilder;
|
$this->container->pageBuilder = $pageBuilder;
|
||||||
|
|
||||||
|
$pluginManager = $this->createMock(PluginManager::class);
|
||||||
|
$this->container->pluginManager = $pluginManager;
|
||||||
|
$bookmarkService = $this->createMock(BookmarkServiceInterface::class);
|
||||||
|
$this->container->bookmarkService = $bookmarkService;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
116
tests/front/controller/ShaarliControllerTest.php
Normal file
116
tests/front/controller/ShaarliControllerTest.php
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Shaarli\Front\Controller;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
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
|
||||||
|
*
|
||||||
|
* This class is used to test default behavior of ShaarliController abstract class.
|
||||||
|
* It uses a dummy non abstract controller.
|
||||||
|
*/
|
||||||
|
class ShaarliControllerTest extends TestCase
|
||||||
|
{
|
||||||
|
/** @var ShaarliContainer */
|
||||||
|
protected $container;
|
||||||
|
|
||||||
|
/** @var LoginController */
|
||||||
|
protected $controller;
|
||||||
|
|
||||||
|
/** @var mixed[] List of variable assigned to the template */
|
||||||
|
protected $assignedValues;
|
||||||
|
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
$this->container = $this->createMock(ShaarliContainer::class);
|
||||||
|
$this->controller = new class($this->container) extends ShaarliController
|
||||||
|
{
|
||||||
|
public function assignView(string $key, $value): ShaarliController
|
||||||
|
{
|
||||||
|
return parent::assignView($key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render(string $template): string
|
||||||
|
{
|
||||||
|
return parent::render($template);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
$this->assignedValues = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAssignView(): void
|
||||||
|
{
|
||||||
|
$this->createValidContainerMockSet();
|
||||||
|
|
||||||
|
$self = $this->controller->assignView('variableName', 'variableValue');
|
||||||
|
|
||||||
|
static::assertInstanceOf(ShaarliController::class, $self);
|
||||||
|
static::assertSame('variableValue', $this->assignedValues['variableName']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRender(): void
|
||||||
|
{
|
||||||
|
$this->createValidContainerMockSet();
|
||||||
|
|
||||||
|
$render = $this->controller->render('templateName');
|
||||||
|
|
||||||
|
static::assertSame('templateName', $render);
|
||||||
|
|
||||||
|
static::assertSame(10, $this->assignedValues['linkcount']);
|
||||||
|
static::assertSame(5, $this->assignedValues['privateLinkcount']);
|
||||||
|
static::assertSame(['error'], $this->assignedValues['plugin_errors']);
|
||||||
|
|
||||||
|
static::assertSame('templateName', $this->assignedValues['plugins_includes']['render_includes']['target']);
|
||||||
|
static::assertTrue($this->assignedValues['plugins_includes']['render_includes']['loggedin']);
|
||||||
|
static::assertSame('templateName', $this->assignedValues['plugins_header']['render_header']['target']);
|
||||||
|
static::assertTrue($this->assignedValues['plugins_header']['render_header']['loggedin']);
|
||||||
|
static::assertSame('templateName', $this->assignedValues['plugins_footer']['render_footer']['target']);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue