diff --git a/CHANGELOG.md b/CHANGELOG.md index 4557ca9..1234b93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.5.3 + +* test: add tests for zero proximity pager, empty pager, and test current count for all + pagers +* fix(`OffsetPage`): fix `OutOfBoundsException` on an empty first page. + ## 0.5.2 * refactor: `PagerItemInterface` methods now returns itself, instead of diff --git a/packages/rekapager-offset-pagination/src/Internal/OffsetPage.php b/packages/rekapager-offset-pagination/src/Internal/OffsetPage.php index 1d2f580..2c0f0ed 100644 --- a/packages/rekapager-offset-pagination/src/Internal/OffsetPage.php +++ b/packages/rekapager-offset-pagination/src/Internal/OffsetPage.php @@ -73,7 +73,7 @@ public function getPageable(): PageableInterface private function getResult(): array { if ($this->result !== null) { - if (\count($this->result) === 0) { + if (\count($this->result) === 0 && $this->pageNumber !== 1) { throw new OutOfBoundsException('The page does not exist.'); } diff --git a/tests/src/IntegrationTests/Pager/CountAwareKeysetPagerTest.php b/tests/src/IntegrationTests/Pager/CountAwareKeysetPagerTest.php index d214657..1ca2371 100644 --- a/tests/src/IntegrationTests/Pager/CountAwareKeysetPagerTest.php +++ b/tests/src/IntegrationTests/Pager/CountAwareKeysetPagerTest.php @@ -46,6 +46,7 @@ public function testLastPage(string $pageableGeneratorClass): void currentPageNumber: 21, previousPageNumbers: [17, 18, 19, 20], nextPageNumbers: [], + currentCount: 3, ); } } diff --git a/tests/src/IntegrationTests/Pager/EmptyPagerTest.php b/tests/src/IntegrationTests/Pager/EmptyPagerTest.php new file mode 100644 index 0000000..495e032 --- /dev/null +++ b/tests/src/IntegrationTests/Pager/EmptyPagerTest.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +namespace Rekalogika\Rekapager\Tests\IntegrationTests\Pager; + +use PHPUnit\Framework\Attributes\DataProviderExternal; +use Rekalogika\Rekapager\Tests\IntegrationTests\DataProvider\PageableGeneratorProvider; + +class EmptyPagerTest extends PagerTestCase +{ + protected function getSetName(): string + { + return 'empty'; + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'all')] + public function testFirstPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $pager = $this->createPagerFromPageable($pageable); + + $this->assertPager( + $pager, + proximity: 2, + hasPrevious: false, + hasNext: false, + hasFirst: false, + hasLast: false, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: null, + currentPageNumber: 1, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 0, + ); + } +} diff --git a/tests/src/IntegrationTests/Pager/EmptyZeroProximityPagerTest.php b/tests/src/IntegrationTests/Pager/EmptyZeroProximityPagerTest.php new file mode 100644 index 0000000..3595746 --- /dev/null +++ b/tests/src/IntegrationTests/Pager/EmptyZeroProximityPagerTest.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +namespace Rekalogika\Rekapager\Tests\IntegrationTests\Pager; + +use PHPUnit\Framework\Attributes\DataProviderExternal; +use Rekalogika\Rekapager\Tests\IntegrationTests\DataProvider\PageableGeneratorProvider; + +class EmptyZeroProximityPagerTest extends PagerTestCase +{ + protected function getSetName(): string + { + return 'empty'; + } + + protected function getProximity(): int + { + return 0; + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'all')] + public function testFirstPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $pager = $this->createPagerFromPageable($pageable); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: false, + hasNext: false, + hasFirst: false, + hasLast: false, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: null, + currentPageNumber: 1, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 0, + ); + } +} diff --git a/tests/src/IntegrationTests/Pager/KeysetPagerTest.php b/tests/src/IntegrationTests/Pager/KeysetPagerTest.php index dbdf2b4..dec2dcb 100644 --- a/tests/src/IntegrationTests/Pager/KeysetPagerTest.php +++ b/tests/src/IntegrationTests/Pager/KeysetPagerTest.php @@ -40,6 +40,7 @@ public function testFirstPage(string $pageableGeneratorClass): void currentPageNumber: 1, previousPageNumbers: [], nextPageNumbers: [2, 3, 4, 5], + currentCount: 5, ); } @@ -66,6 +67,7 @@ public function testSecondPage(string $pageableGeneratorClass): void currentPageNumber: 2, previousPageNumbers: [], nextPageNumbers: [3, 4, 5], + currentCount: 5, ); } @@ -92,6 +94,7 @@ public function testThirdPage(string $pageableGeneratorClass): void currentPageNumber: 3, previousPageNumbers: [2], nextPageNumbers: [4, 5], + currentCount: 5, ); } @@ -118,6 +121,7 @@ public function testFourthPage(string $pageableGeneratorClass): void currentPageNumber: 4, previousPageNumbers: [2, 3], nextPageNumbers: [5, 6], + currentCount: 5, ); } @@ -144,6 +148,7 @@ public function testFifthPage(string $pageableGeneratorClass): void currentPageNumber: 5, previousPageNumbers: [2, 3, 4], nextPageNumbers: [6, 7], + currentCount: 5, ); } @@ -170,6 +175,7 @@ public function testSixthPage(string $pageableGeneratorClass): void currentPageNumber: 6, previousPageNumbers: [4, 5], nextPageNumbers: [7, 8], + currentCount: 5, ); } @@ -196,6 +202,7 @@ public function testLastPage(string $pageableGeneratorClass): void currentPageNumber: -1, previousPageNumbers: [-5, -4, -3, -2], nextPageNumbers: [], + currentCount: 5, ); } @@ -222,6 +229,7 @@ public function testSecondLastPage(string $pageableGeneratorClass): void currentPageNumber: -2, previousPageNumbers: [-5, -4, -3,], nextPageNumbers: [], + currentCount: 5, ); } @@ -248,6 +256,7 @@ public function testThirdLastPage(string $pageableGeneratorClass): void currentPageNumber: -3, previousPageNumbers: [-5, -4], nextPageNumbers: [-2], + currentCount: 5, ); } @@ -274,6 +283,7 @@ public function testFourthLastPage(string $pageableGeneratorClass): void currentPageNumber: -4, previousPageNumbers: [-6, -5], nextPageNumbers: [-3, -2], + currentCount: 5, ); } @@ -300,6 +310,7 @@ public function testFifthLastPage(string $pageableGeneratorClass): void currentPageNumber: -5, previousPageNumbers: [-7, -6], nextPageNumbers: [-4, -3, -2], + currentCount: 5, ); } @@ -326,6 +337,7 @@ public function testSixthLastPage(string $pageableGeneratorClass): void currentPageNumber: -6, previousPageNumbers: [-8, -7], nextPageNumbers: [-5, -4], + currentCount: 5, ); } } diff --git a/tests/src/IntegrationTests/Pager/KeysetZeroProximityPagerTest.php b/tests/src/IntegrationTests/Pager/KeysetZeroProximityPagerTest.php new file mode 100644 index 0000000..c9f2376 --- /dev/null +++ b/tests/src/IntegrationTests/Pager/KeysetZeroProximityPagerTest.php @@ -0,0 +1,186 @@ + + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +namespace Rekalogika\Rekapager\Tests\IntegrationTests\Pager; + +use PHPUnit\Framework\Attributes\DataProviderExternal; +use Rekalogika\Rekapager\Tests\IntegrationTests\DataProvider\PageableGeneratorProvider; + +class KeysetZeroProximityPagerTest extends PagerTestCase +{ + protected function getProximity(): int + { + return 0; + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'keyset')] + public function testFirstPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $pager = $this->createPagerFromPageable($pageable); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: false, + hasNext: true, + hasFirst: false, + hasLast: true, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: -1, + currentPageNumber: 1, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 5, + ); + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'keyset')] + public function testSecondPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $page = $this->getNthPageFromBeginning($pageable, 2); + $pager = $this->createPagerFromPage($page); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: true, + hasNext: true, + hasFirst: true, + hasLast: true, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: -1, + currentPageNumber: 2, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 5, + ); + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'keyset')] + public function testThirdPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $page = $this->getNthPageFromBeginning($pageable, 3); + $pager = $this->createPagerFromPage($page); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: true, + hasNext: true, + hasFirst: true, + hasLast: true, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: -1, + currentPageNumber: 3, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 5, + ); + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'keyset')] + public function testLastPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $page = $this->getNthPageFromEnd($pageable, 1); + $pager = $this->createPagerFromPage($page); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: true, + hasNext: false, + hasFirst: true, + hasLast: false, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: null, + currentPageNumber: -1, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 5, + ); + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'keyset')] + public function testSecondLastPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $page = $this->getNthPageFromEnd($pageable, 2); + $pager = $this->createPagerFromPage($page); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: true, + hasNext: true, + hasFirst: true, + hasLast: true, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: -1, + currentPageNumber: -2, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 5, + ); + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'keyset')] + public function testThirdLastPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $page = $this->getNthPageFromEnd($pageable, 3); + $pager = $this->createPagerFromPage($page); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: true, + hasNext: true, + hasFirst: true, + hasLast: true, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: -1, + currentPageNumber: -3, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 5, + ); + } +} diff --git a/tests/src/IntegrationTests/Pager/OffsetPagerTest.php b/tests/src/IntegrationTests/Pager/OffsetPagerTest.php index c31a4de..5ee9c29 100644 --- a/tests/src/IntegrationTests/Pager/OffsetPagerTest.php +++ b/tests/src/IntegrationTests/Pager/OffsetPagerTest.php @@ -40,6 +40,7 @@ public function testFirstPage(string $pageableGeneratorClass): void currentPageNumber: 1, previousPageNumbers: [], nextPageNumbers: [2, 3, 4, 5], + currentCount: 5, ); } @@ -66,6 +67,7 @@ public function testSecondPage(string $pageableGeneratorClass): void currentPageNumber: 2, previousPageNumbers: [], nextPageNumbers: [3, 4, 5], + currentCount: 5, ); } @@ -92,6 +94,7 @@ public function testThirdPage(string $pageableGeneratorClass): void currentPageNumber: 3, previousPageNumbers: [2], nextPageNumbers: [4, 5], + currentCount: 5, ); } @@ -118,6 +121,7 @@ public function testFourthPage(string $pageableGeneratorClass): void currentPageNumber: 4, previousPageNumbers: [2, 3], nextPageNumbers: [5, 6], + currentCount: 5, ); } @@ -144,6 +148,7 @@ public function testFifthPage(string $pageableGeneratorClass): void currentPageNumber: 5, previousPageNumbers: [2, 3, 4], nextPageNumbers: [6, 7], + currentCount: 5, ); } @@ -170,6 +175,7 @@ public function testSixthPage(string $pageableGeneratorClass): void currentPageNumber: 6, previousPageNumbers: [4, 5], nextPageNumbers: [7, 8], + currentCount: 5, ); } @@ -196,6 +202,7 @@ public function testLastPage(string $pageableGeneratorClass): void currentPageNumber: 21, previousPageNumbers: [17, 18, 19, 20], nextPageNumbers: [], + currentCount: 3, ); } @@ -222,6 +229,7 @@ public function testSecondLastPage(string $pageableGeneratorClass): void currentPageNumber: 20, previousPageNumbers: [17, 18, 19], nextPageNumbers: [21], + currentCount: 5, ); } @@ -248,6 +256,7 @@ public function testThirdLastPage(string $pageableGeneratorClass): void currentPageNumber: 19, previousPageNumbers: [17, 18], nextPageNumbers: [20, 21], + currentCount: 5, ); } @@ -274,6 +283,7 @@ public function testFourthLastPage(string $pageableGeneratorClass): void currentPageNumber: 18, previousPageNumbers: [16, 17], nextPageNumbers: [19, 20], + currentCount: 5, ); } @@ -300,6 +310,7 @@ public function testFifthLastPage(string $pageableGeneratorClass): void currentPageNumber: 17, previousPageNumbers: [15, 16], nextPageNumbers: [18, 19], + currentCount: 5, ); } } diff --git a/tests/src/IntegrationTests/Pager/OffsetZeroProximityPagerTest.php b/tests/src/IntegrationTests/Pager/OffsetZeroProximityPagerTest.php new file mode 100644 index 0000000..690ff55 --- /dev/null +++ b/tests/src/IntegrationTests/Pager/OffsetZeroProximityPagerTest.php @@ -0,0 +1,186 @@ + + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +namespace Rekalogika\Rekapager\Tests\IntegrationTests\Pager; + +use PHPUnit\Framework\Attributes\DataProviderExternal; +use Rekalogika\Rekapager\Tests\IntegrationTests\DataProvider\PageableGeneratorProvider; + +class OffsetZeroProximityPagerTest extends PagerTestCase +{ + protected function getProximity(): int + { + return 0; + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'offset')] + public function testFirstPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $pager = $this->createPagerFromPageable($pageable); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: false, + hasNext: true, + hasFirst: false, + hasLast: false, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: null, + currentPageNumber: 1, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 5, + ); + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'offset')] + public function testSecondPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $page = $this->getNthPageFromBeginning($pageable, 2); + $pager = $this->createPagerFromPage($page); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: true, + hasNext: true, + hasFirst: true, + hasLast: false, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: null, + currentPageNumber: 2, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 5, + ); + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'offset')] + public function testThirdPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $page = $this->getNthPageFromBeginning($pageable, 3); + $pager = $this->createPagerFromPage($page); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: true, + hasNext: true, + hasFirst: true, + hasLast: false, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: null, + currentPageNumber: 3, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 5, + ); + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'offset')] + public function testLastPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $page = $this->getNthPageFromEndByIteration($pageable, 1); + $pager = $this->createPagerFromPage($page); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: true, + hasNext: false, + hasFirst: true, + hasLast: false, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: null, + currentPageNumber: 21, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 3, + ); + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'offset')] + public function testSecondLastPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $page = $this->getNthPageFromEndByIteration($pageable, 2); + $pager = $this->createPagerFromPage($page); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: true, + hasNext: true, + hasFirst: true, + hasLast: false, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: null, + currentPageNumber: 20, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 5, + ); + } + + #[DataProviderExternal(PageableGeneratorProvider::class, 'offset')] + public function testThirdLastPage(string $pageableGeneratorClass): void + { + $pageable = $this->createPageableFromGenerator($pageableGeneratorClass); + $page = $this->getNthPageFromEndByIteration($pageable, 3); + $pager = $this->createPagerFromPage($page); + + $this->assertPager( + $pager, + proximity: 0, + hasPrevious: true, + hasNext: true, + hasFirst: true, + hasLast: false, + hasGapToFirstPage: false, + hasGapToLastPage: false, + numOfPreviousNeighboringPages: 0, + numOfNextNeighboringPages: 0, + firstPageNumber: null, + lastPageNumber: null, + currentPageNumber: 19, + previousPageNumbers: [], + nextPageNumbers: [], + currentCount: 5, + ); + } +} diff --git a/tests/src/IntegrationTests/Pager/PagerTestCase.php b/tests/src/IntegrationTests/Pager/PagerTestCase.php index 20f79ae..dcde6af 100644 --- a/tests/src/IntegrationTests/Pager/PagerTestCase.php +++ b/tests/src/IntegrationTests/Pager/PagerTestCase.php @@ -115,6 +115,7 @@ protected function assertPager( array $previousPageNumbers, ?int $currentPageNumber, array $nextPageNumbers, + int $currentCount, ): void { static::assertEquals($proximity, $pager->getProximity()); static::assertEquals($hasPrevious, $pager->getPreviousPage() !== null); @@ -153,6 +154,8 @@ protected function assertPager( ); static::assertEquals($nextPageNumbers, $numbers); + + static::assertEquals($currentCount, $pager->getCurrentPage()->count()); } /**