Koha-clms/t/db_dependent/Koha/Item/Transfer.t

314 lines
9.9 KiB
Perl
Executable File

#!/usr/bin/perl
# Copyright 2020 Koha Development team
#
# This file is part of Koha
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
use Modern::Perl;
use Koha::Database;
use Koha::DateUtils qw( dt_from_string );
use t::lib::TestBuilder;
use Test::More tests => 7;
use Test::Exception;
my $schema = Koha::Database->new->schema;
my $builder = t::lib::TestBuilder->new;
subtest 'item relation tests' => sub {
plan tests => 2;
$schema->storage->txn_begin;
my $item = $builder->build_sample_item();
my $transfer = $builder->build_object(
{
class => 'Koha::Item::Transfers',
value => {
itemnumber => $item->itemnumber,
}
}
);
my $transfer_item = $transfer->item;
is( ref( $transfer_item ), 'Koha::Item', 'Koha::Item::Transfer->item should return a Koha::Item' );
is( $transfer_item->itemnumber, $item->itemnumber, 'Koha::Item::Transfer->item should return the correct item' );
$schema->storage->txn_rollback;
};
subtest 'from_library relation tests' => sub {
plan tests => 2;
$schema->storage->txn_begin;
my $library = $builder->build_object( { class => 'Koha::Libraries' } );
my $transfer = $builder->build_object(
{
class => 'Koha::Item::Transfers',
value => {
frombranch => $library->branchcode,
}
}
);
my $from_library = $transfer->from_library;
is( ref( $from_library ), 'Koha::Library', 'Koha::Item::Transfer->from_library should return a Koha::Library' );
is( $from_library->branchcode, $library->branchcode, 'Koha::Item::Transfer->from_library should return the correct library' );
$schema->storage->txn_rollback;
};
subtest 'to_library relation tests' => sub {
plan tests => 2;
$schema->storage->txn_begin;
my $library = $builder->build_object( { class => 'Koha::Libraries' } );
my $transfer = $builder->build_object(
{
class => 'Koha::Item::Transfers',
value => {
tobranch => $library->branchcode,
}
}
);
my $to_library = $transfer->to_library;
is( ref( $to_library ), 'Koha::Library', 'Koha::Item::Transfer->to_library should return a Koha::Library' );
is( $to_library->branchcode, $library->branchcode, 'Koha::Item::Transfer->to_library should return the correct library' );
$schema->storage->txn_rollback;
};
subtest 'transit tests' => sub {
plan tests => 7;
$schema->storage->txn_begin;
my $library1 = $builder->build_object( { class => 'Koha::Libraries' } );
my $library2 = $builder->build_object( { class => 'Koha::Libraries' } );
my $item = $builder->build_sample_item(
{
homebranch => $library1->branchcode,
holdingbranch => $library2->branchcode,
datelastseen => undef
}
);
my $transfer = $builder->build_object(
{
class => 'Koha::Item::Transfers',
value => {
itemnumber => $item->itemnumber,
frombranch => $library2->branchcode,
tobranch => $library1->branchcode,
reason => 'Manual'
}
}
);
is( ref($transfer), 'Koha::Item::Transfer', 'Mock transfer added' );
# Item checked out should result in failure
my $checkout = $builder->build_object(
{
class => 'Koha::Checkouts',
value => {
itemnumber => $item->itemnumber
}
}
);
is( ref($checkout), 'Koha::Checkout', 'Mock checkout added' );
throws_ok { $transfer->transit() }
'Koha::Exceptions::Item::Transfer::OnLoan',
'Exception thrown if item is checked out';
$checkout->delete;
# CartToShelf test
$item->set({ location => 'CART', permanent_location => 'TEST' })->store();
is ( $item->location, 'CART', 'Item location set to CART');
$transfer->discard_changes;
$transfer->transit();
$item->discard_changes;
is ( $item->location, 'TEST', 'Item location correctly restored to match permanent location');
# Transit state set
ok( $transfer->datesent, 'Transit set the datesent for the transfer' );
# Last seen
ok ( $item->datelastseen, 'Transit set item datelastseen date');
$schema->storage->txn_rollback;
};
subtest 'receive tests' => sub {
plan tests => 5;
$schema->storage->txn_begin;
my $library1 = $builder->build_object( { class => 'Koha::Libraries' } );
my $library2 = $builder->build_object( { class => 'Koha::Libraries' } );
my $item = $builder->build_sample_item(
{
homebranch => $library1->branchcode,
holdingbranch => $library2->branchcode,
datelastseen => undef
}
);
my $transfer = $builder->build_object(
{
class => 'Koha::Item::Transfers',
value => {
itemnumber => $item->itemnumber,
frombranch => $library2->branchcode,
tobranch => $library1->branchcode,
datearrived => undef,
reason => 'Manual'
}
}
);
is( ref($transfer), 'Koha::Item::Transfer', 'Mock transfer added' );
# Item checked out should result in failure
my $checkout = $builder->build_object(
{
class => 'Koha::Checkouts',
value => {
itemnumber => $item->itemnumber
}
}
);
is( ref($checkout), 'Koha::Checkout', 'Mock checkout added' );
throws_ok { $transfer->receive() }
'Koha::Exceptions::Item::Transfer::OnLoan',
'Exception thrown if item is checked out';
$checkout->delete;
# Transit state set
$transfer->discard_changes;
$transfer->receive();
ok( $transfer->datearrived, 'Receipt set the datearrived for the transfer' );
# Last seen
ok( $item->datelastseen, 'Receipt set item datelastseen date' );
$schema->storage->txn_rollback;
};
subtest 'in_transit tests' => sub {
plan tests => 4;
$schema->storage->txn_begin;
my $library_from = $builder->build_object( { class => 'Koha::Libraries' } );
my $library_to = $builder->build_object( { class => 'Koha::Libraries' } );
my $item = $builder->build_sample_item(
{
homebranch => $library_to->branchcode,
holdingbranch => $library_from->branchcode,
}
);
my $transfer = Koha::Item::Transfer->new(
{
itemnumber => $item->itemnumber,
frombranch => $library_from->branchcode,
tobranch => $library_to->branchcode,
daterequested => dt_from_string,
}
)->store;
ok( !$transfer->in_transit, 'in_transit returns false when only daterequested is defined' );
$transfer->datesent(dt_from_string)->store;
ok( $transfer->in_transit, 'in_transit returns true when datesent is defined');
$transfer->datearrived(dt_from_string)->store;
ok( !$transfer->in_transit, 'in_transit returns false when datearrived is defined');
$transfer->set( { datearrived => undef, datecancelled => dt_from_string } )->store;
ok( !$transfer->in_transit, 'in_transit returns false when datecancelled is defined');
$schema->storage->txn_rollback;
};
subtest 'cancel tests' => sub {
plan tests => 7;
$schema->storage->txn_begin;
my $library1 = $builder->build_object( { class => 'Koha::Libraries' } );
my $library2 = $builder->build_object( { class => 'Koha::Libraries' } );
my $item = $builder->build_sample_item(
{
homebranch => $library1->branchcode,
holdingbranch => $library2->branchcode,
datelastseen => undef
}
);
my $cancellation_reason = 'Manual';
my $transfer = $builder->build_object(
{
class => 'Koha::Item::Transfers',
value => {
itemnumber => $item->itemnumber,
frombranch => $library2->branchcode,
tobranch => $library1->branchcode,
datesent => \'NOW()',
datearrived => undef,
datecancelled => undef,
reason => 'Manual',
cancellation_reason => undef
}
}
);
is( ref($transfer), 'Koha::Item::Transfer', 'Mock transfer added' );
# Missing mandatory parameter
throws_ok { $transfer->cancel() } 'Koha::Exceptions::MissingParameter',
'Exception thrown if a reason is not passed to cancel';
# Item in transit should result in failure
throws_ok { $transfer->cancel({ reason => $cancellation_reason }) }
'Koha::Exceptions::Item::Transfer::InTransit',
'Exception thrown if item is in transit';
$transfer->cancel({ reason => $cancellation_reason, force => 1});
ok( $transfer->datecancelled, 'Forced cancellation, cancellation date set' );
is( $transfer->cancellation_reason, 'Manual', 'Forced cancellation, cancellation reason is set');
$transfer->datecancelled(undef);
$transfer->cancellation_reason(undef);
$transfer->datesent(undef);
# Transit state unset
$transfer->store()->discard_changes;
$transfer->cancel({ reason => $cancellation_reason });
ok( $transfer->datecancelled, 'Cancellation date set upon call to cancel' );
is( $transfer->cancellation_reason, 'Manual', 'Cancellation reason is set');
$schema->storage->txn_rollback;
};