Fix a bug in the paginator where in 10/20 page links the number

of pages becomes less than 10/20.
Add lots of Paginator tests to check this.
This commit is contained in:
Colin Kuskie 2009-02-26 18:01:57 +00:00
parent a8979545ef
commit 91ecdda498
3 changed files with 145 additions and 7 deletions

View file

@ -2,6 +2,7 @@
- fixed: IE6 shows Admin Bar over Asset Manager - fixed: IE6 shows Admin Bar over Asset Manager
- fixed #9808: Search i18n - fixed #9808: Search i18n
- fixed #9818: deleteAttachedFiles bug (THE REVENGE) - fixed #9818: deleteAttachedFiles bug (THE REVENGE)
- fixed #9809: Pagination list up to 10/20: not working correctly on last pages.
7.6.13 7.6.13
- fixed AdSpace bug: impressions and clicks for most non-human web clients will not be counted. - fixed AdSpace bug: impressions and clicks for most non-human web clients will not be counted.

View file

@ -504,6 +504,10 @@ sub getPageLinks {
my $start = ($minPage > 0) ? $minPage : 1; my $start = ($minPage > 0) ? $minPage : 1;
my $maxPage = $start + $limit - 1; my $maxPage = $start + $limit - 1;
my $end = ($maxPage < $self->getPageNumber) ? $self->getPageNumber : $maxPage; my $end = ($maxPage < $self->getPageNumber) ? $self->getPageNumber : $maxPage;
if ($maxPage > $self->getNumberOfPages) {
$end = $self->getNumberOfPages;
$start = $self->getNumberOfPages - $limit + 1;
}
my @temp; my @temp;
foreach my $page (@pages) { foreach my $page (@pages) {
if ($i <= $end && $i >= $start) { if ($i <= $end && $i >= $start) {
@ -754,5 +758,24 @@ sub setAlphabeticalKey {
return 1; return 1;
} }
#-------------------------------------------------------------------
=head2 setPageNumber ( pageNumber )
Sets the page number. This is really a convenience method for testing.
Returns the page number that was set.
=head3 pageNumber
Sets the pageNumber. Setting the pageNumber outside of the set of
pages would cause the Paginator to behave poorly.
=cut
sub setPageNumber {
my $self = shift;
$self->{_pn} = shift;
}
1; 1;

View file

@ -20,15 +20,17 @@ use WebGUI::Paginator;
use Test::More; # increment this value for each test you create use Test::More; # increment this value for each test you create
use Test::Deep; use Test::Deep;
use POSIX qw(ceil); use POSIX qw(ceil);
use Storable qw/dclone/;
use Data::Dumper;
my $session = WebGUI::Test->session; my $session = WebGUI::Test->session;
plan tests => 26; # increment this value for each test you create
my $startingRowNum = 0; my $startingRowNum = 0;
my $endingRowNum = 99; my $endingRowNum = 99;
my @paginatingData = ($startingRowNum..$endingRowNum); my @paginatingData = ($startingRowNum..$endingRowNum);
plan tests => 15; # increment this value for each test you create
my $rowCount = $endingRowNum - $startingRowNum + 1; my $rowCount = $endingRowNum - $startingRowNum + 1;
my $NumberOfPages = ceil($rowCount/25); ##Default page size=25 my $NumberOfPages = ceil($rowCount/25); ##Default page size=25
my $url = "/home"; my $url = "/home";
@ -47,7 +49,26 @@ cmp_bag([0..24], $p->getPageData(1), 'page 1 data correct');
cmp_bag([25..49], $p->getPageData(2), 'page 2 data correct'); cmp_bag([25..49], $p->getPageData(2), 'page 2 data correct');
cmp_bag([ ], $p->getPageData(5), 'page 5 data correct'); cmp_bag([ ], $p->getPageData(5), 'page 5 data correct');
# Test getPageLinks ########################################################################
#
# getPageNumber, setPageNumber
#
########################################################################
my $p2 = WebGUI::Paginator->new($session, '/work');
is($p2->getPageNumber, 1, 'pageNumber set to 1 at object creation by default');
is($p2->setPageNumber(0), 0, 'setPageNumber returns the page number set');
is($p2->getPageNumber, 0, 'pageNumber set by setPageNumber');
is($p2->setPageNumber(3), 3, 'setPageNumber returns the page number set');
is($p2->getPageNumber, 3, 'pageNumber set by setPageNumber');
########################################################################
#
# getPageLinks
#
########################################################################
my $expectedPages; my $expectedPages;
$expectedPages = [ map { +{ $expectedPages = [ map { +{
'pagination.text' => ( $_ + 1 ), 'pagination.text' => ( $_ + 1 ),
@ -63,7 +84,6 @@ cmp_deeply(
'page links correct', 'page links correct',
); );
$startingRowNum = 0; $startingRowNum = 0;
$endingRowNum = 100; $endingRowNum = 100;
@paginatingData = ($startingRowNum..$endingRowNum); @paginatingData = ($startingRowNum..$endingRowNum);
@ -78,7 +98,7 @@ $p->setDataByArrayRef(\@paginatingData);
is($p->getRowCount, $rowCount, '(101) paginator returns correct number of rows'); is($p->getRowCount, $rowCount, '(101) paginator returns correct number of rows');
is($p->getNumberOfPages, $NumberOfPages, '(101) paginator returns right number of pages (default setting)'); is($p->getNumberOfPages, $NumberOfPages, '(101) paginator returns right number of pages (default setting)');
my $page1Data = $p->getPageData(1); $page1Data = $p->getPageData(1);
cmp_bag([0..24], $p->getPageData(1), '(101) page 1 data correct'); cmp_bag([0..24], $p->getPageData(1), '(101) page 1 data correct');
cmp_bag([25..49], $p->getPageData(2), '(101) page 2 data correct'); cmp_bag([25..49], $p->getPageData(2), '(101) page 2 data correct');
cmp_bag([100 ], $p->getPageData(5), '(101) page 5 data correct'); cmp_bag([100 ], $p->getPageData(5), '(101) page 5 data correct');
@ -95,11 +115,105 @@ $expectedPages = [ map { +{
$expectedPages->[0]->{'pagination.activePage'} = 'true'; $expectedPages->[0]->{'pagination.activePage'} = 'true';
########################################################################
#
# getPageLinks with limits
#
########################################################################
# Test getPageLinks
cmp_deeply( cmp_deeply(
($p->getPageLinks)[0], ($p->getPageLinks)[0],
$expectedPages, $expectedPages,
'page links correct', 'set of 5 pages looks right',
); );
$startingRowNum = 0;
$endingRowNum = 199;
@paginatingData = ($startingRowNum..$endingRowNum);
$p = WebGUI::Paginator->new($session, '/home', 10);
$rowCount = $endingRowNum - $startingRowNum + 1;
$NumberOfPages = ceil($rowCount/10); ##Default page size=25
$p->setDataByArrayRef(\@paginatingData);
$expectedPages = [ map { +{
'pagination.text' => ( $_ + 1 ),
'pagination.range' => ( 10 * $_ + 1 ) . "-" . ( $_ * 10 + 10 <= $endingRowNum + 1 ? $_ * 10 + 10 : $endingRowNum + 1 ), # First row number - Last row number
'pagination.url' => ( '/home?pn=' . ( $_ + 1 ) ), # Current page has no URL
} } (0..$NumberOfPages-1) ];
my $copy;
$copy = dclone($expectedPages);
$copy->[0]->{'pagination.activePage'} = 'true';
$copy->[0]->{'pagination.url'} = '';
cmp_deeply(
($p->getPageLinks)[0],
$copy,
'set of 20 pages looks right',
);
my @pageWindow;
$copy = dclone($expectedPages);
$copy->[0]->{'pagination.activePage'} = 'true';
$copy->[0]->{'pagination.url'} = '';
@pageWindow = @{ $copy }[0..9];
cmp_deeply(
($p->getPageLinks(10))[0],
\@pageWindow,
'set of first 10 pages selected correctly',
);
$p->setPageNumber(10);
my $copy = dclone($expectedPages);
$copy->[9]->{'pagination.activePage'} = 'true';
$copy->[9]->{'pagination.url'} = '';
@pageWindow = @{ $copy }[4..13];
cmp_deeply(
($p->getPageLinks(10))[0],
\@pageWindow,
'set of middle 10 pages @10 selected correctly',
);
$p->setPageNumber(3);
my $copy = dclone($expectedPages);
$copy->[2]->{'pagination.activePage'} = 'true';
$copy->[2]->{'pagination.url'} = '';
delete $copy->[0]->{'pagination.activePage'};
@pageWindow = @{ $copy }[0..9];
cmp_deeply(
($p->getPageLinks(10))[0],
\@pageWindow,
'set of 10 pages selected correctly, with off edge page number (3/20)',
);
$p->setPageNumber(17);
my $copy = dclone($expectedPages);
$copy->[16]->{'pagination.activePage'} = 'true';
$copy->[16]->{'pagination.url'} = '';
@pageWindow = @{ $copy }[10..19];
cmp_deeply(
($p->getPageLinks(10))[0],
\@pageWindow,
'set of last 10 pages selected correctly, (17/20)',
);
$p->setPageNumber(20);
my $copy = dclone($expectedPages);
$copy->[19]->{'pagination.activePage'} = 'true';
$copy->[19]->{'pagination.url'} = '';
@pageWindow = @{ $copy }[10..19];
cmp_deeply(
($p->getPageLinks(10))[0],
\@pageWindow,
'set of last 10 pages selected correctly, (20/20)',
);