Bug 26922: Regression tests
[koha.git] / t / db_dependent / Items / AutomaticItemModificationByAge.t
blobf0472526a177f316283cd3ef72b521e2a241b69d
1 #!/usr/bin/perl
3 use Modern::Perl;
4 use Test::More tests => 17;
5 use MARC::Record;
6 use MARC::Field;
7 use DateTime;
8 use DateTime::Duration;
10 use C4::Items;
11 use C4::Biblio;
12 use C4::Context;
13 use Koha::DateUtils;
14 use Koha::Items;
15 use t::lib::Mocks;
16 use t::lib::TestBuilder;
18 my $schema = Koha::Database->new->schema;
19 $schema->storage->txn_begin;
20 my $dbh = C4::Context->dbh;
22 my $builder = t::lib::TestBuilder->new;
24 # create two branches
25 my $library = $builder->build( { source => 'Branch' })->{branchcode};
26 my $library2 = $builder->build( { source => 'Branch' })->{branchcode};
28 my $frameworkcode = ''; # Use Default for Koha to MARC mappings
29 $dbh->do(q|
30 DELETE FROM marc_subfield_structure
31 WHERE ( kohafield = 'items.new_status' OR kohafield = 'items.stocknumber' )
32 AND frameworkcode = ?
33 |, undef, $frameworkcode);
35 my $new_tagfield = 'i';
36 $dbh->do(qq|
37 INSERT INTO marc_subfield_structure(tagfield, tagsubfield, kohafield, frameworkcode)
38 VALUES ( 952, ?, 'items.new_status', ? )
39 |, undef, $new_tagfield, $frameworkcode);
41 # Clear cache
42 my $cache = Koha::Caches->get_instance();
43 $cache->clear_from_cache("MarcStructure-0-$frameworkcode");
44 $cache->clear_from_cache("MarcStructure-1-$frameworkcode");
45 $cache->clear_from_cache("default_value_for_mod_marc-");
46 $cache->clear_from_cache("MarcSubfieldStructure-$frameworkcode");
48 my $record = MARC::Record->new();
49 $record->append_fields(
50 MARC::Field->new('100', ' ', ' ', a => 'Moffat, Steven'),
51 MARC::Field->new('245', ' ', ' ', a => 'Silence in the library'),
52 MARC::Field->new('942', ' ', ' ', c => 'ITEMTYPE_T'),
54 my ($biblionumber, undef) = C4::Biblio::AddBiblio($record, $frameworkcode);
56 my $item = $builder->build_sample_item(
58 biblionumber => $biblionumber,
59 library => $library,
60 new_status => 'new_value',
61 ccode => 'FIC',
64 my $itemnumber = $item->itemnumber;
65 is ( $item->new_status, 'new_value', q|AddItem insert the 'new_status' field| );
67 my ( $tagfield, undef ) = GetMarcFromKohaField( 'items.itemnumber' );
68 my $marc_item = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
69 is( $marc_item->subfield($tagfield, $new_tagfield), 'new_value', q|Koha mapping is correct|);
71 # Update the items.new_status field if items.ccode eq 'FIC' => should be updated
72 my @rules = (
74 conditions => [
76 field => 'items.ccode',
77 value => 'FIC',
80 substitutions => [
82 field => 'items.new_status',
83 value => 'updated_value',
86 age => '0',
90 C4::Items::ToggleNewStatus( { rules => \@rules } );
92 my $modified_item = Koha::Items->find( $itemnumber );
93 is( $modified_item->new_status, 'updated_value', q|ToggleNewStatus: The new_status value is updated|);
94 $marc_item = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
95 is( $marc_item->subfield($tagfield, $new_tagfield), 'updated_value', q|ToggleNewStatus: The new_status value is updated| );
97 # Update the items.new_status field if items.ccode eq 'DONT_EXIST' => should not be updated
98 @rules = (
100 conditions => [
102 field => 'items.ccode',
103 value => 'DONT_EXIST',
106 substitutions => [
108 field => 'items.new_status',
109 value => 'new_updated_value',
112 age => '0',
116 C4::Items::ToggleNewStatus( { rules => \@rules } );
118 $modified_item = Koha::Items->find( $itemnumber );
119 is( $modified_item->new_status, 'updated_value', q|ToggleNewStatus: The new_status value is not updated|);
120 $marc_item = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
121 is( $marc_item->subfield($tagfield, $new_tagfield), 'updated_value', q|ToggleNewStatus: The new_status value is not updated| );
123 # Play with age
124 my $dt_today = dt_from_string;
125 my $days5ago = $dt_today->add_duration( DateTime::Duration->new( days => -5 ) );
127 $modified_item->dateaccessioned($days5ago)->store;
129 @rules = (
131 conditions => [
133 field => 'items.ccode',
134 value => 'FIC',
137 substitutions => [
139 field => 'items.new_status',
140 value => 'new_updated_value',
143 age => '10',
146 C4::Items::ToggleNewStatus( { rules => \@rules } );
147 $modified_item = Koha::Items->find( $itemnumber );
148 is( $modified_item->new_status, 'updated_value', q|ToggleNewStatus: Age = 10 : The new_status value is not updated|);
150 $rules[0]->{age} = 5;
151 $rules[0]->{substitutions}[0]{value} = 'new_updated_value5';
152 C4::Items::ToggleNewStatus( { rules => \@rules } );
153 $modified_item = Koha::Items->find( $itemnumber );
154 is( $modified_item->new_status, 'new_updated_value5', q|ToggleNewStatus: Age = 5 : The new_status value is updated|);
156 $rules[0]->{age} = '';
157 $rules[0]->{substitutions}[0]{value} = 'new_updated_value_empty_string';
158 C4::Items::ToggleNewStatus( { rules => \@rules } );
159 $modified_item = Koha::Items->find( $itemnumber );
160 is( $modified_item->new_status, 'new_updated_value_empty_string', q|ToggleNewStatus: Age = '' : The new_status value is updated|);
162 $rules[0]->{age} = undef;
163 $rules[0]->{substitutions}[0]{value} = 'new_updated_value_undef';
164 C4::Items::ToggleNewStatus( { rules => \@rules } );
165 $modified_item = Koha::Items->find( $itemnumber );
166 is( $modified_item->new_status, 'new_updated_value_undef', q|ToggleNewStatus: Age = undef : The new_status value is updated|);
168 # Field deletion
169 @rules = (
171 conditions => [
173 field => 'items.ccode',
174 value => 'FIC',
177 substitutions => [
179 field => 'items.new_status',
180 value => '',
183 age => '0',
187 C4::Items::ToggleNewStatus( { rules => \@rules } );
189 $modified_item = Koha::Items->find( $itemnumber );
190 is( $modified_item->new_status, '', q|ToggleNewStatus: The new_status value is empty|);
191 $marc_item = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
192 is( $marc_item->subfield($tagfield, $new_tagfield), undef, q|ToggleNewStatus: The new_status field is removed from the item marc| );
194 # conditions multiple
195 @rules = (
197 conditions => [
199 field => 'items.ccode',
200 value => 'FIC',
203 field => 'items.homebranch',
204 value => $library,
207 substitutions => [
209 field => 'items.new_status',
210 value => 'new_value',
213 age => '0',
217 C4::Items::ToggleNewStatus( { rules => \@rules } );
219 $modified_item = Koha::Items->find( $itemnumber );
220 is( $modified_item->new_status, 'new_value', q|ToggleNewStatus: conditions multiple: all match, the new_status value is updated|);
222 @rules = (
224 conditions => [
226 field => 'items.ccode',
227 value => 'FIC',
230 field => 'items.homebranch',
231 value => 'DONT_EXIST',
234 substitutions => [
236 field => 'items.new_status',
237 value => 'new_updated_value',
240 age => '0',
244 C4::Items::ToggleNewStatus( { rules => \@rules } );
246 $modified_item = Koha::Items->find( $itemnumber );
247 is( $modified_item->new_status, 'new_value', q|ToggleNewStatus: conditions multiple: at least 1 condition does not match, the new_status value is not updated|);
249 @rules = (
251 conditions => [
253 field => 'items.ccode',
254 value => 'FIC|NFIC',
257 field => 'items.homebranch',
258 value => "$library|$library2",
261 substitutions => [
263 field => 'items.new_status',
264 value => 'new_updated_value',
267 age => '0',
271 C4::Items::ToggleNewStatus( { rules => \@rules } );
273 $modified_item = Koha::Items->find( $itemnumber );
274 is( $modified_item->new_status, 'new_updated_value', q|ToggleNewStatus: conditions multiple: the 2 conditions match, the new_status value is updated|);
276 @rules = (
278 conditions => [
280 field => 'biblioitems.itemtype',
281 value => 'ITEMTYPE_T',
284 substitutions => [
286 field => 'items.new_status',
287 value => 'another_new_updated_value',
290 age => '0',
294 C4::Items::ToggleNewStatus( { rules => \@rules } );
296 $modified_item = Koha::Items->find( $itemnumber );
297 is( $modified_item->new_status, 'another_new_updated_value', q|ToggleNewStatus: conditions on biblioitems|);
299 # Run twice
300 t::lib::Mocks::mock_preference('CataloguingLog', 1);
301 my $actions_nb = $schema->resultset('ActionLog')->count();
302 C4::Items::ToggleNewStatus( { rules => \@rules } );
303 is( $schema->resultset('ActionLog')->count(), $actions_nb, q|ToggleNewStatus: no substitution does not generate action logs|);
305 # Cleanup
306 $cache = Koha::Caches->get_instance();
307 $cache->clear_from_cache("MarcStructure-0-$frameworkcode");
308 $cache->clear_from_cache("MarcStructure-1-$frameworkcode");
309 $cache->clear_from_cache("default_value_for_mod_marc-");
310 $cache->clear_from_cache("MarcSubfieldStructure-$frameworkcode");
311 $schema->storage->txn_rollback;