Koha/t/db_dependent/Circulation/maxsuspensiondays.t
David Gustafsson f726558510
Bug 32496: Reduce unnecessary unblessings of objects in Circulation.pm
Refactor the most performance critical subroutines in Circulation.pm
to take objects instead of unblessed ones to reduce unnecessary
unblessings and generally clean up the code.

To test:

1) Ensure the following tests all pass:
  t/db_dependent/Circulation.t
  t/db_dependent/Circulation/CalcDateDue.t
  t/db_dependent/Circulation/CheckIfIssuedToPatron.t
  t/db_dependent/Circulation/GetPendingOnSiteCheckouts.t
  t/db_dependent/Circulation/GetTopIssues.t
  t/db_dependent/Circulation/IsItemIssued.t
  t/db_dependent/Circulation/MarkIssueReturned.t
  t/db_dependent/Circulation/ReturnClaims.t
  t/db_dependent/Circulation/Returns.t
  t/db_dependent/Circulation/SwitchOnSiteCheckouts.t
  t/db_dependent/Circulation/TooMany.t
  t/db_dependent/Circulation/dateexpiry.t
  t/db_dependent/Circulation/issue.t
  t/db_dependent/Circulation/maxsuspensiondays.t
  t/db_dependent/Circulation/transferbook.t
  t/db_dependent/Circulation_holdsqueue.t
  t/db_dependent/DecreaseLoanHighHolds.t
  t/db_dependent/Holds/DisallowHoldIfItemsAvailable.t
  t/db_dependent/Holds/RevertWaitingStatus.t
  t/db_dependent/ILSDI_Services.t
  t/db_dependent/Illrequests.t
  t/db_dependent/Koha/Account/Line.t
  t/db_dependent/Koha/Biblio.t
  t/db_dependent/Koha/Items.t
  t/db_dependent/Koha/Object.t
  t/db_dependent/Koha/Patrons.t
  t/db_dependent/Koha/Pseudonymization.t
  t/db_dependent/Koha/Template/Plugin/CirculationRules.t
  t/db_dependent/Letters/TemplateToolkit.t
  t/db_dependent/Members/GetAllIssues.t
  t/db_dependent/Members/IssueSlip.t
  t/db_dependent/Patron/Borrower_Discharge.t
  t/db_dependent/Patron/Borrower_PrevCheckout.t
  t/db_dependent/SIP/ILS.t
  t/db_dependent/Holds.t
  t/db_dependent/Holds/LocalHoldsPriority.t
  t/db_dependent/Holds/HoldFulfillmentPolicy.t
  t/db_dependent/Holds/HoldItemtypeLimit.t
  t/db_dependent/Reserves/GetReserveFee.t
  t/db_dependent/api/v1/return_claims.t
  t/db_dependent/api/v1/biblios.t
  t/db_dependent/api/v1/checkouts.t
  t/db_dependent/Reserves.t
  t/db_dependent/HoldsQueue.t
  t/db_dependent/selenium/regressions.t
  t/db_dependent/Koha/Plugins/Circulation_hooks.t
  t/db_dependent/Koha/Plugins/Recall_hooks.t
  t/db_dependent/Koha/Recalls.t
  t/db_dependent/Koha/Recall.t
  t/db_dependent/Circulation/_CalculateAndUpdateFine.t

Sponsored-by: Gothenburg University Library

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
2023-09-22 10:52:39 -03:00

162 lines
5 KiB
Perl
Executable file

