3 # Copyright PTFS Europe 2016
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
23 use t
::lib
::TestBuilder
;
25 use Test
::More tests
=> 6;
27 my $schema = Koha
::Database
->new->schema;
29 use_ok
('Koha::StockRotationStages');
30 use_ok
('Koha::StockRotationStage');
32 my $builder = t
::lib
::TestBuilder
->new;
34 subtest
'Basic object tests' => sub {
37 $schema->storage->txn_begin;
39 my $library = $builder->build({ source
=> 'Branch' });
40 my $rota = $builder->build({ source
=> 'Stockrotationrota' });
41 my $stage = $builder->build({
42 source
=> 'Stockrotationstage',
44 branchcode_id
=> $library->{branchcode
},
45 rota_id
=> $rota->{rota_id
},
49 my $srstage = Koha
::StockRotationStages
->find($stage->{stage_id
});
52 'Koha::StockRotationStage',
53 "Correctly create and load a stock rotation stage."
56 # Relationship to library
57 isa_ok
( $srstage->branchcode, 'Koha::Library', "Fetched related branch." );
58 is
( $srstage->branchcode->branchcode, $library->{branchcode
}, "Related branch OK." );
60 # Relationship to rota
61 isa_ok
( $srstage->rota, 'Koha::StockRotationRota', "Fetched related rota." );
62 is
( $srstage->rota->rota_id, $rota->{rota_id
}, "Related rota OK." );
64 $schema->storage->txn_rollback;
67 subtest
'DBIx::Class::Ordered tests' => sub {
70 $schema->storage->txn_begin;
72 my $library = $builder->build({ source
=> 'Branch' });
73 my $rota = $builder->build({ source
=> 'Stockrotationrota' });
74 my $stagefirst = $builder->build({
75 source
=> 'Stockrotationstage',
76 value
=> { rota_id
=> $rota->{rota_id
}, position
=> 1 }
78 my $stageprevious = $builder->build({
79 source
=> 'Stockrotationstage',
80 value
=> { rota_id
=> $rota->{rota_id
}, position
=> 2 }
82 my $stage = $builder->build({
83 source
=> 'Stockrotationstage',
84 value
=> { rota_id
=> $rota->{rota_id
}, position
=> 3 },
86 my $stagenext = $builder->build({
87 source
=> 'Stockrotationstage',
88 value
=> { rota_id
=> $rota->{rota_id
}, position
=> 4 }
90 my $stagelast = $builder->build({
91 source
=> 'Stockrotationstage',
92 value
=> { rota_id
=> $rota->{rota_id
}, position
=> 5 }
95 my $srstage = Koha
::StockRotationStages
->find($stage->{stage_id
});
97 is
($srstage->siblings->count, 4, "Siblings works.");
98 is
($srstage->previous_siblings->count, 2, "Previous Siblings works.");
99 is
($srstage->next_siblings->count, 2, "Next Siblings works.");
102 first_sibling
=> $stagefirst,
103 previous_sibling
=> $stageprevious,
104 next_sibling
=> $stagenext,
105 last_sibling
=> $stagelast,
107 # Test plain relations:
108 while ( my ( $srxsr, $check ) = each %{$map} ) {
109 my $sr = $srstage->$srxsr;
110 isa_ok
($sr, 'Koha::StockRotationStage', "Fetched using '$srxsr'.");
111 is
($sr->stage_id, $check->{stage_id
}, "'$srxsr' data is correct.");
116 ok
($srstage->move_previous, "Previous.");
117 is
($srstage->previous_sibling->stage_id, $stagefirst->{stage_id
}, "Previous, correct previous.");
118 is
($srstage->next_sibling->stage_id, $stageprevious->{stage_id
}, "Previous, correct next.");
120 ok
($srstage->move_next, "Back to middle.");
121 is
($srstage->previous_sibling->stage_id, $stageprevious->{stage_id
}, "Middle, correct previous.");
122 is
($srstage->next_sibling->stage_id, $stagenext->{stage_id
}, "Middle, correct next.");
124 ok
($srstage->move_first, "First.");
125 is
($srstage->previous_sibling, 0, "First, correct previous.");
126 is
($srstage->next_sibling->stage_id, $stagefirst->{stage_id
}, "First, correct next.");
128 ok
($srstage->move_last, "Last.");
129 is
($srstage->previous_sibling->stage_id, $stagelast->{stage_id
}, "Last, correct previous.");
130 is
($srstage->next_sibling, 0, "Last, correct next.");
133 ### Out of range moves.
135 $srstage->move_to($srstage->siblings->count + 2),
136 0, "Move above count of stages."
138 is
($srstage->move_to(0), 0, "Move to 0th position.");
139 is
($srstage->move_to(-1), 0, "Move to negative position.");
142 ok
($srstage->move_to(3), "Move.");
143 is
($srstage->previous_sibling->stage_id, $stageprevious->{stage_id
}, "Move, correct previous.");
144 is
($srstage->next_sibling->stage_id, $stagenext->{stage_id
}, "Move, correct next.");
147 my $newrota = $builder->build({ source
=> 'Stockrotationrota' });
148 ok
($srstage->move_to_group($newrota->{rota_id
}), "Move to Group.");
149 is
(Koha
::StockRotationStages
->find($srstage->stage_id)->rota_id, $newrota->{rota_id
}, "Moved correctly.");
151 # Delete in ordered context
152 ok
($srstage->delete, "Deleted OK.");
154 Koha
::StockRotationStages
->find($stageprevious)->next_sibling->stage_id,
155 $stagenext->{stage_id
},
156 "Delete, correctly re-ordered."
159 $schema->storage->txn_rollback;
162 subtest
'Relationship to stockrotationitems' => sub {
165 $schema->storage->txn_begin;
166 my $stage = $builder->build({ source
=> 'Stockrotationstage' });
170 source
=> 'Stockrotationitem',
172 stage_id
=> $stage->{stage_id
},
173 itemnumber_id
=> $builder->build_sample_item->itemnumber
179 source
=> 'Stockrotationitem',
181 stage_id
=> $stage->{stage_id
},
182 itemnumber_id
=> $builder->build_sample_item->itemnumber
188 source
=> 'Stockrotationitem',
190 stage_id
=> $stage->{stage_id
},
191 itemnumber_id
=> $builder->build_sample_item->itemnumber
196 my $srstage = Koha
::StockRotationStages
->find($stage->{stage_id
});
197 my $sritems = $srstage->stockrotationitems;
200 'Correctly fetched stockrotationitems associated with this stage'
204 $sritems->next, 'Koha::StockRotationItem',
205 "Relationship correctly creates Koha::Objects."
208 $schema->storage->txn_rollback;
212 subtest
'Tests for investigate (singular)' => sub {
216 # In this subtest series we will primarily be testing whether items end up
217 # in the correct 'branched' section of the stage-report. We don't care
218 # for item reasons here, as they are tested in StockRotationItems.
220 # We will run tests on first on an empty report (the base-case) and then
221 # on a populated report.
224 # - Libraries which will hold the Items
225 # - Rota Which containing the related stages
226 # + Stages on which we run investigate
227 # * Items on the stages
229 $schema->storage->txn_begin;
232 my $library1 = $builder->build({ source
=> 'Branch' });
233 my $library2 = $builder->build({ source
=> 'Branch' });
234 my $library3 = $builder->build({ source
=> 'Branch' });
236 my $stage1lib = $builder->build({ source
=> 'Branch' });
237 my $stage2lib = $builder->build({ source
=> 'Branch' });
238 my $stage3lib = $builder->build({ source
=> 'Branch' });
239 my $stage4lib = $builder->build({ source
=> 'Branch' });
241 my $libraries = [ $library1, $library2, $library3, $stage1lib, $stage2lib,
242 $stage3lib, $stage4lib ];
245 my $rota = $builder->build({
246 source
=> 'Stockrotationrota',
247 value
=> { cyclical
=> 0 },
251 my $stage1 = $builder->build({
252 source
=> 'Stockrotationstage',
254 rota_id
=> $rota->{rota_id
},
255 branchcode_id
=> $stage1lib->{branchcode
},
260 my $stage2 = $builder->build({
261 source
=> 'Stockrotationstage',
263 rota_id
=> $rota->{rota_id
},
264 branchcode_id
=> $stage2lib->{branchcode
},
269 my $stage3 = $builder->build({
270 source
=> 'Stockrotationstage',
272 rota_id
=> $rota->{rota_id
},
273 branchcode_id
=> $stage3lib->{branchcode
},
278 my $stage4 = $builder->build({
279 source
=> 'Stockrotationstage',
281 rota_id
=> $rota->{rota_id
},
282 branchcode_id
=> $stage4lib->{branchcode
},
288 # Test on an empty report.
290 $library1->{branchcode
} => 1,
291 $library2->{branchcode
} => 1,
292 $library3->{branchcode
} => 1,
293 $stage1lib->{branchcode
} => 2,
294 $stage2lib->{branchcode
} => 1,
295 $stage3lib->{branchcode
} => 3,
296 $stage4lib->{branchcode
} => 4
298 while ( my ( $code, $count ) = each %{$spec} ) {
300 while ( $cnt < $count ) {
301 my $item = $builder->build(
303 source
=> 'Stockrotationitem',
305 stage_id
=> $stage1->{stage_id
},
308 itemnumber_id
=> $builder->build_sample_item->itemnumber
312 my $dbitem = Koha
::StockRotationItems
->find($item);
313 $dbitem->itemnumber->homebranch($code)
314 ->holdingbranch($code)->store;
318 my $report = Koha
::StockRotationStages
319 ->find($stage1->{stage_id
})->investigate;
321 foreach my $lib ( @
{$libraries} ) {
322 my $items = $report->{branched
}->{$lib->{branchcode
}}->{items
} || [];
327 # Items assigned to stag1lib -> log, hence $results[4] = 0;
328 is_deeply
( $results, [ 1, 1, 1, 2, 1, 3, 4 ], "Empty report test 1.");
330 # Now we test by adding the next stage's items to the same report.
332 $library1->{branchcode
} => 3,
333 $library2->{branchcode
} => 2,
334 $library3->{branchcode
} => 1,
335 $stage1lib->{branchcode
} => 4,
336 $stage2lib->{branchcode
} => 2,
337 $stage3lib->{branchcode
} => 0,
338 $stage4lib->{branchcode
} => 3
340 while ( my ( $code, $count ) = each %{$spec} ) {
342 while ( $cnt < $count ) {
343 my $item = $builder->build(
345 source
=> 'Stockrotationitem',
347 stage_id
=> $stage2->{stage_id
},
350 itemnumber_id
=> $builder->build_sample_item->itemnumber
354 my $dbitem = Koha
::StockRotationItems
->find($item);
355 $dbitem->itemnumber->homebranch($code)
356 ->holdingbranch($code)->store;
361 $report = Koha
::StockRotationStages
362 ->find($stage2->{stage_id
})->investigate($report);
364 foreach my $lib ( @
{$libraries} ) {
365 my $items = $report->{branched
}->{$lib->{branchcode
}}->{items
} || [];
369 is_deeply
( $results, [ 4, 3, 2, 6, 3, 3, 7 ], "full report test.");
371 # Carry out db updates
372 foreach my $item (@
{$report->{items
}}) {
373 my $reason = $item->{reason
};
374 if ( $reason eq 'repatriation' ) {
375 $item->{object
}->repatriate;
376 } elsif ( grep { $reason eq $_ }
377 qw
/in-demand advancement initiation/ ) {
378 $item->{object
}->advance;
382 $report = Koha
::StockRotationStages
383 ->find($stage1->{stage_id
})->investigate;
385 foreach my $lib ( @
{$libraries} ) {
386 my $items = $report->{branched
}->{$lib->{branchcode
}}->{items
} || [];
390 # All items have been 'initiated', which means they are either happily in
391 # transit or happily at the library they are supposed to be. Either way
392 # they will register as 'not-ready' in the stock rotation report.
393 is_deeply
( $results, [ 0, 0, 0, 0, 0, 0, 0 ], "All items now in logs.");
395 $schema->storage->txn_rollback;