Koha/t/db_dependent/Holds/ExpireReservesAutoFill.t
Nick Clemens 8637843bab
Bug 32455: Cleanup and expand ExpireReservesAutoFill.t
The tests here reused data, and deleted the tables before starting,
with a little shifting we can use specific data and avoid mass deletion

To test:
prove -v t/db_dependent/Holds/ExpireReservesAutoFill.t

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
2023-02-07 10:26:03 -03:00

220 lines
7.9 KiB
Perl
Executable file

#!/usr/bin/perl
use Modern::Perl;
use Test::More tests => 3;
use t::lib::Mocks;
use t::lib::TestBuilder;
use MARC::Record;
use C4::Context;
use C4::Biblio;
use C4::Items;
use Koha::Database;
use Koha::Holds;
use Koha::Notice::Messages;
BEGIN {
use FindBin;
use lib $FindBin::Bin;
use_ok('C4::Reserves');
}
my $schema = Koha::Database->new->schema;
$schema->storage->txn_begin;
my $builder = t::lib::TestBuilder->new();
my $dbh = C4::Context->dbh;
# Create two random branches
my $branch_1 = $builder->build_object({
class => 'Koha::Libraries',
value => {
branchemail => 'branch1@e.mail',
branchreplyto => 'branch1@reply.to'
}
});
my $library_1 = $branch_1->branchcode;
my $branch_2 = $builder->build_object({
class => 'Koha::Libraries',
value => {
branchemail => 'branch2@e.mail',
branchreplyto => 'branch2@reply.to'
}
});
my $library_2 = $branch_2->branchcode;
subtest 'Test automatically canceled expired waiting holds to fill the next hold, without a transfer' => sub {
plan tests => 12;
my $item = $builder->build_sample_item({ library => $library_1 });
my $biblionumber = $item->biblionumber;
my $itemnumber = $item->itemnumber;
my $patron_1 = $builder->build( { source => 'Borrower' } );
my $patron_2 = $builder->build( { source => 'Borrower' } );
my $patron_3 = $builder->build( { source => 'Borrower' } );
# Add a hold on the item for each of our patrons
my $hold_1 = Koha::Hold->new(
{
priority => 0,
borrowernumber => $patron_1->{borrowernumber},
branchcode => $library_1,
biblionumber => $biblionumber,
itemnumber => $itemnumber,
found => 'W',
reservedate => '1900-01-01',
waitingdate => '1900-01-01',
expirationdate => '1900-01-01',
lowestPriority => 0,
suspend => 0,
}
)->store();
my $hold_2 = Koha::Hold->new(
{
priority => 1,
borrowernumber => $patron_2->{borrowernumber},
branchcode => $library_1,
biblionumber => $biblionumber,
itemnumber => $itemnumber,
reservedate => '1900-01-01',
expirationdate => '9999-01-01',
lowestPriority => 0,
suspend => 0,
}
)->store();
my $hold_3 = Koha::Hold->new(
{
priority => 2,
borrowernumber => $patron_3->{borrowernumber},
branchcode => $library_1,
biblionumber => $biblionumber,
itemnumber => $itemnumber,
reservedate => '1900-01-01',
expirationdate => '9999-01-01',
lowestPriority => 0,
suspend => 0,
}
)->store();
# Test CancelExpiredReserves
t::lib::Mocks::mock_preference( 'ExpireReservesMaxPickUpDelay', 1 );
t::lib::Mocks::mock_preference( 'ReservesMaxPickUpDelay', 1 );
t::lib::Mocks::mock_preference( 'ExpireReservesOnHolidays', 1 );
t::lib::Mocks::mock_preference( 'ExpireReservesAutoFill', 1 );
t::lib::Mocks::mock_preference( 'ExpireReservesAutoFillEmail',
'kyle@example.com' );
$hold_1->cancel({ autofill => 1 });
my $holds = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } );
$hold_2 = $holds->next;
$hold_3 = $holds->next;
is( $holds->count, 2, 'Found 2 holds' );
is( $hold_2->priority, 0, 'Next hold in line now has priority of 0' );
is( $hold_2->found, 'W', 'Next hold in line is now set to waiting' );
my $messages = Koha::Notice::Messages->search({
letter_code => 'HOLD_CHANGED',
borrowernumber => $patron_2->{borrowernumber}
} );
is( $messages->count, 1, 'Found message in the message queue with borrower 2 as the object' );
my $message = $messages->next;
is( $message->to_address, 'kyle@example.com', 'Message sent to correct email address' );
is( $message->from_address, $branch_1->branchemail, "Message is sent from library's email");
$hold_2->cancel({ autofill => 1 });
$holds = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } );
$hold_3 = $holds->next;
is( $holds->count, 1, 'Found 1 hold' );
is( $hold_3->priority, 0, 'Next hold in line now has priority of 0' );
is( $hold_3->found, 'W', 'Next hold in line is now set to waiting' );
$messages = Koha::Notice::Messages->search({
letter_code => 'HOLD_CHANGED',
borrowernumber => $patron_3->{borrowernumber}
});
is( $messages->count, 1, 'Found message with borrower 3 as the object' );
$message = $messages->next;
is( $message->to_address, 'kyle@example.com', 'Message sent to correct email address' );
is( $message->from_address, $branch_1->branchemail, "Message is sent from library's email");
};
subtest 'Test automatically canceled expired waiting holds to fill the next hold, with a transfer' => sub {
plan tests => 7;
my $item = $builder->build_sample_item({ library => $library_1 });
my $biblionumber = $item->biblionumber;
my $itemnumber = $item->itemnumber;
my $patron_1 = $builder->build( { source => 'Borrower' } );
my $patron_2 = $builder->build( { source => 'Borrower' } );
my $patron_3 = $builder->build( { source => 'Borrower' } );
# Add a hold on the item for each of our patrons
my $hold_1 = Koha::Hold->new(
{
priority => 0,
borrowernumber => $patron_1->{borrowernumber},
branchcode => $library_1,
biblionumber => $biblionumber,
itemnumber => $itemnumber,
found => 'W',
reservedate => '1900-01-01',
waitingdate => '1900-01-01',
expirationdate => '1900-01-01',
lowestPriority => 0,
suspend => 0,
}
)->store();
my $hold_2 = Koha::Hold->new(
{
priority => 1,
borrowernumber => $patron_2->{borrowernumber},
branchcode => $library_2,
biblionumber => $biblionumber,
itemnumber => $itemnumber,
reservedate => '1900-01-01',
expirationdate => '9999-01-01',
lowestPriority => 0,
suspend => 0,
}
)->store();
# Test CancelExpiredReserves
t::lib::Mocks::mock_preference( 'ExpireReservesMaxPickUpDelay', 1 );
t::lib::Mocks::mock_preference( 'ReservesMaxPickUpDelay', 1 );
t::lib::Mocks::mock_preference( 'ExpireReservesOnHolidays', 1 );
t::lib::Mocks::mock_preference( 'ExpireReservesAutoFill', 1 );
t::lib::Mocks::mock_preference( 'ExpireReservesAutoFillEmail', '' );
$hold_1->cancel({ autofill => 1 });
my @holds = Koha::Holds->search( { biblionumber => $biblionumber }, { order_by => 'priority' } )->as_list;
$hold_2 = $holds[0];
is( @holds, 1, 'Found 1 hold' );
is( $hold_2->priority, 0, 'Next hold in line now has priority of 0' );
is( $hold_2->found, 'T', 'Next hold in line is now set to in transit' );
is( $hold_2->branchcode, $library_2, "Next hold in line has correct branchcode" );
my $messages = Koha::Notice::Messages->search({
letter_code => 'HOLD_CHANGED',
borrowernumber => $patron_2->{borrowernumber}
});
is( $messages->count, 1, 'Message is generated in the message queue when generating transfer' );
my $message = $messages->next;
# Is the below correct? Email of changed hold is sent to the receiving library
# how does the sending library know to remove book from the holds shelf?
is( $message->to_address, $branch_2->branchreplyto, "Message is sent to the incoming email of the library with the next hold");
is( $message->from_address, $branch_2->branchemail, "Message is sent from library's email");
};
$schema->storage->txn_rollback;