use Modern::Perl;
use Test::More tests => 4;
use MARC::Record;
use MARC::Field;
use C4::Context;
use C4::Circulation qw( AddIssue AddReturn );
use C4::Biblio qw( AddBiblio );
use Koha::Database;
use Koha::DateUtils qw( dt_from_string output_pref );
use Koha::Patron::Debarments qw( DelDebarment );
use Koha::Patrons;
use t::lib::TestBuilder;
use t::lib::Mocks;
my $schema = Koha::Database->schema;
$schema->storage->txn_begin;
my $builder = t::lib::TestBuilder->new;
my $dbh = C4::Context->dbh;
my $branchcode = $builder->build({ source => 'Branch' })->{branchcode};
my $itemtype = $builder->build({ source => 'Itemtype' })->{itemtype};
my $patron_category = $builder->build({ source => 'Category' });
t::lib::Mocks::mock_userenv({ branchcode => $branchcode });
# Test without maxsuspensiondays set
Koha::CirculationRules->search->delete;
Koha::CirculationRules->set_rules(
{
categorycode => undef,
itemtype => undef,
branchcode => undef,
rules => {
firstremind => 0,
finedays => 2,
lengthunit => 'days',
suspension_chargeperiod => 1,
}
}
);
my $patron = Koha::Patron->new({
firstname => 'my firstname',
surname => 'my surname',
categorycode => $patron_category->{categorycode},
branchcode => $branchcode,
})->store;
my $record = MARC::Record->new();
$record->append_fields(
MARC::Field->new('100', ' ', ' ', a => 'My author'),
MARC::Field->new('245', ' ', ' ', a => 'My title'),
);
my $barcode = 'bc_maxsuspensiondays';
my ($biblionumber, $biblioitemnumber) = AddBiblio($record, '');
my $itemnumber = Koha::Item->new({
biblionumber => $biblionumber,
homebranch => $branchcode,
holdingbranch => $branchcode,
barcode => $barcode,
itype => $itemtype
})->store->itemnumber;
# clear any holidays to avoid throwing off the suspension day
# calculations
$dbh->do('DELETE FROM special_holidays');
$dbh->do('DELETE FROM repeatable_holidays');
my $daysago20 = dt_from_string->add_duration(DateTime::Duration->new(days => -20));
my $daysafter40 = dt_from_string->add_duration(DateTime::Duration->new(days => 40));
AddIssue( $patron, $barcode, $daysago20 );
AddReturn( $barcode, $branchcode );
my $debarments = $patron->restrictions;
my $THE_debarment = $debarments->next;
is(
$THE_debarment->expiration,
output_pref({ dt => $daysafter40, dateformat => 'iso', dateonly => 1 }),
'calculate suspension with no maximum set'
);
DelDebarment( $THE_debarment->borrower_debarment_id );
# Test with maxsuspensiondays = 10 days
Koha::CirculationRules->set_rules(
{
categorycode => undef,
itemtype => undef,
branchcode => undef,
rules => {
maxsuspensiondays => 10,
}
}
);
my $daysafter10 = dt_from_string->add_duration(DateTime::Duration->new(days => 10));
AddIssue( $patron, $barcode, $daysago20 );
AddReturn( $barcode, $branchcode );
$debarments = $patron->restrictions;
$THE_debarment = $debarments->next;
is(
$THE_debarment->expiration,
output_pref({ dt => $daysafter10, dateformat => 'iso', dateonly => 1 }),
'calculate suspension with a maximum set'
);
DelDebarment( $THE_debarment->borrower_debarment_id );
subtest "suspension_chargeperiod" => sub {
Koha::CirculationRules->set_rules(
{
categorycode => undef,
itemtype => undef,
branchcode => undef,
rules => {
firstremind => 0,
finedays => 7,
lengthunit => 'days',
suspension_chargeperiod => 15,
maxsuspensiondays => 333,
}
}
);
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
my $item = $builder->build_sample_item;
my $last_year = dt_from_string->clone->subtract( years => 1 );
my $today = dt_from_string;
my $new_debar_dt = C4::Circulation::_calculate_new_debar_dt( $patron, $item, $last_year, $today );
is( $new_debar_dt->truncate( to => 'day' ),
$today->clone->add( days => 365 / 15 * 7 )->truncate( to => 'day' ) );
};
subtest "maxsuspensiondays" => sub {
Koha::CirculationRules->set_rules(
{
categorycode => undef,
itemtype => undef,
branchcode => undef,
rules => {
firstremind => 0,
finedays => 15,
lengthunit => 'days',
suspension_chargeperiod => 7,
maxsuspensiondays => 333,
}
}
);
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
my $item = $builder->build_sample_item;
my $last_year = dt_from_string->clone->subtract( years => 1 );
my $today = dt_from_string;
my $new_debar_dt = C4::Circulation::_calculate_new_debar_dt( $patron, $item, $last_year, $today );
is( $new_debar_dt->truncate( to => 'day' ),
$today->clone->add( days => 333 )->truncate( to => 'day' ) );
};
$schema->storage->txn_rollback;