#!/usr/bin/perl use strict; use warnings; use Test::More tests => 31; use Test::Exception; # use Data::Dumper::Simple; # this represents a single page of results my @dataset = qw( fee fi fo foo fum ); { package TestApp; use base 'Class::DBI'; use Class::DBI::Plugin::Pager; sub count_search_where { 27 } # the '@_' appends the class name, SQL and bind values passed in from # search_where_limitable sub retrieve_from_sql { @dataset, @_ } sub __driver { 'MySQL' } # LimitOffset syntax } my $where = { 'this' => 'that' }; my $order_by = [ 'fig' ]; my ( $pager, @results ); #lives_ok { ( $pager, @results ) = TestApp->search_where_paged( { this => 'that' }, # { order_by => 'fig' }, # scalar( @dataset ), # 3, # ) } 'survived search_where_paged'; # it's ugly - @results contains @dataset, 'TestApp', $phrase, @bind_values # because of TestApp::retrieve_from_sql overriding the real CDBI::retrieve_from_sql, # instead of being a list of CDBI objects lives_ok { ( $pager, @results ) = TestApp->pager->search_where( { this => 'that' }, { order_by => 'fig' }, scalar( @dataset ), 3, ) } 'survived search_where'; ok( @results > 0, 'got some results' ); is($results[-2], '( this = ? ) ORDER BY fig LIMIT 5 OFFSET 10', 'search_where results'); lives_ok { $pager = TestApp->pager } 'get pager - no args'; isa_ok( $pager, 'Data::Page', 'the pager' ); lives_ok { $pager->page( 3 ) } 'set page'; lives_ok { $pager->per_page( scalar( @dataset ) ) } 'set per_page'; lives_ok { $pager->where( $where ) } 'set where'; lives_ok { $pager->order_by( $order_by ) } 'set order_by'; lives_ok { @results = $pager->search_where } 'search_where'; is_deeply( \@results, [ @dataset, 'TestApp', '( this = ? ) ORDER BY fig LIMIT 5 OFFSET 10', 'that' ], 'LimitOffset results' ); is_deeply( [ $pager->current_page, $pager->total_entries, $pager->last_page, ], [ 3, 27, int( 27 / scalar( @dataset ) ) + 1 ], 'pager numbers' ); # ----------------------- my %conf = ( page => 3, per_page => scalar( @dataset ), where => $where, order_by => $order_by, syntax => 'RowsTo', ); lives_ok { $pager = TestApp->pager( %conf ) } 'pager - named args'; lives_ok { @results = $pager->search_where } 'search_where'; is_deeply( \@results, [ @dataset, 'TestApp', '( this = ? ) ORDER BY fig ROWS 10 TO 15', 'that' ], 'RowsTo results' ); $pager = TestApp->pager; $conf{syntax} = 'LimitXY'; lives_ok { @results = $pager->search_where( %conf ) } 'search_where - named args'; is_deeply( \@results, [ @dataset, 'TestApp', '( this = ? ) ORDER BY fig LIMIT 10, 5', 'that' ], 'LimitXY results' ); my @args = ( $where, $order_by, scalar( @dataset ), 3, 'RowsTo' ); lives_ok { $pager = TestApp->pager( @args ) } 'pager - positional args'; lives_ok { @results = $pager->search_where } 'search_where'; is_deeply( \@results, [ @dataset, 'TestApp', '( this = ? ) ORDER BY fig ROWS 10 TO 15', 'that' ], 'RowsTo results' ); # accepts arrayref 'where' clause - first with named args, then with positional $pager = undef; @results = (); $conf{ where } = [ age => {'<=', 80}, age => {'=>', 20}, city => 'Jerusalem', ]; $conf{ abstract_attr } = { logic => 'AND' }; lives_ok { $pager = TestApp->pager( %conf ) } 'new pager - arrayref where (named args)'; lives_ok { @results = $pager->search_where } 'search_where'; is_deeply( \@results, [ @dataset, 'TestApp', '( ( age <= ? ) AND ( age => ? ) AND ( city = ? ) ) ORDER BY fig LIMIT 10, 5', '80', '20', 'Jerusalem', ], 'arrayref where (named args) results' ); $pager = undef; @results = (); # ok( @{ $conf{ where } }, 'where not eaten' ); $conf{ where } = [ age => {'<=', 80}, age => {'=>', 20}, city => 'Jerusalem', ]; $args[0] = $conf{ where }; # ok( @{ $args[0] }, 'where not eaten' ); lives_ok { $pager = TestApp->pager( $args[0], { logic => 'AND' }, @args[1..$#args] ) } 'new pager - arrayref where (positional args)'; lives_ok { @results = $pager->search_where } 'search_where'; is_deeply( \@results, [ @dataset, 'TestApp', '( ( age <= ? ) AND ( age => ? ) AND ( city = ? ) ) ORDER BY fig ROWS 10 TO 15', '80', '20', 'Jerusalem', ], 'arrayref where (positional args) results' ); # retrieve_all $pager = undef; @results = (); @args = ( $order_by, scalar( @dataset ), 3, 'RowsTo' ); lives_ok { $pager = TestApp->pager } 'no args constructor'; lives_ok { @results = $pager->retrieve_all( @args ) } '@args passed to retrieve_all'; #is_deeply( \@results, [ @dataset, 'TestApp', '( 1 = ? ) ORDER BY fig ROWS 10 TO 15', '1' ], 'retrieve_all results' ); is_deeply( \@results, [ @dataset, 'TestApp', ' 1=1 ORDER BY fig ROWS 10 TO 15' ], 'retrieve_all results' ); $pager = TestApp->pager; $pager->order_by( $order_by ); $pager->per_page( scalar( @dataset ) ); $pager->page( 3 ); $pager->set_syntax( 'RowsTo' ); lives_ok { @results = $pager->retrieve_all } 'retrieve_all without args'; #is_deeply( \@results, [ @dataset, 'TestApp', '( 1 = ? ) ORDER BY fig ROWS 10 TO 15', '1' ], 'retrieve_all results' ); is_deeply( \@results, [ @dataset, 'TestApp', ' 1=1 ORDER BY fig ROWS 10 TO 15' ], 'retrieve_all results' ); #use YAML; #warn Dump( $pager );