Bug 16609: Catch warning from Koha::Hold in Hold.t
[koha.git] / t / db_dependent / Reserves.t
index 107cee9..cfc6eee 100755 (executable)
@@ -17,7 +17,8 @@
 
 use Modern::Perl;
 
-use Test::More tests => 71;
+use Test::More tests => 73;
+use Test::Warn;
 
 use MARC::Record;
 use DateTime::Duration;
@@ -128,21 +129,21 @@ is($status, "Reserved", "CheckReserves Test 2");
 is($status, "Reserved", "CheckReserves Test 3");
 
 my $ReservesControlBranch = C4::Context->preference('ReservesControlBranch');
-C4::Context->set_preference( 'ReservesControlBranch', 'ItemHomeLibrary' );
+t::lib::Mocks::mock_preference( 'ReservesControlBranch', 'ItemHomeLibrary' );
 ok(
     'ItemHomeLib' eq GetReservesControlBranch(
         { homebranch => 'ItemHomeLib' },
         { branchcode => 'PatronHomeLib' }
     ), "GetReservesControlBranch returns item home branch when set to ItemHomeLibrary"
 );
-C4::Context->set_preference( 'ReservesControlBranch', 'PatronLibrary' );
+t::lib::Mocks::mock_preference( 'ReservesControlBranch', 'PatronLibrary' );
 ok(
     'PatronHomeLib' eq GetReservesControlBranch(
         { homebranch => 'ItemHomeLib' },
         { branchcode => 'PatronHomeLib' }
     ), "GetReservesControlBranch returns patron home branch when set to PatronLibrary"
 );
-C4::Context->set_preference( 'ReservesControlBranch', $ReservesControlBranch );
+t::lib::Mocks::mock_preference( 'ReservesControlBranch', $ReservesControlBranch );
 
 ###
 ### Regression test for bug 10272
@@ -153,6 +154,13 @@ $requesters{'CPL'} = AddMember(
     categorycode => 'PT',
     surname      => 'borrower from CPL',
 );
