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' });
169 source
=> 'Stockrotationitem',
170 value
=> { stage_id
=> $stage->{stage_id
} },
173 source
=> 'Stockrotationitem',
174 value
=> { stage_id
=> $stage->{stage_id
} },
177 source
=> 'Stockrotationitem',
178 value
=> { stage_id
=> $stage->{stage_id
} },
181 my $srstage = Koha
::StockRotationStages
->find($stage->{stage_id
});
182 my $sritems = $srstage->stockrotationitems;
185 'Correctly fetched stockrotationitems associated with this stage'
189 $sritems->next, 'Koha::StockRotationItem',
190 "Relationship correctly creates Koha::Objects."
193 $schema->storage->txn_rollback;
197 subtest
'Tests for investigate (singular)' => sub {
201 # In this subtest series we will primarily be testing whether items end up
202 # in the correct 'branched' section of the stage-report. We don't care
203 # for item reasons here, as they are tested in StockRotationItems.
205 # We will run tests on first on an empty report (the base-case) and then
206 # on a populated report.
209 # - Libraries which will hold the Items
210 # - Rota Which containing the related stages
211 # + Stages on which we run investigate
212 # * Items on the stages
214 $schema->storage->txn_begin;
217 my $library1 = $builder->build({ source
=> 'Branch' });
218 my $library2 = $builder->build({ source
=> 'Branch' });
219 my $library3 = $builder->build({ source
=> 'Branch' });
221 my $stage1lib = $builder->build({ source
=> 'Branch' });
222 my $stage2lib = $builder->build({ source
=> 'Branch' });
223 my $stage3lib = $builder->build({ source
=> 'Branch' });
224 my $stage4lib = $builder->build({ source
=> 'Branch' });
226 my $libraries = [ $library1, $library2, $library3, $stage1lib, $stage2lib,
227 $stage3lib, $stage4lib ];
230 my $rota = $builder->build({
231 source
=> 'Stockrotationrota',
232 value
=> { cyclical
=> 0 },
236 my $stage1 = $builder->build({
237 source
=> 'Stockrotationstage',
239 rota_id
=> $rota->{rota_id
},
240 branchcode_id
=> $stage1lib->{branchcode
},
245 my $stage2 = $builder->build({
246 source
=> 'Stockrotationstage',
248 rota_id
=> $rota->{rota_id
},
249 branchcode_id
=> $stage2lib->{branchcode
},
254 my $stage3 = $builder->build({
255 source
=> 'Stockrotationstage',
257 rota_id
=> $rota->{rota_id
},
258 branchcode_id
=> $stage3lib->{branchcode
},
263 my $stage4 = $builder->build({
264 source
=> 'Stockrotationstage',
266 rota_id
=> $rota->{rota_id
},
267 branchcode_id
=> $stage4lib->{branchcode
},
273 # Test on an empty report.
275 $library1->{branchcode
} => 1,
276 $library2->{branchcode
} => 1,
277 $library3->{branchcode
} => 1,
278 $stage1lib->{branchcode
} => 2,
279 $stage2lib->{branchcode
} => 1,
280 $stage3lib->{branchcode
} => 3,
281 $stage4lib->{branchcode
} => 4
283 while ( my ( $code, $count ) = each %{$spec} ) {
285 while ( $cnt < $count ) {
286 my $item = $builder->build({
287 source
=> 'Stockrotationitem',
289 stage_id
=> $stage1->{stage_id
},
294 my $dbitem = Koha
::StockRotationItems
->find($item);
295 $dbitem->itemnumber->homebranch($code)
296 ->holdingbranch($code)->store;
300 my $report = Koha
::StockRotationStages
301 ->find($stage1->{stage_id
})->investigate;
303 foreach my $lib ( @
{$libraries} ) {
304 my $items = $report->{branched
}->{$lib->{branchcode
}}->{items
} || [];
309 # Items assigned to stag1lib -> log, hence $results[4] = 0;
310 is_deeply
( $results, [ 1, 1, 1, 2, 1, 3, 4 ], "Empty report test 1.");
312 # Now we test by adding the next stage's items to the same report.
314 $library1->{branchcode
} => 3,
315 $library2->{branchcode
} => 2,
316 $library3->{branchcode
} => 1,
317 $stage1lib->{branchcode
} => 4,
318 $stage2lib->{branchcode
} => 2,
319 $stage3lib->{branchcode
} => 0,
320 $stage4lib->{branchcode
} => 3
322 while ( my ( $code, $count ) = each %{$spec} ) {
324 while ( $cnt < $count ) {
325 my $item = $builder->build({
326 source
=> 'Stockrotationitem',
328 stage_id
=> $stage2->{stage_id
},
333 my $dbitem = Koha
::StockRotationItems
->find($item);
334 $dbitem->itemnumber->homebranch($code)
335 ->holdingbranch($code)->store;
340 $report = Koha
::StockRotationStages
341 ->find($stage2->{stage_id
})->investigate($report);
343 foreach my $lib ( @
{$libraries} ) {
344 my $items = $report->{branched
}->{$lib->{branchcode
}}->{items
} || [];
348 is_deeply
( $results, [ 4, 3, 2, 6, 3, 3, 7 ], "full report test.");
350 # Carry out db updates
351 foreach my $item (@
{$report->{items
}}) {
352 my $reason = $item->{reason
};
353 if ( $reason eq 'repatriation' ) {
354 $item->{object
}->repatriate;
355 } elsif ( grep { $reason eq $_ }
356 qw
/in-demand advancement initiation/ ) {
357 $item->{object
}->advance;
361 $report = Koha
::StockRotationStages
362 ->find($stage1->{stage_id
})->investigate;
364 foreach my $lib ( @
{$libraries} ) {
365 my $items = $report->{branched
}->{$lib->{branchcode
}}->{items
} || [];
369 # All items have been 'initiated', which means they are either happily in
370 # transit or happily at the library they are supposed to be. Either way
371 # they will register as 'not-ready' in the stock rotation report.
372 is_deeply
( $results, [ 0, 0, 0, 0, 0, 0, 0 ], "All items now in logs.");
374 $schema->storage->txn_rollback;