use C4::Context;
-use Test::More tests => 56;
+use Test::More tests => 57;
use MARC::Record;
-use Koha::Patrons;
use C4::Items;
use C4::Biblio;
use C4::Reserves;
use Koha::Database;
use Koha::DateUtils qw( dt_from_string output_pref );
use Koha::Biblios;
+use Koha::CirculationRules;
use Koha::Holds;
+use Koha::IssuingRules;
use Koha::Items;
use Koha::Libraries;
use Koha::Patrons;
-use Koha::CirculationRules;
BEGIN {
use FindBin;
'libraryNotFound', 'Cannot set unknown library as pickup location');
};
+$schema->storage->txn_rollback;
+
+subtest 'CanItemBeReserved / holds_per_day tests' => sub {
+
+ plan tests => 9;
+
+ $schema->storage->txn_begin;
+
+ Koha::Holds->search->delete;
+ $dbh->do('DELETE FROM issues');
+ Koha::Items->search->delete;
+ Koha::Biblios->search->delete;
+
+ my $itemtype = $builder->build_object( { class => 'Koha::ItemTypes' } );
+ my $library = $builder->build_object( { class => 'Koha::Libraries' } );
+ my $patron = $builder->build_object( { class => 'Koha::Patrons' } );
+
+ # Create 3 biblios with items
+ my ($bibnum_1) = create_helper_biblio( $itemtype->itemtype );
+ my ( undef, undef, $itemnumber_1 ) = AddItem(
+ { homebranch => $library->branchcode,
+ holdingbranch => $library->branchcode
+ },
+ $bibnum
+ );
+ my ($bibnum_2) = create_helper_biblio( $itemtype->itemtype );
+ my ( undef, undef, $itemnumber_2 ) = AddItem(
+ { homebranch => $library->branchcode,
+ holdingbranch => $library->branchcode
+ },
+ $bibnum_2
+ );
+ my ($bibnum_3) = create_helper_biblio( $itemtype->itemtype );
+ my ( undef, undef, $itemnumber_3 ) = AddItem(
+ { homebranch => $library->branchcode,
+ holdingbranch => $library->branchcode
+ },
+ $bibnum_3
+ );
+
+ Koha::IssuingRules->search->delete;
+ my $issuingrule = Koha::IssuingRule->new(
+ { categorycode => '*',
+ branchcode => '*',
+ itemtype => $itemtype->itemtype,
+ reservesallowed => 1,
+ holds_per_record => 99,
+ holds_per_day => 2
+ }
+ )->store;
+
+ is_deeply(
+ CanItemBeReserved( $patron->borrowernumber, $itemnumber_1 ),
+ { status => 'OK' },
+ 'Patron can reserve item with hold limit of 1, no holds placed'
+ );
+
+ AddReserve( $library->branchcode, $patron->borrowernumber, $bibnum_1, '', 1, );
+
+ is_deeply(
+ CanItemBeReserved( $patron->borrowernumber, $itemnumber_1 ),
+ { status => 'tooManyReserves', limit => 1 },
+ 'Patron cannot reserve item with hold limit of 1, 1 bib level hold placed'
+ );
+
+ # Raise reservesallowed to avoid tooManyReserves from it
+ $issuingrule->set( { reservesallowed => 3 } )->store;
+
+ is_deeply(
+ CanItemBeReserved( $patron->borrowernumber, $itemnumber_2 ),
+ { status => 'OK' },
+ 'Patron can reserve item with 2 reserves daily cap'
+ );
+
+ # Add a second reserve
+ my $res_id = AddReserve( $library->branchcode, $patron->borrowernumber, $bibnum_2, '', 1, );
+ is_deeply(
+ CanItemBeReserved( $patron->borrowernumber, $itemnumber_2 ),
+ { status => 'tooManyReservesToday', limit => 2 },
+ 'Patron cannot a third item with 2 reserves daily cap'
+ );
+
+ # Update last hold so reservedate is in the past, so 2 holds, but different day
+ $hold = Koha::Holds->find($res_id);
+ my $yesterday = dt_from_string() - DateTime::Duration->new( days => 1 );
+ $hold->reservedate($yesterday)->store;
+
+ is_deeply(
+ CanItemBeReserved( $patron->borrowernumber, $itemnumber_2 ),
+ { status => 'OK' },
+ 'Patron can reserve item with 2 bib level hold placed on different days, 2 reserves daily cap'
+ );
+
+ # Set holds_per_day to 0
+ $issuingrule->set( { holds_per_day => 0 } )->store;
+
+ # Delete existing holds
+ Koha::Holds->search->delete;
+ is_deeply(
+ CanItemBeReserved( $patron->borrowernumber, $itemnumber_2 ),
+ { status => 'tooManyReservesToday', limit => 0 },
+ 'Patron cannot reserve if holds_per_day is 0 (i.e. 0 is 0)'
+ );
+
+ $issuingrule->set( { holds_per_day => undef } )->store;
+ Koha::Holds->search->delete;
+ is_deeply(
+ CanItemBeReserved( $patron->borrowernumber, $itemnumber_2 ),
+ { status => 'OK' },
+ 'Patron can reserve if holds_per_day is undef (i.e. undef is unlimited daily cap)'
+ );
+ AddReserve( $library->branchcode, $patron->borrowernumber, $bibnum_1, '', 1, );
+ AddReserve( $library->branchcode, $patron->borrowernumber, $bibnum_2, '', 1, );
+ is_deeply(
+ CanItemBeReserved( $patron->borrowernumber, $itemnumber_3 ),
+ { status => 'OK' },
+ 'Patron can reserve if holds_per_day is undef (i.e. undef is unlimited daily cap)'
+ );
+ AddReserve( $library->branchcode, $patron->borrowernumber, $bibnum_3, '', 1, );
+ is_deeply(
+ CanItemBeReserved( $patron->borrowernumber, $itemnumber_3 ),
+ { status => 'tooManyReserves', limit => 3 },
+ 'Unlimited daily holds, but reached reservesallowed'
+ );
+
+ $schema->storage->txn_rollback;
+};
+
+
# Helper method to set up a Biblio.
sub create_helper_biblio {
my $itemtype = shift;