+for my $i ( 2 .. 5 ) {
+    $requesters{"CPL$i"} = AddMember(
+        branchcode   => 'CPL',
+        categorycode => 'PT',
+        surname      => 'borrower $i from CPL',
+    );
+}
 $requesters{'FPL'} = AddMember(
     branchcode   => 'FPL',
     categorycode => 'PT',
@@ -258,7 +266,7 @@ AddReserve('CPL',  $requesters{'CPL'}, $bibnum2,
            $title,      $checkitem, $found);
 
 # Ensure that the item's home library controls hold policy lookup
-C4::Context->set_preference( 'ReservesControlBranch', 'ItemHomeLibrary' );
+t::lib::Mocks::mock_preference( 'ReservesControlBranch', 'ItemHomeLibrary' );
 
 my $messages;
 # Return the CPL item at FPL.  The hold that should be triggered is
@@ -272,6 +280,10 @@ is( $messages->{ResFound}->{borrowernumber},
 # Return the FPL item at FPL.  The hold that should be triggered is
 # the one placed by the RPL patron, as that patron is first in line
 # and RPL imposes no restrictions on whose holds its items can fill.
+
+# Ensure that the preference 'LocalHoldsPriority' is not set (Bug 15244):
+t::lib::Mocks::mock_preference( 'LocalHoldsPriority', '' );
+
 (undef, $messages, undef, undef) = AddReturn('bug10272_FPL', 'FPL');
 is( $messages->{ResFound}->{borrowernumber},
     $requesters{'RPL'},
@@ -313,7 +325,7 @@ is( $status, 'Reserved', 'CheckReserves also returns reserve with lookahead');
 
 # Test 9761b: Add a reserve with future date, CheckReserve should not return it
 $dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
-C4::Context->set_preference('AllowHoldDateInFuture', 1);
+t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1);
 $resdate= dt_from_string();
 $resdate->add_duration(DateTime::Duration->new(days => 4));
 $resdate=output_pref($resdate);
@@ -333,13 +345,13 @@ is( $status, 'Reserved', 'CheckReserves returns future reserve with sufficient l
 # Test 9761d: Check ResFound message of AddReturn for future hold
 # Note that AddReturn is in Circulation.pm, but this test really pertains to reserves; AddReturn uses the ConfirmFutureHolds pref when calling CheckReserves
 # In this test we do not need an issued item; it is just a 'checkin'
-C4::Context->set_preference('ConfirmFutureHolds', 0);
+t::lib::Mocks::mock_preference('ConfirmFutureHolds', 0);
 (my $doreturn, $messages)= AddReturn('97531','CPL');
 is($messages->{ResFound}//'', '', 'AddReturn does not care about future reserve when ConfirmFutureHolds is off');
-C4::Context->set_preference('ConfirmFutureHolds', 3);
+t::lib::Mocks::mock_preference('ConfirmFutureHolds', 3);
 ($doreturn, $messages)= AddReturn('97531','CPL');
 is(exists $messages->{ResFound}?1:0, 0, 'AddReturn ignores future reserve beyond ConfirmFutureHolds days');
-C4::Context->set_preference('ConfirmFutureHolds', 7);
+t::lib::Mocks::mock_preference('ConfirmFutureHolds', 7);
 ($doreturn, $messages)= AddReturn('97531','CPL');
 is(exists $messages->{ResFound}?1:0, 1, 'AddReturn considers future reserve within ConfirmFutureHolds days');
 
@@ -370,8 +382,8 @@ ok(defined($letter), 'can successfully generate hold slip (bug 10949)');
 # Tests for bug 9788: Does GetReservesFromItemnumber return a future wait?
 # 9788a: GetReservesFromItemnumber does not return future next available hold
 $dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
-C4::Context->set_preference('ConfirmFutureHolds', 2);
-C4::Context->set_preference('AllowHoldDateInFuture', 1);
+t::lib::Mocks::mock_preference('ConfirmFutureHolds', 2);
+t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1);
 $resdate= dt_from_string();
 $resdate->add_duration(DateTime::Duration->new(days => 2));
 $resdate=output_pref($resdate);
@@ -393,11 +405,12 @@ ModReserveAffect( $itemnumber,  $requesters{'CPL'} , 0); #confirm hold
 is(defined $results[3]?1:0, 1, 'GetReservesFromItemnumber returns a future wait (confirmed future hold)');
 # End of tests for bug 9788
 
+$dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
 # Tests for CalculatePriority (bug 8918)
 my $p = C4::Reserves::CalculatePriority($bibnum2);
 is($p, 4, 'CalculatePriority should now return priority 4');
 $resdate=undef;
-AddReserve('CPL',  $requesters{'CPL'}, $bibnum2,
+AddReserve('CPL',  $requesters{'CPL2'}, $bibnum2,
            $bibitems,  $p, $resdate, $expdate, $notes,
            $title,      $checkitem, $found);
 $p = C4::Reserves::CalculatePriority($bibnum2);
@@ -416,16 +429,16 @@ ModReserveAffect( $itemnumber,  $requesters{'CPL'} , 0);
 $p = C4::Reserves::CalculatePriority($bibnum);
 is($p, 1, 'CalculatePriority should now return priority 1');
 #add another biblio hold, no resdate
-AddReserve('CPL',  $requesters{'CPL'}, $bibnum,
+AddReserve('CPL',  $requesters{'CPL2'}, $bibnum,
            $bibitems,  $p, $resdate, $expdate, $notes,
            $title,      $checkitem, $found);
 $p = C4::Reserves::CalculatePriority($bibnum);
 is($p, 2, 'CalculatePriority should now return priority 2');
 #add another future hold
-C4::Context->set_preference('AllowHoldDateInFuture', 1);
+t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1);
 $resdate= dt_from_string();
 $resdate->add_duration(DateTime::Duration->new(days => 1));
-AddReserve('CPL',  $requesters{'CPL'}, $bibnum,
+AddReserve('CPL',  $requesters{'CPL3'}, $bibnum,
            $bibitems,  $p, output_pref($resdate), $expdate, $notes,
            $title,      $checkitem, $found);
 $p = C4::Reserves::CalculatePriority($bibnum);
@@ -435,6 +448,14 @@ $p = C4::Reserves::CalculatePriority($bibnum, $resdate);
 is($p, 3, 'CalculatePriority should now return priority 3');
 # End of tests for bug 8918
 
+# Test for bug 5144
+warning_is {
+    $reserve_id = AddReserve('CPL',  $requesters{'CPL3'}, $bibnum,
+           $bibitems,  $p, output_pref($resdate), $expdate, $notes,
+           $title,      $checkitem, $found)
+} "AddReserve: borrower $requesters{CPL3} already has a hold for biblionumber $bibnum";
+is( $reserve_id, undef, 'Attempt to add a second reserve on a given record for the same patron fails.' );
+
 # Tests for cancel reserves by users from OPAC.
 $dbh->do('DELETE FROM reserves', undef, ($bibnum));
 AddReserve('CPL',  $requesters{'CPL'}, $item_bibnum,
@@ -482,7 +503,7 @@ is($cancancel, 0, 'Reserve in waiting status cant be canceled');
 ####### Testing Bug 13113 - Prevent juvenile/children from reserving ageRestricted material >>>
        ####
 
-C4::Context->set_preference( 'AgeRestrictionMarker', 'FSK|PEGI|Age|K' );
+t::lib::Mocks::mock_preference( 'AgeRestrictionMarker', 'FSK|PEGI|Age|K' );
 
 #Reserving an not-agerestricted Biblio by a Borrower with no dateofbirth is tested previously.
 
@@ -536,7 +557,7 @@ ok( !C4::Reserves::OnShelfHoldsAllowed($item, $borrower), "OnShelfHoldsAllowed()
 
 $dbh->do("DELETE FROM reserves WHERE biblionumber=?",undef,($bibnum));
 my ( undef, undef, $bz14464_fines ) = GetMemberIssuesAndFines( $borrowernumber );
-ok( !$bz14464_fines, 'Bug 14464 - No fines at beginning' );
+is( !$bz14464_fines || $bz14464_fines==0, 1, 'Bug 14464 - No fines at beginning' );
 
 # First, test cancelling a reserve when there's no charge configured.
 t::lib::Mocks::mock_preference('ExpireReservesMaxPickUpDelayCharge', 0);
@@ -560,7 +581,7 @@ ok( $bz14464_reserve, 'Bug 14464 - 1st reserve correctly created' );
 CancelReserve({ reserve_id => $bz14464_reserve, charge_cancel_fee => 1 });
 
 ( undef, undef, $bz14464_fines ) = GetMemberIssuesAndFines( $borrowernumber );
-ok( !$bz14464_fines, 'Bug 14464 - No fines after cancelling reserve with no charge configured' );
+is( !$bz14464_fines || $bz14464_fines==0, 1, 'Bug 14464 - No fines after cancelling reserve with no charge configured' );
 
 # Then, test cancelling a reserve when there's no charge desired.
 t::lib::Mocks::mock_preference('ExpireReservesMaxPickUpDelayCharge', 42);
@@ -584,7 +605,7 @@ ok( $bz14464_reserve, 'Bug 14464 - 2nd reserve correctly created' );
 CancelReserve({ reserve_id => $bz14464_reserve });
 
 ( undef, undef, $bz14464_fines ) = GetMemberIssuesAndFines( $borrowernumber );
-ok( !$bz14464_fines, 'Bug 14464 - No fines after cancelling reserve with no charge desired' );
+is( !$bz14464_fines || $bz14464_fines==0, 1, 'Bug 14464 - No fines after cancelling reserve with no charge desired' );
 
 # Finally, test cancelling a reserve when there's a charge desired and configured.
 $bz14464_reserve = AddReserve(
@@ -611,8 +632,8 @@ is( int( $bz14464_fines ), 42, 'Bug 14464 - Fine applied after cancelling reserv
 # tests for MoveReserve in relation to ConfirmFutureHolds (BZ 14526)
 #   hold from A pos 1, today, no fut holds: MoveReserve should fill it
 $dbh->do('DELETE FROM reserves', undef, ($bibnum));
-C4::Context->set_preference('ConfirmFutureHolds', 0);
-C4::Context->set_preference('AllowHoldDateInFuture', 1);
+t::lib::Mocks::mock_preference('ConfirmFutureHolds', 0);
+t::lib::Mocks::mock_preference('AllowHoldDateInFuture', 1);
 AddReserve('CPL',  $borrowernumber, $item_bibnum,
     $bibitems,  1, undef, $expdate, $notes, $title, $checkitem, '');
 MoveReserve( $itemnumber, $borrowernumber );
@@ -635,7 +656,7 @@ MoveReserve( $itemnumber, $borrowernumber );
 is( $status, 'Reserved', 'MoveReserve did not fill future hold');
 $dbh->do('DELETE FROM reserves', undef, ($bibnum));
 #   hold from A pos 1, tomorrow, fut holds=2: MoveReserve should fill it
-C4::Context->set_preference('ConfirmFutureHolds', 2);
+t::lib::Mocks::mock_preference('ConfirmFutureHolds', 2);
 AddReserve('CPL',  $borrowernumber, $item_bibnum,
     $bibitems,  1, $resdate, $expdate, $notes, $title, $checkitem, '');
 MoveReserve( $itemnumber, $borrowernumber );