Main Koha release repository
https://koha-community.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
398 lines
13 KiB
398 lines
13 KiB
#!/usr/bin/perl
|
|
|
|
# Copyright PTFS Europe 2016
|
|
#
|
|
# 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 t::lib::TestBuilder;
|
|
|
|
use Test::More tests => 6;
|
|
|
|
my $schema = Koha::Database->new->schema;
|
|
|
|
use_ok('Koha::StockRotationStages');
|
|
use_ok('Koha::StockRotationStage');
|
|
|
|
my $builder = t::lib::TestBuilder->new;
|
|
|
|
subtest 'Basic object tests' => sub {
|
|
plan tests => 5;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
my $library = $builder->build({ source => 'Branch' });
|
|
my $rota = $builder->build({ source => 'Stockrotationrota' });
|
|
my $stage = $builder->build({
|
|
source => 'Stockrotationstage',
|
|
value => {
|
|
branchcode_id => $library->{branchcode},
|
|
rota_id => $rota->{rota_id},
|
|
},
|
|
});
|
|
|
|
my $srstage = Koha::StockRotationStages->find($stage->{stage_id});
|
|
isa_ok(
|
|
$srstage,
|
|
'Koha::StockRotationStage',
|
|
"Correctly create and load a stock rotation stage."
|
|
);
|
|
|
|
# Relationship to library
|
|
isa_ok( $srstage->branchcode, 'Koha::Library', "Fetched related branch." );
|
|
is( $srstage->branchcode->branchcode, $library->{branchcode}, "Related branch OK." );
|
|
|
|
# Relationship to rota
|
|
isa_ok( $srstage->rota, 'Koha::StockRotationRota', "Fetched related rota." );
|
|
is( $srstage->rota->rota_id, $rota->{rota_id}, "Related rota OK." );
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
subtest 'DBIx::Class::Ordered tests' => sub {
|
|
plan tests => 33;
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
my $library = $builder->build({ source => 'Branch' });
|
|
my $rota = $builder->build({ source => 'Stockrotationrota' });
|
|
my $stagefirst = $builder->build({
|
|
source => 'Stockrotationstage',
|
|
value => { rota_id => $rota->{rota_id}, position => 1 }
|
|
});
|
|
my $stageprevious = $builder->build({
|
|
source => 'Stockrotationstage',
|
|
value => { rota_id => $rota->{rota_id}, position => 2 }
|
|
});
|
|
my $stage = $builder->build({
|
|
source => 'Stockrotationstage',
|
|
value => { rota_id => $rota->{rota_id}, position => 3 },
|
|
});
|
|
my $stagenext = $builder->build({
|
|
source => 'Stockrotationstage',
|
|
value => { rota_id => $rota->{rota_id}, position => 4 }
|
|
});
|
|
my $stagelast = $builder->build({
|
|
source => 'Stockrotationstage',
|
|
value => { rota_id => $rota->{rota_id}, position => 5 }
|
|
});
|
|
|
|
my $srstage = Koha::StockRotationStages->find($stage->{stage_id});
|
|
|
|
is($srstage->siblings->count, 4, "Siblings works.");
|
|
is($srstage->previous_siblings->count, 2, "Previous Siblings works.");
|
|
is($srstage->next_siblings->count, 2, "Next Siblings works.");
|
|
|
|
my $map = {
|
|
first_sibling => $stagefirst,
|
|
previous_sibling => $stageprevious,
|
|
next_sibling => $stagenext,
|
|
last_sibling => $stagelast,
|
|
};
|
|
# Test plain relations:
|
|
while ( my ( $srxsr, $check ) = each %{$map} ) {
|
|
my $sr = $srstage->$srxsr;
|
|
isa_ok($sr, 'Koha::StockRotationStage', "Fetched using '$srxsr'.");
|
|
is($sr->stage_id, $check->{stage_id}, "'$srxsr' data is correct.");
|
|
};
|
|
|
|
# Test mutators
|
|
## Move Previous
|
|
ok($srstage->move_previous, "Previous.");
|
|
is($srstage->previous_sibling->stage_id, $stagefirst->{stage_id}, "Previous, correct previous.");
|
|
is($srstage->next_sibling->stage_id, $stageprevious->{stage_id}, "Previous, correct next.");
|
|
## Move Next
|
|
ok($srstage->move_next, "Back to middle.");
|
|
is($srstage->previous_sibling->stage_id, $stageprevious->{stage_id}, "Middle, correct previous.");
|
|
is($srstage->next_sibling->stage_id, $stagenext->{stage_id}, "Middle, correct next.");
|
|
## Move First
|
|
ok($srstage->move_first, "First.");
|
|
is($srstage->previous_sibling, 0, "First, correct previous.");
|
|
is($srstage->next_sibling->stage_id, $stagefirst->{stage_id}, "First, correct next.");
|
|
## Move Last
|
|
ok($srstage->move_last, "Last.");
|
|
is($srstage->previous_sibling->stage_id, $stagelast->{stage_id}, "Last, correct previous.");
|
|
is($srstage->next_sibling, 0, "Last, correct next.");
|
|
## Move To
|
|
|
|
### Out of range moves.
|
|
is(
|
|
$srstage->move_to($srstage->siblings->count + 2),
|
|
0, "Move above count of stages."
|
|
);
|
|
is($srstage->move_to(0), 0, "Move to 0th position.");
|
|
is($srstage->move_to(-1), 0, "Move to negative position.");
|
|
|
|
### Move To
|
|
ok($srstage->move_to(3), "Move.");
|
|
is($srstage->previous_sibling->stage_id, $stageprevious->{stage_id}, "Move, correct previous.");
|
|
is($srstage->next_sibling->stage_id, $stagenext->{stage_id}, "Move, correct next.");
|
|
|
|
# Group manipulation
|
|
my $newrota = $builder->build({ source => 'Stockrotationrota' });
|
|
ok($srstage->move_to_group($newrota->{rota_id}), "Move to Group.");
|
|
is(Koha::StockRotationStages->find($srstage->stage_id)->rota_id, $newrota->{rota_id}, "Moved correctly.");
|
|
|
|
# Delete in ordered context
|
|
ok($srstage->delete, "Deleted OK.");
|
|
is(
|
|
Koha::StockRotationStages->find($stageprevious)->next_sibling->stage_id,
|
|
$stagenext->{stage_id},
|
|
"Delete, correctly re-ordered."
|
|
);
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
subtest 'Relationship to stockrotationitems' => sub {
|
|
plan tests => 2;
|
|
|
|
$schema->storage->txn_begin;
|
|
my $stage = $builder->build({ source => 'Stockrotationstage' });
|
|
|
|
$builder->build(
|
|
{
|
|
source => 'Stockrotationitem',
|
|
value => {
|
|
stage_id => $stage->{stage_id},
|
|
itemnumber_id => $builder->build_sample_item->itemnumber
|
|
},
|
|
}
|
|
);
|
|
$builder->build(
|
|
{
|
|
source => 'Stockrotationitem',
|
|
value => {
|
|
stage_id => $stage->{stage_id},
|
|
itemnumber_id => $builder->build_sample_item->itemnumber
|
|
},
|
|
}
|
|
);
|
|
$builder->build(
|
|
{
|
|
source => 'Stockrotationitem',
|
|
value => {
|
|
stage_id => $stage->{stage_id},
|
|
itemnumber_id => $builder->build_sample_item->itemnumber
|
|
},
|
|
}
|
|
);
|
|
|
|
my $srstage = Koha::StockRotationStages->find($stage->{stage_id});
|
|
my $sritems = $srstage->stockrotationitems;
|
|
is(
|
|
$sritems->count, 3,
|
|
'Correctly fetched stockrotationitems associated with this stage'
|
|
);
|
|
|
|
isa_ok(
|
|
$sritems->next, 'Koha::StockRotationItem',
|
|
"Relationship correctly creates Koha::Objects."
|
|
);
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
|
|
subtest 'Tests for investigate (singular)' => sub {
|
|
|
|
plan tests => 3;
|
|
|
|
# In this subtest series we will primarily be testing whether items end up
|
|
# in the correct 'branched' section of the stage-report. We don't care
|
|
# for item reasons here, as they are tested in StockRotationItems.
|
|
|
|
# We will run tests on first on an empty report (the base-case) and then
|
|
# on a populated report.
|
|
|
|
# We will need:
|
|
# - Libraries which will hold the Items
|
|
# - Rota Which containing the related stages
|
|
# + Stages on which we run investigate
|
|
# * Items on the stages
|
|
|
|
$schema->storage->txn_begin;
|
|
|
|
# Libraries
|
|
my $library1 = $builder->build({ source => 'Branch' });
|
|
my $library2 = $builder->build({ source => 'Branch' });
|
|
my $library3 = $builder->build({ source => 'Branch' });
|
|
|
|
my $stage1lib = $builder->build({ source => 'Branch' });
|
|
my $stage2lib = $builder->build({ source => 'Branch' });
|
|
my $stage3lib = $builder->build({ source => 'Branch' });
|
|
my $stage4lib = $builder->build({ source => 'Branch' });
|
|
|
|
my $libraries = [ $library1, $library2, $library3, $stage1lib, $stage2lib,
|
|
$stage3lib, $stage4lib ];
|
|
|
|
# Rota
|
|
my $rota = $builder->build({
|
|
source => 'Stockrotationrota',
|
|
value => { cyclical => 0 },
|
|
});
|
|
|
|
# Stages
|
|
my $stage1 = $builder->build({
|
|
source => 'Stockrotationstage',
|
|
value => {
|
|
rota_id => $rota->{rota_id},
|
|
branchcode_id => $stage1lib->{branchcode},
|
|
duration => 10,
|
|
position => 1,
|
|
},
|
|
});
|
|
my $stage2 = $builder->build({
|
|
source => 'Stockrotationstage',
|
|
value => {
|
|
rota_id => $rota->{rota_id},
|
|
branchcode_id => $stage2lib->{branchcode},
|
|
duration => 20,
|
|
position => 2,
|
|
},
|
|
});
|
|
my $stage3 = $builder->build({
|
|
source => 'Stockrotationstage',
|
|
value => {
|
|
rota_id => $rota->{rota_id},
|
|
branchcode_id => $stage3lib->{branchcode},
|
|
duration => 10,
|
|
position => 3,
|
|
},
|
|
});
|
|
my $stage4 = $builder->build({
|
|
source => 'Stockrotationstage',
|
|
value => {
|
|
rota_id => $rota->{rota_id},
|
|
branchcode_id => $stage4lib->{branchcode},
|
|
duration => 20,
|
|
position => 4,
|
|
},
|
|
});
|
|
|
|
# Test on an empty report.
|
|
my $spec = {
|
|
$library1->{branchcode} => 1,
|
|
$library2->{branchcode} => 1,
|
|
$library3->{branchcode} => 1,
|
|
$stage1lib->{branchcode} => 2,
|
|
$stage2lib->{branchcode} => 1,
|
|
$stage3lib->{branchcode} => 3,
|
|
$stage4lib->{branchcode} => 4
|
|
};
|
|
while ( my ( $code, $count ) = each %{$spec} ) {
|
|
my $cnt = 0;
|
|
while ( $cnt < $count ) {
|
|
my $item = $builder->build(
|
|
{
|
|
source => 'Stockrotationitem',
|
|
value => {
|
|
stage_id => $stage1->{stage_id},
|
|
indemand => 0,
|
|
fresh => 1,
|
|
itemnumber_id => $builder->build_sample_item->itemnumber
|
|
}
|
|
}
|
|
);
|
|
my $dbitem = Koha::StockRotationItems->find($item);
|
|
$dbitem->itemnumber->homebranch($code)
|
|
->holdingbranch($code)->store;
|
|
$cnt++;
|
|
}
|
|
}
|
|
my $report = Koha::StockRotationStages
|
|
->find($stage1->{stage_id})->investigate;
|
|
my $results = [];
|
|
foreach my $lib ( @{$libraries} ) {
|
|
my $items = $report->{branched}->{$lib->{branchcode}}->{items} || [];
|
|
push @{$results},
|
|
scalar @{$items};
|
|
}
|
|
|
|
# Items assigned to stag1lib -> log, hence $results[4] = 0;
|
|
is_deeply( $results, [ 1, 1, 1, 2, 1, 3, 4 ], "Empty report test 1.");
|
|
|
|
# Now we test by adding the next stage's items to the same report.
|
|
$spec = {
|
|
$library1->{branchcode} => 3,
|
|
$library2->{branchcode} => 2,
|
|
$library3->{branchcode} => 1,
|
|
$stage1lib->{branchcode} => 4,
|
|
$stage2lib->{branchcode} => 2,
|
|
$stage3lib->{branchcode} => 0,
|
|
$stage4lib->{branchcode} => 3
|
|
};
|
|
while ( my ( $code, $count ) = each %{$spec} ) {
|
|
my $cnt = 0;
|
|
while ( $cnt < $count ) {
|
|
my $item = $builder->build(
|
|
{
|
|
source => 'Stockrotationitem',
|
|
value => {
|
|
stage_id => $stage2->{stage_id},
|
|
indemand => 0,
|
|
fresh => 1,
|
|
itemnumber_id => $builder->build_sample_item->itemnumber
|
|
}
|
|
}
|
|
);
|
|
my $dbitem = Koha::StockRotationItems->find($item);
|
|
$dbitem->itemnumber->homebranch($code)
|
|
->holdingbranch($code)->store;
|
|
$cnt++;
|
|
}
|
|
}
|
|
|
|
$report = Koha::StockRotationStages
|
|
->find($stage2->{stage_id})->investigate($report);
|
|
$results = [];
|
|
foreach my $lib ( @{$libraries} ) {
|
|
my $items = $report->{branched}->{$lib->{branchcode}}->{items} || [];
|
|
push @{$results},
|
|
scalar @{$items};
|
|
}
|
|
is_deeply( $results, [ 4, 3, 2, 6, 3, 3, 7 ], "full report test.");
|
|
|
|
# Carry out db updates
|
|
foreach my $item (@{$report->{items}}) {
|
|
my $reason = $item->{reason};
|
|
if ( $reason eq 'repatriation' ) {
|
|
$item->{object}->repatriate;
|
|
} elsif ( grep { $reason eq $_ }
|
|
qw/in-demand advancement initiation/ ) {
|
|
$item->{object}->advance;
|
|
}
|
|
}
|
|
|
|
$report = Koha::StockRotationStages
|
|
->find($stage1->{stage_id})->investigate;
|
|
$results = [];
|
|
foreach my $lib ( @{$libraries} ) {
|
|
my $items = $report->{branched}->{$lib->{branchcode}}->{items} || [];
|
|
push @{$results},
|
|
scalar @{$items};
|
|
}
|
|
# All items have been 'initiated', which means they are either happily in
|
|
# transit or happily at the library they are supposed to be. Either way
|
|
# they will register as 'not-ready' in the stock rotation report.
|
|
is_deeply( $results, [ 0, 0, 0, 0, 0, 0, 0 ], "All items now in logs.");
|
|
|
|
$schema->storage->txn_rollback;
|
|
};
|
|
|
|
1;
|
|
|