Minor improvements to the maint helper scripts
[dbsrgits/DBIx-Class.git] / t / 67pager.t
1 BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7
8 use DBICTest;
9
10 my $schema = DBICTest->init_schema();
11
12 is ($schema->resultset("CD")->count, 5, 'Initial count sanity check');
13
14 my $qcnt;
15 $schema->storage->debugcb(sub { $qcnt++ });
16 $schema->storage->debug (1);
17
18 my $rs = $schema->resultset("CD");
19
20 # first page
21 $qcnt = 0;
22 my $it = $rs->search(
23     {},
24     { order_by => 'title',
25       rows => 3,
26       page => 1 }
27 );
28 my $pager = $it->pager;
29 is ($qcnt, 0, 'No queries on rs/pager creation');
30
31 is ($pager->entries_per_page, 3, 'Pager created with correct entries_per_page');
32 ok ($pager->current_page(-1), 'Set nonexistent page');
33 is ($pager->current_page, 1, 'Page set behaves correctly');
34 ok ($pager->current_page(2), 'Set 2nd page');
35
36 is ($qcnt, 0, 'No queries on total_count-independent methods');
37
38 is( $it->pager->entries_on_this_page, 2, "entries_on_this_page ok for page 2" );
39
40 is ($qcnt, 1, 'Count fired to get pager page entries');
41
42 $qcnt = 0;
43 is ($pager->previous_page, 1, 'Correct previous_page');
44 is ($pager->next_page, undef, 'No more pages');
45 is ($qcnt, 0, 'No more counts - amount of entries cached in pager');
46
47 is( $it->count, 3, "count on paged rs ok" );
48 is ($qcnt, 1, 'An $rs->count still fires properly');
49
50 is( $it->next->title, "Caterwaulin' Blues", "iterator->next ok" );
51
52 $it->next;
53 $it->next;
54
55 is( $it->next, undef, "next past end of page ok" );
56
57
58 # second page, testing with array
59 my @page2 = $rs->search(
60     {},
61     { order_by => 'title',
62       rows => 3,
63       page => 2 }
64 );
65
66 is( $page2[0]->title, "Generic Manufactured Singles", "second page first title ok" );
67
68 # page a standard resultset
69 $it = $rs->search(
70   {},
71   { order_by => 'title',
72     rows => 3 }
73 );
74
75 {
76   my $page = $it->page(2);
77
78   is( $page->count, 2, "standard resultset paged rs count ok" );
79
80   is( $page->next->title, "Generic Manufactured Singles", "second page of standard resultset ok" );
81 }
82
83 # test software-based limit paging
84 $it = $rs->search(
85   {},
86   { order_by => 'title',
87     rows => 3,
88     page => 2,
89     software_limit => 1 }
90 );
91 is( $it->pager->entries_on_this_page, 2, "software entries_on_this_page ok" );
92
93 is( $it->pager->previous_page, 1, "software previous_page ok" );
94
95 is( $it->count, 2, "software count on paged rs ok" );
96
97 is( $it->next->title, "Generic Manufactured Singles", "software iterator->next ok" );
98
99 # test paging with chained searches
100 $it = $rs->search(
101     {},
102     { rows => 2,
103       page => 2 }
104 )->search( undef, { order_by => 'title' } );
105
106 is( $it->count, 2, "chained searches paging ok" );
107
108 # test page with offset
109 $it = $rs->search({}, {
110     rows => 2,
111     page => 2,
112     offset => 1,
113     order_by => 'cdid'
114 });
115
116 my $row = $rs->search({}, {
117     order_by => 'cdid',
118     offset => 3,
119     rows => 1
120 })->single;
121
122 is($row->cdid, $it->first->cdid, 'page with offset');
123
124
125 # test pager on non-title page behavior
126 $qcnt = 0;
127 $it = $rs->search({}, { rows => 3 })->page (2);
128 ok ($it->pager);
129 is ($qcnt, 0, 'No count on past-first-page pager instantiation');
130
131 is ($it->pager->current_page, 2, 'Page set properby by $rs');
132 is( $it->pager->total_entries, 5, 'total_entries correct' );
133
134 $rs->create ({ artist => 1, title => 'MOAR!', year => 2010 });
135 is( $it->count, 3, 'Dynamic count on filling up page' );
136 $rs->create ({ artist => 1, title => 'MOAR!!!', year => 2011 });
137 is( $it->count, 3, 'Count still correct (does not overflow' );
138
139 $qcnt = 0;
140 is( $it->pager->total_entries, 5, 'total_entries properly cached at old value' );
141 is ($qcnt, 0, 'No queries');
142
143 # test fresh pager with explicit total count assignment
144 $qcnt = 0;
145 $pager = $rs->search({}, { rows => 4 })->page (2)->pager;
146 $pager->total_entries (13);
147
148 is ($pager->current_page, 2, 'Correct start page');
149 is ($pager->next_page, 3, 'One more page');
150 is ($pager->last_page, 4, 'And one more page');
151 is ($pager->previous_page, 1, 'One page in front');
152
153 is ($qcnt, 0, 'No queries with explicitly sey total count');
154
155 # test cached resultsets
156 my $init_cnt = $rs->count;
157
158 $it = $rs->search({}, { rows => 3, cache => 1 })->page(2);
159 is ($it->count, 3, '3 rows');
160 is (scalar $it->all, 3, '3 objects');
161
162 isa_ok($it->pager,'Data::Page','Get a pager back ok');
163 is($it->pager->total_entries,7);
164 is($it->pager->current_page,2);
165 is($it->pager->entries_on_this_page,3);
166
167 $it = $it->page(3);
168 is ($it->count, 1, 'One row');
169 is (scalar $it->all, 1, 'One object');
170
171 isa_ok($it->pager,'Data::Page','Get a pager back ok');
172 is($it->pager->total_entries,7);
173 is($it->pager->current_page,3);
174 is($it->pager->entries_on_this_page,1);
175
176
177 $it->delete;
178 is ($rs->count, $init_cnt - 1, 'One row deleted as expected');
179
180 is ($it->count, 1, 'One row (cached)');
181 is (scalar $it->all, 1, 'One object (cached)');
182
183 # test fresh rs creation with modified defaults
184 my $p = sub { $schema->resultset('CD')->page(1)->pager->entries_per_page; };
185
186 is($p->(), 10, 'default rows is 10');
187
188 $schema->default_resultset_attributes({ rows => 5 });
189
190 is($p->(), 5, 'default rows is 5');
191
192 # does serialization work (preserve laziness, while preserving state if exits)
193 $qcnt = 0;
194 $it = $rs->search(
195     {},
196     { order_by => 'title',
197       rows => 5,
198       page => 2 }
199 );
200 $pager = $it->pager;
201 is ($qcnt, 0, 'No queries on rs/pager creation');
202
203 # test *requires* it to be Storable
204 $it = do {
205   local $DBIx::Class::ResultSourceHandle::thaw_schema = $schema;
206   Storable::dclone ($it);
207 };
208 is ($qcnt, 0, 'No queries on rs/pager freeze/thaw');
209
210 is( $it->pager->entries_on_this_page, 1, "entries_on_this_page ok for page 2" );
211
212 is ($qcnt, 1, 'Count fired to get pager page entries');
213
214 $rs->create({ title => 'bah', artist => 1, year => 2011 });
215
216 $qcnt = 0;
217 # test *requires* it to be Storable
218 $it = do {
219   local $DBIx::Class::ResultSourceHandle::thaw_schema = $schema;
220   Storable::dclone ($it);
221 };
222 is ($qcnt, 0, 'No queries on rs/pager freeze/thaw');
223
224 is( $it->pager->entries_on_this_page, 1, "entries_on_this_page ok for page 2, even though underlying count changed" );
225
226 is ($qcnt, 0, 'No count fired on pre-existing total count');
227
228 done_testing;