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