Bug 17738: Replace GetReservesFromBorrowernumber with Koha::Patron->get_holds
[koha-ffzg.git] / t / db_dependent / Holds.t
index da67f51..ad87b26 100755 (executable)
@@ -6,9 +6,8 @@ use t::lib::Mocks;
 use t::lib::TestBuilder;
 
 use C4::Context;
-use C4::Branch;
 
-use Test::More tests => 60;
+use Test::More tests => 58;
 use MARC::Record;
 use C4::Biblio;
 use C4::Items;
@@ -16,7 +15,9 @@ use C4::Members;
 use C4::Calendar;
 use Koha::Database;
 use Koha::DateUtils qw( dt_from_string output_pref );
+use Koha::Biblios;
 use Koha::Holds;
+use Koha::Patrons;
 
 BEGIN {
     use FindBin;
@@ -85,20 +86,26 @@ foreach my $borrowernumber ( @borrowernumbers ) {
     );
 }
 
-my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber });
-is( scalar(@$reserves), $borrowers_count, "Test GetReserves()" );
-
-is( $reserves->[0]->{priority}, 1, "Reserve 1 has a priority of 1" );
-is( $reserves->[1]->{priority}, 2, "Reserve 2 has a priority of 2" );
-is( $reserves->[2]->{priority}, 3, "Reserve 3 has a priority of 3" );
-is( $reserves->[3]->{priority}, 4, "Reserve 4 has a priority of 4" );
-is( $reserves->[4]->{priority}, 5, "Reserve 5 has a priority of 5" );
-
-my ( $reservedate, $borrowernumber, $branch_1code, $reserve_id ) = GetReservesFromItemnumber($itemnumber);
-is( $reservedate, output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 }), "GetReservesFromItemnumber should return a valid reserve date");
-is( $borrowernumber, $borrowernumbers[0], "GetReservesFromItemnumber should return a valid borrowernumber");
-is( $branch_1code, $branch_1, "GetReservesFromItemnumber should return a valid branchcode");
-ok($reserve_id, "Test GetReservesFromItemnumber()");
+my $biblio = Koha::Biblios->find( $biblionumber );
+my $holds = $biblio->holds;
+is( $holds->count, $borrowers_count, 'Test GetReserves()' );
+is( $holds->next->priority, 1, "Reserve 1 has a priority of 1" );
+is( $holds->next->priority, 2, "Reserve 2 has a priority of 2" );
+is( $holds->next->priority, 3, "Reserve 3 has a priority of 3" );
+is( $holds->next->priority, 4, "Reserve 4 has a priority of 4" );
+is( $holds->next->priority, 5, "Reserve 5 has a priority of 5" );
+
+my $item = Koha::Items->find( $itemnumber );
+$holds = $item->current_holds;
+my $first_hold = $holds->next;
+my $reservedate = $first_hold->reservedate;
+my $borrowernumber = $first_hold->borrowernumber;
+my $branch_1code = $first_hold->branchcode;
+my $reserve_id = $first_hold->reserve_id;
+is( $reservedate, output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 }), "holds_placed_today should return a valid reserve date");
+is( $borrowernumber, $borrowernumbers[0], "holds_placed_today should return a valid borrowernumber");
+is( $branch_1code, $branch_1, "holds_placed_today should return a valid branchcode");
+ok($reserve_id, "Test holds_placed_today()");
 
 my $hold = Koha::Holds->find( $reserve_id );
 ok( $hold, "Koha::Holds found the hold" );
@@ -115,19 +122,24 @@ my $hold_found = $hold->found();
 $hold->set({ found => 'W'})->store();
 is( Koha::Holds->waiting()->count(), 1, "Koha::Holds->waiting returns waiting holds" );
 
-my ( $reserve ) = GetReservesFromBorrowernumber($borrowernumbers[0]);
-ok( $reserve->{'borrowernumber'} eq $borrowernumbers[0], "Test GetReservesFromBorrowernumber()");
+my $patron = Koha::Patrons->find( $borrowernumbers[0] );
+$holds = $patron->holds;
+is( $holds->next->borrowernumber, $borrowernumbers[0], "Test Koha::Patron->holds");
 
 
 ok( GetReserveCount( $borrowernumbers[0] ), "Test GetReserveCount()" );
 
 
 CancelReserve({ 'reserve_id' => $reserve_id });
-$reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber });
-is( scalar(@$reserves), $borrowers_count - 1, "Test CancelReserve()" );
+$holds = $biblio->holds;
+is( $holds->count, $borrowers_count - 1, "Test CancelReserve()" );
 
+$holds = $item->current_holds;
+$first_hold = $holds->next;
+$borrowernumber = $first_hold->borrowernumber;
+$branch_1code = $first_hold->branchcode;
+$reserve_id = $first_hold->reserve_id;
 
