Bug 18761: Fix tests for AutomaticItemModificationByAge.t - clear cache
[koha.git] / t / db_dependent / Items / AutomaticItemModificationByAge.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4 use Test::More tests => 16;
5 use MARC::Record;
6 use MARC::Field;
7 use DateTime;
8 use DateTime::Duration;
9
10 use C4::Biblio;
11 use C4::Context;
12 use C4::Items;
13 use Koha::DateUtils;
14 use t::lib::TestBuilder;
15
16 my $schema = Koha::Database->new->schema;
17 $schema->storage->txn_begin;
18 my $dbh = C4::Context->dbh;
19
20 my $builder = t::lib::TestBuilder->new;
21
22 # create two branches
23 my $library = $builder->build( { source => 'Branch' })->{branchcode};
24 my $library2 = $builder->build( { source => 'Branch' })->{branchcode};
25
26 my $frameworkcode = ''; # FIXME We do not want to insert the whole mapping, but we should use another frameworkcode
27 $dbh->do(q|
28     DELETE FROM marc_subfield_structure
29     WHERE ( kohafield = 'items.new_status' OR kohafield = 'items.stocknumber' )
30     AND frameworkcode = ?
31 |, undef, $frameworkcode);
32
33 my $new_tagfield = 'i';
34 $dbh->do(qq|
35     INSERT INTO marc_subfield_structure(tagfield, tagsubfield, kohafield, frameworkcode)
36     VALUES ( 952, ?, 'items.new_status', ? )
37 |, undef, $new_tagfield, $frameworkcode);
38
39 # Clear cache
40 my $cache = Koha::Caches->get_instance();
41 $cache->clear_from_cache("MarcStructure-0-$frameworkcode");
42 $cache->clear_from_cache("MarcStructure-1-$frameworkcode");
43 $cache->clear_from_cache("default_value_for_mod_marc-$frameworkcode");
44 $cache->clear_from_cache("MarcSubfieldStructure-$frameworkcode");
45
46 my $record = MARC::Record->new();
47 $record->append_fields(
48     MARC::Field->new('100', ' ', ' ', a => 'Moffat, Steven'),
49     MARC::Field->new('245', ' ', ' ', a => 'Silence in the library'),
50     MARC::Field->new('942', ' ', ' ', c => 'ITEMTYPE_T'),
51 );
52 my ($biblionumber, undef) = C4::Biblio::AddBiblio($record, $frameworkcode);
53
54 my ($item_bibnum, $item_bibitemnum, $itemnumber) = C4::Items::AddItem(
55     {
56         homebranch => $library,
57         holdingbranch => $library,
58         new_status => 'new_value',
59         ccode => 'FIC',
60     },
61     $biblionumber
62 );
63
64 my $item = C4::Items::GetItem( $itemnumber );
65 is ( $item->{new_status}, 'new_value', q|AddItem insert the 'new_status' field| );
66
67 my ( $tagfield, undef ) = GetMarcFromKohaField('items.itemnumber', $frameworkcode);
68 my $marc_item = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
69 is( $marc_item->subfield($tagfield, $new_tagfield), 'new_value', q|Koha mapping is correct|);
70
71 # Update the items.new_status field if items.ccode eq 'FIC' => should be updated
72 my @rules = (
73     {
74         conditions => [
75             {
76                 field => 'items.ccode',
77                 value => 'FIC',
78             },
79         ],
80         substitutions => [
81             {
82                 field => 'items.new_status',
83                 value => 'updated_value',
84              },
85         ],
86         age => '0',
87     },
88 );
89
90 C4::Items::ToggleNewStatus( { rules => \@rules } );
91
92 my $modified_item = C4::Items::GetItem( $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| );
96
97 # Update the items.new_status field if items.ccode eq 'DONT_EXIST' => should not be updated
98 @rules = (
99     {
100         conditions => [
101             {
102                 field => 'items.ccode',
103                 value => 'DONT_EXIST',
104             },
105         ],
106         substitutions => [
107             {
108                 field => 'items.new_status',
109                 value => 'new_updated_value',
110              },
111         ],
112         age => '0',
113     },
114 );
115
116 C4::Items::ToggleNewStatus( { rules => \@rules } );
117
118 $modified_item = C4::Items::GetItem( $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| );
122
123 # Play with age
124 $item = C4::Items::GetItem( $itemnumber );
125 my $dt_today = dt_from_string;
126 my $days5ago = $dt_today->add_duration( DateTime::Duration->new( days => -5 ) );
127
128 C4::Items::ModItem( { dateaccessioned => $days5ago }, $biblionumber, $itemnumber );
129 $item = C4::Items::GetItem( $itemnumber );
130
131 @rules = (
132     {
133         conditions => [
134             {
135                 field => 'items.ccode',
136                 value => 'FIC',
137             },
138         ],
139         substitutions => [
140             {
141                 field => 'items.new_status',
142                 value => 'new_updated_value',
143              },
144         ],
145         age => '10',
146     },
147 );
148 C4::Items::ToggleNewStatus( { rules => \@rules } );
149 $modified_item = C4::Items::GetItem( $itemnumber );
150 is( $modified_item->{new_status}, 'updated_value', q|ToggleNewStatus: Age = 10 : The new_status value is not updated|);
151
152 $rules[0]->{age} = 5;
153 $rules[0]->{substitutions}[0]{value} = 'new_updated_value5';
154 C4::Items::ToggleNewStatus( { rules => \@rules } );
155 $modified_item = C4::Items::GetItem( $itemnumber );
156 is( $modified_item->{new_status}, 'new_updated_value5', q|ToggleNewStatus: Age = 5 : The new_status value is updated|);
157
158 $rules[0]->{age} = '';
159 $rules[0]->{substitutions}[0]{value} = 'new_updated_value_empty_string';
160 C4::Items::ToggleNewStatus( { rules => \@rules } );
161 $modified_item = C4::Items::GetItem( $itemnumber );
162 is( $modified_item->{new_status}, 'new_updated_value_empty_string', q|ToggleNewStatus: Age = '' : The new_status value is updated|);
163
164 $rules[0]->{age} = undef;
165 $rules[0]->{substitutions}[0]{value} = 'new_updated_value_undef';
166 C4::Items::ToggleNewStatus( { rules => \@rules } );
167 $modified_item = C4::Items::GetItem( $itemnumber );
168 is( $modified_item->{new_status}, 'new_updated_value_undef', q|ToggleNewStatus: Age = undef : The new_status value is updated|);
169
170 # Field deletion
171 @rules = (
172     {
173         conditions => [
174             {
175                 field => 'items.ccode',
176                 value => 'FIC',
177             },
178         ],
179         substitutions => [
180             {
181                 field => 'items.new_status',
182                 value => '',
183              },
184         ],
185         age => '0',
186     },
187 );
188
189 C4::Items::ToggleNewStatus( { rules => \@rules } );
190
191 $modified_item = C4::Items::GetItem( $itemnumber );
192 is( $modified_item->{new_status}, '', q|ToggleNewStatus: The new_status value is empty|);
193 $marc_item = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
194 is( $marc_item->subfield($tagfield, $new_tagfield), undef, q|ToggleNewStatus: The new_status field is removed from the item marc| );
195
196 # conditions multiple
197 @rules = (
198     {
199         conditions => [
200             {
201                 field => 'items.ccode',
202                 value => 'FIC',
203             },
204             {
205                 field => 'items.homebranch',
206                 value => $library,
207             },
208         ],
209         substitutions => [
210             {
211                 field => 'items.new_status',
212                 value => 'new_value',
213              },
214         ],
215         age => '0',
216     },
217 );
218
219 C4::Items::ToggleNewStatus( { rules => \@rules } );
220
221 $modified_item = C4::Items::GetItem( $itemnumber );
222 is( $modified_item->{new_status}, 'new_value', q|ToggleNewStatus: conditions multiple: all match, the new_status value is updated|);
223
224 @rules = (
225     {
226         conditions => [
227             {
228                 field => 'items.ccode',
229                 value => 'FIC',
230             },
231             {
232                 field => 'items.homebranch',
233                 value => 'DONT_EXIST',
234             },
235         ],
236         substitutions => [
237             {
238                 field => 'items.new_status',
239                 value => 'new_updated_value',
240              },
241         ],
242         age => '0',
243     },
244 );
245
246 C4::Items::ToggleNewStatus( { rules => \@rules } );
247
248 $modified_item = C4::Items::GetItem( $itemnumber );
249 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|);
250
251 @rules = (
252     {
253         conditions => [
254             {
255                 field => 'items.ccode',
256                 value => 'FIC|NFIC',
257             },
258             {
259                 field => 'items.homebranch',
260                 value => "$library|$library2",
261             },
262         ],
263         substitutions => [
264             {
265                 field => 'items.new_status',
266                 value => 'new_updated_value',
267              },
268         ],
269         age => '0',
270     },
271 );
272
273 C4::Items::ToggleNewStatus( { rules => \@rules } );
274
275 $modified_item = C4::Items::GetItem( $itemnumber );
276 is( $modified_item->{new_status}, 'new_updated_value', q|ToggleNewStatus: conditions multiple: the 2 conditions match, the new_status value is updated|);
277
278 @rules = (
279     {
280         conditions => [
281             {
282                 field => 'biblioitems.itemtype',
283                 value => 'ITEMTYPE_T',
284             },
285         ],
286         substitutions => [
287             {
288                 field => 'items.new_status',
289                 value => 'another_new_updated_value',
290              },
291         ],
292         age => '0',
293     },
294 );
295
296 C4::Items::ToggleNewStatus( { rules => \@rules } );
297
298 $modified_item = C4::Items::GetItem( $itemnumber );
299 is( $modified_item->{new_status}, 'another_new_updated_value', q|ToggleNewStatus: conditions on biblioitems|);
300
301 # Clear cache
302 $cache = Koha::Caches->get_instance();
303 $cache->clear_from_cache("MarcStructure-0-$frameworkcode");
304 $cache->clear_from_cache("MarcStructure-1-$frameworkcode");
305 $cache->clear_from_cache("default_value_for_mod_marc-$frameworkcode");
306 $cache->clear_from_cache("MarcSubfieldStructure-$frameworkcode");