Julien Fastré 9244bb2f8d fix pagination problems
(cherry picked from commit 43702ded77449ee08b8d2c5c494c220d457373a1)
2021-12-03 14:10:07 +00:00

245 lines
5.9 KiB
PHP

<?php
/**
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Chill\MainBundle\Tests\Pagination;
use Chill\MainBundle\Pagination\Paginator;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use function count;
/**
* Test the paginator class.
*
* @internal
* @coversNothing
*/
final class PaginatorTest extends KernelTestCase
{
protected $paginator;
protected $prophet;
public function setUp()
{
$this->prophet = new \Prophecy\Prophet();
}
/**
* generate an array with a set of page with :
* - total items ;
* - item per page ;
* - current page number ;
* - expected hasNextPage result.
*
* @return array
*/
public function generateHasNextPage()
{
return [
[10, 10, 1, false],
[20, 10, 1, true],
[12, 10, 1, true],
[12, 10, 2, false],
];
}
public function generateHasPage()
{
return [
[10, 10, -1, false],
[12, 10, 1, true],
[12, 10, 2, true],
[12, 10, 3, false],
];
}
/**
* generate an array with a set of page with :
* - total items ;
* - item per page ;
* - current page number ;
* - expected hasPreviousPage result.
*
* @return array
*/
public function generateHasPreviousPage()
{
return [
[10, 10, 1, false],
[20, 10, 1, false],
[12, 10, 1, false],
[12, 10, 2, true],
];
}
/**
* generate a set of pages with different maxItem, itemPerPage, and
* expected page number.
*
* @return array
*/
public function generatePageNumber()
{
return [
[12, 10, 2],
[20, 10, 2],
[21, 10, 3],
[19, 10, 2],
[1, 10, 1],
[0, 10, 1],
[10, 10, 1],
];
}
public function testGetPage()
{
$paginator = $this->generatePaginator(105, 10);
$this->assertEquals(5, $paginator->getPage(5)->getNumber());
}
/**
* @param int $totalItems
* @param int $itemPerPage
* @param int $currentPage
* @param bool $expectedHasNextPage
* @dataProvider generateHasNextPage
*/
public function testHasNextPage(
$totalItems,
$itemPerPage,
$currentPage,
$expectedHasNextPage
) {
$paginator = $this->generatePaginator($totalItems, $itemPerPage, $currentPage);
$this->assertEquals($expectedHasNextPage, $paginator->hasNextPage());
}
/**
* test the HasPage function.
*
* @param int $totalItems
* @param int $itemPerpage
* @param int $pageNumber
* @param bool $expectedHasPage
* @dataProvider generateHasPage
*/
public function testHasPage(
$totalItems,
$itemPerpage,
$pageNumber,
$expectedHasPage
) {
$paginator = $this->generatePaginator($totalItems, $itemPerpage);
$this->assertEquals($expectedHasPage, $paginator->hasPage($pageNumber));
}
/**
* @param int $totalItems
* @param int $itemPerPage
* @param int $currentPage
* @param mixed $expectedHasNextPage
* @dataProvider generateHasPreviousPage
*/
public function testHasPreviousPage(
$totalItems,
$itemPerPage,
$currentPage,
$expectedHasNextPage
) {
$paginator = $this->generatePaginator($totalItems, $itemPerPage, $currentPage);
$this->assertEquals($expectedHasNextPage, $paginator->hasPreviousPage());
}
/**
* Test that the countPages method (and his alias `count`) return
* valid results.
*
* @param int $totalItems
* @param int $itemPerPage
* @param int $expectedPageNumber
* @dataProvider generatePageNumber
*/
public function testPageNumber($totalItems, $itemPerPage, $expectedPageNumber)
{
$paginator = $this->generatePaginator($totalItems, $itemPerPage);
$this->assertEquals($expectedPageNumber, $paginator->countPages());
$this->assertEquals($expectedPageNumber, count($paginator));
}
public function testPagesGenerator()
{
$paginator = $this->generatePaginator(105, 10);
$generator = $paginator->getPagesGenerator();
$i = 1;
foreach ($generator as $page) {
$this->assertEquals(
$i,
$page->getNumber(),
"assert that the current page number is {$i}"
);
++$i;
}
$this->assertEquals(
11,
$page->getNumber(),
'assert that the last page number is 11'
);
}
public function testPagesWithoutResult()
{
$paginator = $this->generatePaginator(0, 10);
$this->assertEquals(0, $paginator->getCurrentPageFirstItemNumber());
$this->assertEquals(10, $paginator->getItemsPerPage());
}
/**
* @param int $itemPerPage
* @param string $route
* @param mixed $totalItems
* @param mixed $currentPageNumber
*
* @return Paginator
*/
protected function generatePaginator(
$totalItems,
$itemPerPage,
$currentPageNumber = 1,
$route = '',
array $routeParameters = []
) {
$urlGenerator = $this->prophet->prophesize();
$urlGenerator->willImplement(UrlGeneratorInterface::class);
return new Paginator(
$totalItems,
$itemPerPage,
$currentPageNumber,
$route,
$routeParameters,
$urlGenerator->reveal(),
'page',
'item_per_page'
);
}
}