-( $reservedate, $borrowernumber, $branch_1code, $reserve_id ) = GetReservesFromItemnumber($itemnumber);
 ModReserve({
     reserve_id    => $reserve_id,
     rank          => '4',
@@ -136,7 +148,7 @@ ModReserve({
     suspend_until => output_pref( { dt => dt_from_string( "2013-01-01", "iso" ), dateonly => 1 } ),
 });
 
-$reserve = GetReserve( $reserve_id );
+my $reserve = GetReserve( $reserve_id );
 ok( $reserve->{'priority'} eq '4', "Test GetReserve(), priority changed correctly" );
 ok( $reserve->{'suspend'}, "Test GetReserve(), suspend hold" );
 is( $reserve->{'suspend_until'}, '2013-01-01 00:00:00', "Test GetReserve(), suspend until date" );
@@ -186,26 +198,27 @@ AddReserve(
     my $checkitem,
     my $found,
 );
-( $reserve ) = GetReservesFromBorrowernumber($borrowernumber);
+$patron = Koha::Patrons->find( $borrowernumber );
+$holds = $patron->holds;
 my $reserveid = C4::Reserves::GetReserveId(
     {
         biblionumber => $biblionumber,
         borrowernumber => $borrowernumber
     }
 );
-is( $reserveid, $reserve->{reserve_id}, "Test GetReserveId" );
+is( $reserveid, $holds->next->reserve_id, "Test GetReserveId" );
 ModReserveMinusPriority( $itemnumber, $reserve->{'reserve_id'} );
-( $reserve ) = GetReservesFromBorrowernumber($borrowernumber);
-ok( $reserve->{'itemnumber'} eq $itemnumber, "Test ModReserveMinusPriority()" );
+$holds = $patron->holds;
+is( $holds->next->itemnumber, $itemnumber, "Test ModReserveMinusPriority()" );
 
 
 my $reserve2 = GetReserveInfo( $reserve->{'reserve_id'} );
 ok( $reserve->{'reserve_id'} eq $reserve2->{'reserve_id'}, "Test GetReserveInfo()" );
 
 
-$reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber, all_dates => 1 });
-$reserve = $reserves->[1];
-AlterPriority( 'top', $reserve->{'reserve_id'} );
+$holds = $biblio->holds;
+$hold = $holds->next;
+AlterPriority( 'top', $hold->reserve_id );
 $reserve = GetReserve( $reserve->{'reserve_id'} );
 is( $reserve->{'priority'}, '1', "Test AlterPriority(), move to top" );
 
@@ -339,6 +352,19 @@ ModItem({ damaged => 1 }, $item_bibnum, $itemnumber);
 t::lib::Mocks::mock_preference( 'AllowHoldsOnDamagedItems', 1 );
 is( CanItemBeReserved( $borrowernumbers[0], $itemnumber), 'OK', "Patron can reserve damaged item with AllowHoldsOnDamagedItems enabled" );
 ok( defined( ( CheckReserves($itemnumber) )[1] ), "Hold can be trapped for damaged item with AllowHoldsOnDamagedItems enabled" );
+
+$hold = Koha::Hold->new(
+    {
+        borrowernumber => $borrowernumbers[0],
+        itemnumber     => $itemnumber,
+        biblionumber   => $item_bibnum,
+    }
+)->store();
+is( CanItemBeReserved( $borrowernumbers[0], $itemnumber ),
+    'itemAlreadyOnHold',
+    "Patron cannot place a second item level hold for a given item" );
+$hold->delete();
+
 t::lib::Mocks::mock_preference( 'AllowHoldsOnDamagedItems', 0 );
 ok( CanItemBeReserved( $borrowernumbers[0], $itemnumber) eq 'damaged', "Patron cannot reserve damaged item with AllowHoldsOnDamagedItems disabled" );
 ok( !defined( ( CheckReserves($itemnumber) )[1] ), "Hold cannot be trapped for damaged item with AllowHoldsOnDamagedItems disabled" );
@@ -409,43 +435,6 @@ is(CanItemBeReserved($borrowernumbers[0], $itemnumber),
 is(CanItemBeReserved($borrowernumbers[0], $itemnumber), 'OK',
     "CanItemBeReserved should returns 'OK'");
 
-
-# Test CancelExpiredReserves
-t::lib::Mocks::mock_preference('ExpireReservesMaxPickUpDelay', 1);
-t::lib::Mocks::mock_preference('ReservesMaxPickUpDelay', 1);
-
-my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);
-$year += 1900;
-$mon += 1;
-$reserves = $dbh->selectall_arrayref('SELECT * FROM reserves', { Slice => {} });
-$reserve = $reserves->[0];
-my $calendar = C4::Calendar->new(branchcode => $reserve->{branchcode});
-$calendar->insert_single_holiday(
-    day         => $mday,
-    month       => $mon,
-    year        => $year,
-    title       => 'Test',
-    description => 'Test',
-);
-$reserve_id = $reserve->{reserve_id};
-$dbh->do("UPDATE reserves SET waitingdate = DATE_SUB( NOW(), INTERVAL 5 DAY ), found = 'W', priority = 0 WHERE reserve_id = ?", undef, $reserve_id );
-t::lib::Mocks::mock_preference('ExpireReservesOnHolidays', 0);
-CancelExpiredReserves();
-my $count = $dbh->selectrow_array("SELECT COUNT(*) FROM reserves WHERE reserve_id = ?", undef, $reserve_id );
-is( $count, 1, "Waiting reserve beyond max pickup delay *not* canceled on holiday" );
-t::lib::Mocks::mock_preference('ExpireReservesOnHolidays', 1);
-CancelExpiredReserves();
-$count = $dbh->selectrow_array("SELECT COUNT(*) FROM reserves WHERE reserve_id = ?", undef, $reserve_id );
-is( $count, 0, "Waiting reserve beyond max pickup delay canceled on holiday" );
-
-# Test expirationdate
-$reserve = $reserves->[1];
-$reserve_id = $reserve->{reserve_id};
-$dbh->do("UPDATE reserves SET expirationdate = DATE_SUB( NOW(), INTERVAL 1 DAY ) WHERE reserve_id = ?", undef, $reserve_id );
-CancelExpiredReserves();
-$count = $dbh->selectrow_array("SELECT COUNT(*) FROM reserves WHERE reserve_id = ?", undef, $reserve_id );
-is( $count, 0, "Reserve with manual expiration date canceled correctly" );
-
 # Bug 12632
 t::lib::Mocks::mock_preference( 'item-level_itypes',     1 );
 t::lib::Mocks::mock_preference( 'ReservesControlBranch', 'PatronLibrary' );