Bug 11319: Koha::SimpleMARC should take a hashref for parameters
[koha.git] / t / SimpleMARC.t
1 use Modern::Perl;
2
3 use Test::More tests => 37;
4
5 use_ok("MARC::Field");
6 use_ok("MARC::Record");
7 use_ok("Koha::SimpleMARC");
8
9 sub new_record {
10     my $record = MARC::Record->new;
11     $record->leader('03174nam a2200445 a 4500');
12     my @fields = (
13         MARC::Field->new(
14             100, '1', ' ',
15             a => 'Knuth, Donald Ervin',
16             d => '1938',
17         ),
18         MARC::Field->new(
19             245, '1', '4',
20             a => 'The art of computer programming',
21             c => 'Donald E. Knuth.',
22         ),
23         MARC::Field->new(
24             650, ' ', '0',
25             a => 'Computer programming.',
26             9 => '462',
27         ),
28         MARC::Field->new(
29             952, ' ', ' ',
30             p => '3010023917',
31             y => 'BK',
32             c => 'GEN',
33             d => '2001-06-25',
34         ),
35     );
36     $record->append_fields(@fields);
37     return $record;
38 }
39
40 my $record = new_record;
41
42 # field_exists
43 is( field_exists({ record => $record, field => '650', subfield => 'a' }), 'Computer programming.', '650$a exists' );
44 is( field_exists({ record => $record, field => '650', subfield => 'b' }), undef, '650$b does not exist' );
45
46 $record->append_fields(
47     MARC::Field->new(
48         650, ' ', '0',
49         a => 'Computer algorithms.',
50         9 => '463',
51     )
52 );
53
54 is( field_exists({ record => $record, field => '650', subfield => 'a' }), 'Computer programming.', '650$a exists, field_exists returns the first one' );
55
56 # read_field
57 my @fields_650a = read_field({ record => $record, field => '650', subfield => 'a' });
58 is( $fields_650a[0], 'Computer programming.', 'first 650$a' );
59 is( $fields_650a[1], 'Computer algorithms.', 'second 650$a' );
60 is( read_field({ record => $record, field => '650', subfield => 'a', n => 1 }), 'Computer programming.', 'first 650$a bis' );
61 is( read_field({ record => $record, field => '650', subfield => 'a', n => 2 }), 'Computer algorithms.', 'second 650$a bis' );
62 is( read_field({ record => $record, field => '650', subfield => 'a', n => 3 }), undef, 'There is no 3 650$a' );
63
64 # copy_field
65 copy_field({ record => $record, from_field => '245', from_subfield => 'a', to_field => '246', to_subfield => 'a' });
66 is_deeply( read_field({ record => $record, field => '245', subfield => 'a' }), 'The art of computer programming', 'After copy 245$a still exists' );
67 is_deeply( read_field({ record => $record, field => '246', subfield => 'a' }), 'The art of computer programming', '246$a is a new field' );
68 delete_field({ record => $record, field => '246' });
69 is( field_exists({ record => $record, field => '246', subfield => 'a' }), undef, '246$a does not exist anymore' );
70
71 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '651', to_subfield => 'a' });
72 my @fields_651a = read_field({ record =>  $record, field => '651', subfield => 'a' });
73 is_deeply( \@fields_651a, ['Computer programming.', 'Computer algorithms.'], 'Copy multivalued field' );
74 delete_field({ record => $record, field => '651' });
75
76 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '651', to_subfield => 'a', n => 1 });
77 is_deeply( read_field({record => $record, field => '651', subfield => 'a' }), 'Computer programming.', 'Copy first field 650$a' );
78 delete_field({ record => $record, field => '652' });
79
80 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '651', to_subfield => 'a', n => 2 });
81 is_deeply( read_field({ record => $record, field => '651', subfield => 'a' }), 'Computer algorithms.', 'Copy second field 650$a' );
82 delete_field({ record => $record, field => '651' });
83
84 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '651', to_subfield => 'a', regex => { search => 'Computer', replace => 'The art of' } } );
85 @fields_651a = read_field({ record =>  $record, field => '651', subfield => 'a' });
86 is_deeply( \@fields_651a, ['The art of programming.', 'The art of algorithms.'], 'Copy field using regex' );
87
88 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '651', to_subfield => 'a', regex => { search => 'Computer', replace => 'The mistake of' } } );
89 @fields_651a = read_field({ record =>  $record, field => '651', subfield => 'a' });
90 is_deeply( \@fields_651a, ['The mistake of programming.', 'The mistake of algorithms.'], 'Copy fields using regex on existing fields' );
91 delete_field({ record => $record, field => '651' });
92
93 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '651', to_subfield => 'a', regex => { search => 'Computer', replace => 'The art of' } } );
94 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '651', to_subfield => 'a', regex => { search => 'Computer', replace => 'The mistake of' }, n => 1, dont_erase => 1 } );
95 @fields_651a = read_field({ record => $record, field => '651', subfield => 'a' });
96 is_deeply( \@fields_651a, [
97     'The art of programming.',
98     'The mistake of programming.',
99     'The art of algorithms.',
100     'The mistake of programming.'
101 ], 'Copy first field using regex on existing fields without erase existing values' );
102 delete_field({ record => $record, field => '651' });
103
104 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '651', to_subfield => 'a', regex => { search => 'Computer', replace => 'The art of' }  });
105 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '651', to_subfield => 'a', regex => { search => 'Computer', replace => 'The mistake of' }, dont_erase => 1 });
106 @fields_651a = read_field({ record =>  $record, field => '651', subfield => 'a' });
107 is_deeply( \@fields_651a, [
108     'The art of programming.',
109     'The mistake of programming.',
110     'The mistake of algorithms.',
111     'The art of algorithms.',
112     'The mistake of programming.',
113     'The mistake of algorithms.'
114 ], 'Copy fields using regex on existing fields without erase existing values' );
115 delete_field({ record => $record, field => '651' });
116
117 # Copy with regex modifiers
118 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '652', to_subfield => 'a', regex => { search => 'o', replace => 'foo' } });
119 my @fields_652a = read_field({ record => $record, field => '652', subfield => 'a' });
120 is_deeply( \@fields_652a, ['Cfoomputer programming.', 'Cfoomputer algorithms.'], 'Copy field using regex' );
121
122 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '653', to_subfield => 'a', regex => { search => 'o', replace => 'foo', modifiers => 'g' } });
123 my @fields_653a = read_field({ record =>  $record, field => '653', subfield => 'a' });
124 is_deeply( \@fields_653a, ['Cfoomputer prfoogramming.', 'Cfoomputer algfoorithms.'], 'Copy field using regex' );
125
126 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '654', to_subfield => 'a', regex => { search => 'O', replace => 'foo', modifiers => 'i' } });
127 my @fields_654a = read_field({ record =>  $record, field => '654', subfield => 'a' });
128 is_deeply( \@fields_654a, ['Cfoomputer programming.', 'Cfoomputer algorithms.'], 'Copy field using regex' );
129
130 copy_field({ record => $record, from_field => '650', from_subfield => 'a', to_field => '655', to_subfield => 'a', regex => { search => 'O', replace => 'foo', modifiers => 'gi' } });
131 my @fields_655a = read_field({ record =>  $record, field => '655', subfield => 'a' });
132 is_deeply( \@fields_655a, ['Cfoomputer prfoogramming.', 'Cfoomputer algfoorithms.'], 'Copy field using regex' );
133
134 # update_field
135 update_field({ record => $record, field => '952', subfield => 'p', values => ['3010023918'] });
136 is_deeply( read_field({ record => $record, field => '952', subfield => 'p' }), '3010023918', 'update existing subfield 952$p' );
137 delete_field({ record => $record, field => '952' });
138 update_field({ record => $record, field => '952', subfield => 'p', values => ['3010023918'] });
139 update_field({ record => $record, field => '952', subfield => 'y', values => ['BK'] });
140 is_deeply( read_field({ record => $record, field => '952', subfield => 'p' }), '3010023918', 'create subfield 952$p' );
141 is_deeply( read_field({ record => $record, field => '952', subfield => 'y' }), 'BK', 'create subfield 952$k on existing 952 field' );
142 $record->append_fields(
143     MARC::Field->new(
144         952, ' ', ' ',
145         p => '3010023917',
146         y => 'BK',
147     ),
148 );
149 update_field({ record => $record, field => '952', subfield => 'p', values => ['3010023919'] });
150 my @fields_952p = read_field({ record =>  $record, field => '952', subfield => 'p' });
151 is_deeply( \@fields_952p, ['3010023919', '3010023919'], 'update all subfields 952$p with the same value' );
152
153 update_field({ record => $record, field => '952', subfield => 'p', values => ['3010023917', '3010023918'] });
154 @fields_952p = read_field({ record => $record, field => '952', subfield => 'p' });
155 is_deeply( \@fields_952p, ['3010023917', '3010023918'], 'update all subfields 952$p with the different values' );
156
157 # move_field
158 $record = new_record;
159 my ( @fields_952d, @fields_952c, @fields_954c, @fields_954p);
160 $record->append_fields(
161     MARC::Field->new(
162         952, ' ', ' ',
163         p => '3010023917',
164         y => 'BK',
165     ),
166 );
167 copy_field({ record => $record, from_field => '952', from_subfield => 'd', to_field => '952', to_subfield => 'd' });
168 @fields_952d = read_field({ record =>  $record, field => '952', subfield => 'd' });
169 is_deeply( \@fields_952d, ['2001-06-25', '2001-06-25'], 'copy 952$d into others 952 field' );
170
171 move_field({ record => $record, from_field => '952', from_subfield => 'c', to_field => '954', to_subfield => 'c' });
172 @fields_952c = read_field({ record =>  $record, field => '952', subfield => 'c' });
173 @fields_954c = read_field({ record =>  $record, field => '954', subfield => 'c' });
174 is_deeply( \@fields_952c, [], 'The 952$c has moved' );
175 is_deeply( \@fields_954c, ['GEN'], 'Now 954$c exists' );
176
177 move_field({ record => $record, from_field => '952', from_subfield => 'p', to_field => '954', to_subfield => 'p', n => 1 }); # Move the first field
178 @fields_952p = read_field({ record =>  $record, field => '952', subfield => 'p' });
179 @fields_954p = read_field({ record =>  $record, field => '954', subfield => 'p' });
180 is_deeply( \@fields_952p, ['3010023917'], 'One of 952$p has moved' );
181 is_deeply( \@fields_954p, ['3010023917'], 'Now 954$p exists' );
182
183 $record = new_record;
184 $record->append_fields(
185     MARC::Field->new(
186         952, ' ', ' ',
187         p => '3010023917',
188         y => 'BK',
189     ),
190 );
191
192 move_field({ record => $record, from_field => '952', from_subfield => 'p', to_field => '954', to_subfield => 'p' }); # Move all field
193 @fields_952p = read_field({ record =>  $record, field => '952', subfield => 'p' });
194 @fields_954p = read_field({ record =>  $record, field => '954', subfield => 'p' });
195 is_deeply( \@fields_952p, [], 'All 952$p have moved' );
196 is_deeply( \@fields_954p, ['3010023917', '3010023917'], 'Now 2 954$p exist' );
197