Fix: visitor are allowed to chose nb of links per page

This commit is contained in:
ArthurHoaro 2020-07-24 12:48:53 +02:00
parent 87ae3c4f08
commit 204035bd3c
4 changed files with 106 additions and 66 deletions

View file

@ -12,28 +12,10 @@
/** /**
* Class SessionFilterController * Class SessionFilterController
* *
* Slim controller used to handle filters stored in the user session, such as visibility, links per page, etc. * Slim controller used to handle filters stored in the user session, such as visibility, etc.
*/ */
class SessionFilterController extends ShaarliAdminController class SessionFilterController extends ShaarliAdminController
{ {
/**
* GET /links-per-page: set the number of bookmarks to display per page in homepage
*/
public function linksPerPage(Request $request, Response $response): Response
{
$linksPerPage = $request->getParam('nb') ?? null;
if (null === $linksPerPage || false === is_numeric($linksPerPage)) {
$linksPerPage = $this->container->conf->get('general.links_per_page', 20);
}
$this->container->sessionManager->setSessionParameter(
SessionManager::KEY_LINKS_PER_PAGE,
abs(intval($linksPerPage))
);
return $this->redirectFromReferer($request, $response, ['linksperpage'], ['nb']);
}
/** /**
* GET /visibility: allows to display only public or only private bookmarks in linklist * GET /visibility: allows to display only public or only private bookmarks in linklist
*/ */

View file

@ -0,0 +1,33 @@
<?php
declare(strict_types=1);
namespace Shaarli\Front\Controller\Visitor;
use Shaarli\Security\SessionManager;
use Slim\Http\Request;
use Slim\Http\Response;
/**
* Slim controller used to handle filters stored in the visitor session, links per page, etc.
*/
class PublicSessionFilterController extends ShaarliVisitorController
{
/**
* GET /links-per-page: set the number of bookmarks to display per page in homepage
*/
public function linksPerPage(Request $request, Response $response): Response
{
$linksPerPage = $request->getParam('nb') ?? null;
if (null === $linksPerPage || false === is_numeric($linksPerPage)) {
$linksPerPage = $this->container->conf->get('general.links_per_page', 20);
}
$this->container->sessionManager->setSessionParameter(
SessionManager::KEY_LINKS_PER_PAGE,
abs(intval($linksPerPage))
);
return $this->redirectFromReferer($request, $response, ['linksperpage'], ['nb']);
}
}

View file

@ -24,52 +24,6 @@ public function setUp(): void
$this->controller = new SessionFilterController($this->container); $this->controller = new SessionFilterController($this->container);
} }
/**
* Link per page - Default call with valid parameter and a referer.
*/
public function testLinksPerPage(): void
{
$this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc'];
$request = $this->createMock(Request::class);
$request->method('getParam')->with('nb')->willReturn('8');
$response = new Response();
$this->container->sessionManager
->expects(static::once())
->method('setSessionParameter')
->with(SessionManager::KEY_LINKS_PER_PAGE, 8)
;
$result = $this->controller->linksPerPage($request, $response);
static::assertInstanceOf(Response::class, $result);
static::assertSame(302, $result->getStatusCode());
static::assertSame(['/subfolder/controller/?searchtag=abc'], $result->getHeader('location'));
}
/**
* Link per page - Invalid value, should use default value (20)
*/
public function testLinksPerPageNotValid(): void
{
$request = $this->createMock(Request::class);
$request->method('getParam')->with('nb')->willReturn('test');
$response = new Response();
$this->container->sessionManager
->expects(static::once())
->method('setSessionParameter')
->with(SessionManager::KEY_LINKS_PER_PAGE, 20)
;
$result = $this->controller->linksPerPage($request, $response);
static::assertInstanceOf(Response::class, $result);
static::assertSame(302, $result->getStatusCode());
static::assertSame(['/subfolder/'], $result->getHeader('location'));
}
/** /**
* Visibility - Default call for private filter while logged in without current value * Visibility - Default call for private filter while logged in without current value
*/ */

View file

@ -0,0 +1,71 @@
<?php
declare(strict_types=1);
namespace Shaarli\Front\Controller\Visitor;
use PHPUnit\Framework\TestCase;
use Shaarli\Security\SessionManager;
use Slim\Http\Request;
use Slim\Http\Response;
class PublicSessionFilterControllerTest extends TestCase
{
use FrontControllerMockHelper;
/** @var PublicSessionFilterController */
protected $controller;
public function setUp(): void
{
$this->createContainer();
$this->controller = new PublicSessionFilterController($this->container);
}
/**
* Link per page - Default call with valid parameter and a referer.
*/
public function testLinksPerPage(): void
{
$this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc'];
$request = $this->createMock(Request::class);
$request->method('getParam')->with('nb')->willReturn('8');
$response = new Response();
$this->container->sessionManager
->expects(static::once())
->method('setSessionParameter')
->with(SessionManager::KEY_LINKS_PER_PAGE, 8)
;
$result = $this->controller->linksPerPage($request, $response);
static::assertInstanceOf(Response::class, $result);
static::assertSame(302, $result->getStatusCode());
static::assertSame(['/subfolder/controller/?searchtag=abc'], $result->getHeader('location'));
}
/**
* Link per page - Invalid value, should use default value (20)
*/
public function testLinksPerPageNotValid(): void
{
$request = $this->createMock(Request::class);
$request->method('getParam')->with('nb')->willReturn('test');
$response = new Response();
$this->container->sessionManager
->expects(static::once())
->method('setSessionParameter')
->with(SessionManager::KEY_LINKS_PER_PAGE, 20)
;
$result = $this->controller->linksPerPage($request, $response);
static::assertInstanceOf(Response::class, $result);
static::assertSame(302, $result->getStatusCode());
static::assertSame(['/subfolder/'], $result->getHeader('location'));
}
}