|
Lines 3-8
Link Here
|
| 3 |
use Modern::Perl; |
3 |
use Modern::Perl; |
| 4 |
|
4 |
|
| 5 |
use t::lib::Mocks; |
5 |
use t::lib::Mocks; |
|
|
6 |
use t::lib::TestBuilder; |
| 7 |
|
| 6 |
use C4::Context; |
8 |
use C4::Context; |
| 7 |
use C4::Branch; |
9 |
use C4::Branch; |
| 8 |
|
10 |
|
|
Lines 23-34
BEGIN {
Link Here
|
| 23 |
use_ok('C4::Reserves'); |
25 |
use_ok('C4::Reserves'); |
| 24 |
} |
26 |
} |
| 25 |
|
27 |
|
|
|
28 |
my $builder = t::lib::TestBuilder->new(); |
| 26 |
my $dbh = C4::Context->dbh; |
29 |
my $dbh = C4::Context->dbh; |
| 27 |
|
30 |
|
| 28 |
# Start transaction |
31 |
# Start transaction |
| 29 |
$dbh->{AutoCommit} = 0; |
32 |
$dbh->{AutoCommit} = 0; |
| 30 |
$dbh->{RaiseError} = 1; |
33 |
$dbh->{RaiseError} = 1; |
| 31 |
|
34 |
|
|
|
35 |
# Create two random branches |
| 36 |
my $branch_1 = $builder->build({ source => 'Branch' })->{ branchcode }; |
| 37 |
my $branch_2 = $builder->build({ source => 'Branch' })->{ branchcode }; |
| 38 |
|
| 32 |
my $borrowers_count = 5; |
39 |
my $borrowers_count = 5; |
| 33 |
|
40 |
|
| 34 |
$dbh->do('DELETE FROM itemtypes'); |
41 |
$dbh->do('DELETE FROM itemtypes'); |
|
Lines 44-50
$insert_sth->execute('ONLY1');
Link Here
|
| 44 |
my ($bibnum, $title, $bibitemnum) = create_helper_biblio('DUMMY'); |
51 |
my ($bibnum, $title, $bibitemnum) = create_helper_biblio('DUMMY'); |
| 45 |
|
52 |
|
| 46 |
# Create item instance for testing. |
53 |
# Create item instance for testing. |
| 47 |
my ($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => 'CPL', holdingbranch => 'CPL' } , $bibnum); |
54 |
my ($item_bibnum, $item_bibitemnum, $itemnumber) |
|
|
55 |
= AddItem({ homebranch => $branch_1, holdingbranch => $branch_1 } , $bibnum); |
| 48 |
|
56 |
|
| 49 |
# Create some borrowers |
57 |
# Create some borrowers |
| 50 |
my @borrowernumbers; |
58 |
my @borrowernumbers; |
|
Lines 53-72
foreach (1..$borrowers_count) {
Link Here
|
| 53 |
firstname => 'my firstname', |
61 |
firstname => 'my firstname', |
| 54 |
surname => 'my surname ' . $_, |
62 |
surname => 'my surname ' . $_, |
| 55 |
categorycode => 'S', |
63 |
categorycode => 'S', |
| 56 |
branchcode => 'CPL', |
64 |
branchcode => $branch_1, |
| 57 |
); |
65 |
); |
| 58 |
push @borrowernumbers, $borrowernumber; |
66 |
push @borrowernumbers, $borrowernumber; |
| 59 |
} |
67 |
} |
| 60 |
|
68 |
|
| 61 |
my $biblionumber = $bibnum; |
69 |
my $biblionumber = $bibnum; |
| 62 |
|
|
|
| 63 |
my @branches = GetBranchesLoop(); |
| 64 |
my $branch = $branches[0][0]{value}; |
| 65 |
|
70 |
|
| 66 |
# Create five item level holds |
71 |
# Create five item level holds |
| 67 |
foreach my $borrowernumber ( @borrowernumbers ) { |
72 |
foreach my $borrowernumber ( @borrowernumbers ) { |
| 68 |
AddReserve( |
73 |
AddReserve( |
| 69 |
$branch, |
74 |
$branch_1, |
| 70 |
$borrowernumber, |
75 |
$borrowernumber, |
| 71 |
$biblionumber, |
76 |
$biblionumber, |
| 72 |
my $bibitems = q{}, |
77 |
my $bibitems = q{}, |
|
Lines 89-98
is( $reserves->[2]->{priority}, 3, "Reserve 3 has a priority of 3" );
Link Here
|
| 89 |
is( $reserves->[3]->{priority}, 4, "Reserve 4 has a priority of 4" ); |
94 |
is( $reserves->[3]->{priority}, 4, "Reserve 4 has a priority of 4" ); |
| 90 |
is( $reserves->[4]->{priority}, 5, "Reserve 5 has a priority of 5" ); |
95 |
is( $reserves->[4]->{priority}, 5, "Reserve 5 has a priority of 5" ); |
| 91 |
|
96 |
|
| 92 |
my ( $reservedate, $borrowernumber, $branchcode, $reserve_id ) = GetReservesFromItemnumber($itemnumber); |
97 |
my ( $reservedate, $borrowernumber, $branch_1code, $reserve_id ) = GetReservesFromItemnumber($itemnumber); |
| 93 |
is( $reservedate, output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 }), "GetReservesFromItemnumber should return a valid reserve date"); |
98 |
is( $reservedate, output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 }), "GetReservesFromItemnumber should return a valid reserve date"); |
| 94 |
is( $borrowernumber, $borrowernumbers[0], "GetReservesFromItemnumber should return a valid borrowernumber"); |
99 |
is( $borrowernumber, $borrowernumbers[0], "GetReservesFromItemnumber should return a valid borrowernumber"); |
| 95 |
is( $branchcode, 'CPL', "GetReservesFromItemnumber should return a valid branchcode"); |
100 |
is( $branch_1code, $branch_1, "GetReservesFromItemnumber should return a valid branchcode"); |
| 96 |
ok($reserve_id, "Test GetReservesFromItemnumber()"); |
101 |
ok($reserve_id, "Test GetReservesFromItemnumber()"); |
| 97 |
|
102 |
|
| 98 |
my $hold = Koha::Holds->find( $reserve_id ); |
103 |
my $hold = Koha::Holds->find( $reserve_id ); |
|
Lines 122-132
$reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber });
Link Here
|
| 122 |
is( scalar(@$reserves), $borrowers_count - 1, "Test CancelReserve()" ); |
127 |
is( scalar(@$reserves), $borrowers_count - 1, "Test CancelReserve()" ); |
| 123 |
|
128 |
|
| 124 |
|
129 |
|
| 125 |
( $reservedate, $borrowernumber, $branchcode, $reserve_id ) = GetReservesFromItemnumber($itemnumber); |
130 |
( $reservedate, $borrowernumber, $branch_1code, $reserve_id ) = GetReservesFromItemnumber($itemnumber); |
| 126 |
ModReserve({ |
131 |
ModReserve({ |
| 127 |
reserve_id => $reserve_id, |
132 |
reserve_id => $reserve_id, |
| 128 |
rank => '4', |
133 |
rank => '4', |
| 129 |
branchcode => $branch, |
134 |
branchcode => $branch_1, |
| 130 |
itemnumber => $itemnumber, |
135 |
itemnumber => $itemnumber, |
| 131 |
suspend_until => C4::Dates->new("2013-01-01","iso")->output(), |
136 |
suspend_until => C4::Dates->new("2013-01-01","iso")->output(), |
| 132 |
}); |
137 |
}); |
|
Lines 149-155
ok( !$reserve->{'suspend'}, "Test AutoUnsuspendReserves()" );
Link Here
|
| 149 |
|
154 |
|
| 150 |
# Add a new hold for the borrower whose hold we canceled earlier, this time at the bib level |
155 |
# Add a new hold for the borrower whose hold we canceled earlier, this time at the bib level |
| 151 |
AddReserve( |
156 |
AddReserve( |
| 152 |
$branch, |
157 |
$branch_1, |
| 153 |
$borrowernumber, |
158 |
$borrowernumber, |
| 154 |
$biblionumber, |
159 |
$biblionumber, |
| 155 |
my $bibitems = q{}, |
160 |
my $bibitems = q{}, |
|
Lines 209-215
ok( $reserve->{'priority'} eq '5', "Test AlterPriority(), move to bottom" );
Link Here
|
| 209 |
|
214 |
|
| 210 |
my ($foreign_bibnum, $foreign_title, $foreign_bibitemnum) = create_helper_biblio('DUMMY'); |
215 |
my ($foreign_bibnum, $foreign_title, $foreign_bibitemnum) = create_helper_biblio('DUMMY'); |
| 211 |
my ($foreign_item_bibnum, $foreign_item_bibitemnum, $foreign_itemnumber) |
216 |
my ($foreign_item_bibnum, $foreign_item_bibitemnum, $foreign_itemnumber) |
| 212 |
= AddItem({ homebranch => 'MPL', holdingbranch => 'MPL' } , $foreign_bibnum); |
217 |
= AddItem({ homebranch => $branch_2, holdingbranch => $branch_2 } , $foreign_bibnum); |
| 213 |
$dbh->do('DELETE FROM issuingrules'); |
218 |
$dbh->do('DELETE FROM issuingrules'); |
| 214 |
$dbh->do( |
219 |
$dbh->do( |
| 215 |
q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed) |
220 |
q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed) |
|
Lines 228-246
$dbh->do(
Link Here
|
| 228 |
t::lib::Mocks::mock_preference('ReservesControlBranch', 'ItemHomeLibrary'); |
233 |
t::lib::Mocks::mock_preference('ReservesControlBranch', 'ItemHomeLibrary'); |
| 229 |
t::lib::Mocks::mock_preference('item-level_itypes', 1); |
234 |
t::lib::Mocks::mock_preference('item-level_itypes', 1); |
| 230 |
|
235 |
|
| 231 |
# if IndependentBranches is OFF, a CPL patron can reserve an MPL item |
236 |
# if IndependentBranches is OFF, a $branch_1 patron can reserve an $branch_2 item |
| 232 |
t::lib::Mocks::mock_preference('IndependentBranches', 0); |
237 |
t::lib::Mocks::mock_preference('IndependentBranches', 0); |
| 233 |
ok( |
238 |
ok( |
| 234 |
CanItemBeReserved($borrowernumbers[0], $foreign_itemnumber) eq 'OK', |
239 |
CanItemBeReserved($borrowernumbers[0], $foreign_itemnumber) eq 'OK', |
| 235 |
'CPL patron allowed to reserve MPL item with IndependentBranches OFF (bug 2394)' |
240 |
'$branch_1 patron allowed to reserve $branch_2 item with IndependentBranches OFF (bug 2394)' |
| 236 |
); |
241 |
); |
| 237 |
|
242 |
|
| 238 |
# if IndependentBranches is OFF, a CPL patron cannot reserve an MPL item |
243 |
# if IndependentBranches is OFF, a $branch_1 patron cannot reserve an $branch_2 item |
| 239 |
t::lib::Mocks::mock_preference('IndependentBranches', 1); |
244 |
t::lib::Mocks::mock_preference('IndependentBranches', 1); |
| 240 |
t::lib::Mocks::mock_preference('canreservefromotherbranches', 0); |
245 |
t::lib::Mocks::mock_preference('canreservefromotherbranches', 0); |
| 241 |
ok( |
246 |
ok( |
| 242 |
CanItemBeReserved($borrowernumbers[0], $foreign_itemnumber) eq 'cannotReserveFromOtherBranches', |
247 |
CanItemBeReserved($borrowernumbers[0], $foreign_itemnumber) eq 'cannotReserveFromOtherBranches', |
| 243 |
'CPL patron NOT allowed to reserve MPL item with IndependentBranches ON ... (bug 2394)' |
248 |
'$branch_1 patron NOT allowed to reserve $branch_2 item with IndependentBranches ON ... (bug 2394)' |
| 244 |
); |
249 |
); |
| 245 |
|
250 |
|
| 246 |
# ... unless canreservefromotherbranches is ON |
251 |
# ... unless canreservefromotherbranches is ON |
|
Lines 252-260
ok(
Link Here
|
| 252 |
|
257 |
|
| 253 |
# Regression test for bug 11336 |
258 |
# Regression test for bug 11336 |
| 254 |
($bibnum, $title, $bibitemnum) = create_helper_biblio('DUMMY'); |
259 |
($bibnum, $title, $bibitemnum) = create_helper_biblio('DUMMY'); |
| 255 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => 'CPL', holdingbranch => 'CPL' } , $bibnum); |
260 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1 } , $bibnum); |
| 256 |
AddReserve( |
261 |
AddReserve( |
| 257 |
$branch, |
262 |
$branch_1, |
| 258 |
$borrowernumbers[0], |
263 |
$borrowernumbers[0], |
| 259 |
$bibnum, |
264 |
$bibnum, |
| 260 |
'', |
265 |
'', |
|
Lines 268-276
my $reserveid1 = C4::Reserves::GetReserveId(
Link Here
|
| 268 |
} |
273 |
} |
| 269 |
); |
274 |
); |
| 270 |
|
275 |
|
| 271 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => 'CPL', holdingbranch => 'CPL' } , $bibnum); |
276 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1 } , $bibnum); |
| 272 |
AddReserve( |
277 |
AddReserve( |
| 273 |
$branch, |
278 |
$branch_1, |
| 274 |
$borrowernumbers[1], |
279 |
$borrowernumbers[1], |
| 275 |
$bibnum, |
280 |
$bibnum, |
| 276 |
'', |
281 |
'', |
|
Lines 288-296
CancelReserve({ reserve_id => $reserveid1 });
Link Here
|
| 288 |
$reserve2 = GetReserve( $reserveid2 ); |
293 |
$reserve2 = GetReserve( $reserveid2 ); |
| 289 |
is( $reserve2->{priority}, 1, "After cancelreserve, the 2nd reserve becomes the first on the waiting list" ); |
294 |
is( $reserve2->{priority}, 1, "After cancelreserve, the 2nd reserve becomes the first on the waiting list" ); |
| 290 |
|
295 |
|
| 291 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => 'CPL', holdingbranch => 'CPL' } , $bibnum); |
296 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1 } , $bibnum); |
| 292 |
AddReserve( |
297 |
AddReserve( |
| 293 |
$branch, |
298 |
$branch_1, |
| 294 |
$borrowernumbers[0], |
299 |
$borrowernumbers[0], |
| 295 |
$bibnum, |
300 |
$bibnum, |
| 296 |
'', |
301 |
'', |
|
Lines 320-328
ok( !defined( ( CheckReserves($itemnumber) )[1] ), "Hold cannot be trapped for d
Link Here
|
| 320 |
|
325 |
|
| 321 |
# Regression test for bug 9532 |
326 |
# Regression test for bug 9532 |
| 322 |
($bibnum, $title, $bibitemnum) = create_helper_biblio('CANNOT'); |
327 |
($bibnum, $title, $bibitemnum) = create_helper_biblio('CANNOT'); |
| 323 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => 'CPL', holdingbranch => 'CPL', itype => 'CANNOT' } , $bibnum); |
328 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CANNOT' } , $bibnum); |
| 324 |
AddReserve( |
329 |
AddReserve( |
| 325 |
$branch, |
330 |
$branch_1, |
| 326 |
$borrowernumbers[0], |
331 |
$borrowernumbers[0], |
| 327 |
$bibnum, |
332 |
$bibnum, |
| 328 |
'', |
333 |
'', |
|
Lines 362-386
$dbh->do('DELETE FROM default_circ_rules');
Link Here
|
| 362 |
$dbh->do(q{ |
367 |
$dbh->do(q{ |
| 363 |
INSERT INTO branch_item_rules (branchcode, itemtype, holdallowed, returnbranch) |
368 |
INSERT INTO branch_item_rules (branchcode, itemtype, holdallowed, returnbranch) |
| 364 |
VALUES (?, ?, ?, ?) |
369 |
VALUES (?, ?, ?, ?) |
| 365 |
}, {}, 'CPL', 'CANNOT', 0, 'homebranch'); |
370 |
}, {}, $branch_1, 'CANNOT', 0, 'homebranch'); |
| 366 |
$dbh->do(q{ |
371 |
$dbh->do(q{ |
| 367 |
INSERT INTO branch_item_rules (branchcode, itemtype, holdallowed, returnbranch) |
372 |
INSERT INTO branch_item_rules (branchcode, itemtype, holdallowed, returnbranch) |
| 368 |
VALUES (?, ?, ?, ?) |
373 |
VALUES (?, ?, ?, ?) |
| 369 |
}, {}, 'CPL', 'CAN', 1, 'homebranch'); |
374 |
}, {}, $branch_1, 'CAN', 1, 'homebranch'); |
| 370 |
($bibnum, $title, $bibitemnum) = create_helper_biblio('CANNOT'); |
375 |
($bibnum, $title, $bibitemnum) = create_helper_biblio('CANNOT'); |
| 371 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem( |
376 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem( |
| 372 |
{ homebranch => 'CPL', holdingbranch => 'CPL', itype => 'CANNOT' } , $bibnum); |
377 |
{ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CANNOT' } , $bibnum); |
| 373 |
is(CanItemBeReserved($borrowernumbers[0], $itemnumber), 'notReservable', |
378 |
is(CanItemBeReserved($borrowernumbers[0], $itemnumber), 'notReservable', |
| 374 |
"CanItemBeReserved should returns 'notReservable'"); |
379 |
"CanItemBeReserved should returns 'notReservable'"); |
| 375 |
|
380 |
|
| 376 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem( |
381 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem( |
| 377 |
{ homebranch => 'MPL', holdingbranch => 'CPL', itype => 'CAN' } , $bibnum); |
382 |
{ homebranch => $branch_2, holdingbranch => $branch_1, itype => 'CAN' } , $bibnum); |
| 378 |
is(CanItemBeReserved($borrowernumbers[0], $itemnumber), |
383 |
is(CanItemBeReserved($borrowernumbers[0], $itemnumber), |
| 379 |
'cannotReserveFromOtherBranches', |
384 |
'cannotReserveFromOtherBranches', |
| 380 |
"CanItemBeReserved should returns 'cannotReserveFromOtherBranches'"); |
385 |
"CanItemBeReserved should returns 'cannotReserveFromOtherBranches'"); |
| 381 |
|
386 |
|
| 382 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem( |
387 |
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem( |
| 383 |
{ homebranch => 'CPL', holdingbranch => 'CPL', itype => 'CAN' } , $bibnum); |
388 |
{ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CAN' } , $bibnum); |
| 384 |
is(CanItemBeReserved($borrowernumbers[0], $itemnumber), 'OK', |
389 |
is(CanItemBeReserved($borrowernumbers[0], $itemnumber), 'OK', |
| 385 |
"CanItemBeReserved should returns 'OK'"); |
390 |
"CanItemBeReserved should returns 'OK'"); |
| 386 |
|
391 |
|
|
Lines 431-437
$dbh->do('DELETE FROM items');
Link Here
|
| 431 |
$dbh->do('DELETE FROM biblio'); |
436 |
$dbh->do('DELETE FROM biblio'); |
| 432 |
|
437 |
|
| 433 |
( $bibnum, $title, $bibitemnum ) = create_helper_biblio('ONLY1'); |
438 |
( $bibnum, $title, $bibitemnum ) = create_helper_biblio('ONLY1'); |
| 434 |
( $item_bibnum, $item_bibitemnum, $itemnumber ) = AddItem( { homebranch => 'CPL', holdingbranch => 'CPL' }, $bibnum ); |
439 |
( $item_bibnum, $item_bibitemnum, $itemnumber ) |
|
|
440 |
= AddItem( { homebranch => $branch_1, holdingbranch => $branch_1 }, $bibnum ); |
| 435 |
|
441 |
|
| 436 |
$dbh->do( |
442 |
$dbh->do( |
| 437 |
q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed) |
443 |
q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed) |
|
Lines 442-448
$dbh->do(
Link Here
|
| 442 |
is( CanItemBeReserved( $borrowernumbers[0], $itemnumber ), |
448 |
is( CanItemBeReserved( $borrowernumbers[0], $itemnumber ), |
| 443 |
'OK', 'Patron can reserve item with hold limit of 1, no holds placed' ); |
449 |
'OK', 'Patron can reserve item with hold limit of 1, no holds placed' ); |
| 444 |
|
450 |
|
| 445 |
my $res_id = AddReserve( $branch, $borrowernumbers[0], $bibnum, '', 1, ); |
451 |
my $res_id = AddReserve( $branch_1, $borrowernumbers[0], $bibnum, '', 1, ); |
| 446 |
|
452 |
|
| 447 |
is( CanItemBeReserved( $borrowernumbers[0], $itemnumber ), |
453 |
is( CanItemBeReserved( $borrowernumbers[0], $itemnumber ), |
| 448 |
'tooManyReserves', 'Patron cannot reserve item with hold limit of 1, 1 bib level hold placed' ); |
454 |
'tooManyReserves', 'Patron cannot reserve item with hold limit of 1, 1 bib level hold placed' ); |
| 449 |
- |
|
|