Bug 11912: (refactoring followup) make GetMarcISBN implement its advertised API
[koha.git] / t / db_dependent / Biblio.t
1 #!/usr/bin/perl
2
3 # This file is part of Koha.
4 #
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
17
18 use Modern::Perl;
19
20 use Test::More tests => 3;
21 use Test::MockModule;
22
23 use MARC::Record;
24
25 BEGIN {
26     use_ok('C4::Biblio');
27 }
28
29 my $dbh = C4::Context->dbh;
30 # Start transaction
31 $dbh->{AutoCommit} = 0;
32 $dbh->{RaiseError} = 1;
33
34 my $global_marcflavour;
35 # Mocking variables
36 my $original_preference = C4::Context->can( 'preference' );
37 my $context             = new Test::MockModule('C4::Context');
38
39 mock_preference();
40 mock_marcfromkohafield();
41
42 sub run_tests {
43
44     # Undef C4::Biblio::inverted_field_map to avoid problems introduced
45     # by caching in TransformMarcToKoha
46     undef $C4::Biblio::inverted_field_map;
47
48     my $marcflavour = shift;
49     $global_marcflavour = $marcflavour;
50
51     my $isbn = '0590353403';
52     my $title = 'Foundation';
53
54     # Generate a record with just the ISBN
55     my $marc_record = MARC::Record->new;
56     my $isbn_field  = create_isbn_field( $isbn, $marcflavour );
57     $marc_record->append_fields( $isbn_field );
58
59     # Add the record to the DB
60     my( $biblionumber, $biblioitemnumber ) = AddBiblio( $marc_record, '' );
61     my $data = GetBiblioData( $biblionumber );
62     is( $data->{ isbn }, $isbn,
63         '(GetBiblioData) ISBN correctly retireved.');
64     is( $data->{ title }, undef,
65         '(GetBiblioData) Title field is empty in fresh biblio.');
66
67     # Add title
68     my $field = create_title_field( $title, $marcflavour );
69     $marc_record->append_fields( $field );
70     ModBiblio( $marc_record, $biblionumber ,'' );
71     $data = GetBiblioData( $biblionumber );
72     is( $data->{ title }, $title,
73         'ModBiblio correctly added the title field, and GetBiblioData.');
74     is( $data->{ isbn }, $isbn, '(ModBiblio) ISBN is still there after ModBiblio.');
75
76     my $itemdata = GetBiblioItemData( $biblioitemnumber );
77     is( $itemdata->{ title }, $title,
78         'First test of GetBiblioItemData to get same result of previous two GetBiblioData tests.');
79     is( $itemdata->{ isbn }, $isbn,
80         'Second test checking it returns the correct isbn.');
81
82     my $success = 0;
83     $field = MARC::Field->new(
84             655, ' ', ' ',
85             'a' => 'Auction catalogs',
86             '9' => '1'
87             );
88     eval {
89         $marc_record->append_fields($field);
90         $success = ModBiblio($marc_record,$biblionumber,'');
91     } or do {
92         diag($@);
93         $success = 0;
94     };
95     ok($success, "ModBiblio handles authority-linked 655");
96
97     eval {
98         $field->delete_subfields('a');
99         $marc_record->append_fields($field);
100         $success = ModBiblio($marc_record,$biblionumber,'');
101     } or do {
102         diag($@);
103         $success = 0;
104     };
105     ok($success, "ModBiblio handles 655 with authority link but no heading");
106
107     eval {
108         $field->delete_subfields('9');
109         $marc_record->append_fields($field);
110         $success = ModBiblio($marc_record,$biblionumber,'');
111     } or do {
112         diag($@);
113         $success = 0;
114     };
115     ok($success, "ModBiblio handles 655 with no subfields");
116
117     ## Testing GetMarcISSN
118     my $issns;
119     $issns = GetMarcISSN( $marc_record, $marcflavour );
120     is( $issns->[0], undef,
121         'GetMarcISSN handles records without the ISSN field (list is empty)' );
122     is( scalar @$issns, 0,
123         'GetMarcISSN handles records without the ISSN field (count is 0)' );
124     # Add an ISSN field
125     my $issn = '1234-1234';
126     $field = create_issn_field( $issn, $marcflavour );
127     $marc_record->append_fields($field);
128     $issns = GetMarcISSN( $marc_record, $marcflavour );
129     is( $issns->[0], $issn,
130         'GetMarcISSN handles records with a single ISSN field (first element is correct)' );
131     is( scalar @$issns, 1,
132         'GetMARCISSN handles records with a single ISSN field (count is 1)');
133     # Add multiple ISSN field
134     my @more_issns = qw/1111-1111 2222-2222 3333-3333/;
135     foreach (@more_issns) {
136         $field = create_issn_field( $_, $marcflavour );
137         $marc_record->append_fields($field);
138     }
139     $issns = GetMarcISSN( $marc_record, $marcflavour );
140     is( scalar @$issns, 4,
141         'GetMARCISSN handles records with multiple ISSN fields (count correct)');
142
143     ## Testing GetMarcControlnumber
144     my $controlnumber;
145     $controlnumber = GetMarcControlnumber( $marc_record, $marcflavour );
146     is( $controlnumber, '', 'GetMarcControlnumber handles records without 001' );
147
148     $field = MARC::Field->new( '001', '' );
149     $marc_record->append_fields($field);
150     $controlnumber = GetMarcControlnumber( $marc_record, $marcflavour );
151     is( $controlnumber, '', 'GetMarcControlnumber handles records with empty 001' );
152
153     $field = $marc_record->field('001');
154     $field->update('123456789X');
155     $controlnumber = GetMarcControlnumber( $marc_record, $marcflavour );
156     is( $controlnumber, '123456789X', 'GetMarcControlnumber handles records with 001' );
157
158     ## Testing GetMarcISBN
159     my $record_for_isbn = MARC::Record->new();
160     my $isbns = GetMarcISBN( $record_for_isbn, $marcflavour );
161     is( scalar @$isbns, 0, '(GetMarcISBN) The record contains no ISBN');
162
163     # We add one ISBN
164     $isbn_field = create_isbn_field( $isbn, $marcflavour );
165     $record_for_isbn->append_fields( $isbn_field );
166     $isbns = GetMarcISBN( $record_for_isbn, $marcflavour );
167     is( scalar @$isbns, 1, '(GetMarcISBN) The record contains one ISBN');
168     is( $isbns->[0], $isbn, '(GetMarcISBN) The record contains our ISBN');
169
170     # We add 3 more ISBNs
171     $record_for_isbn = MARC::Record->new();
172     my @more_isbns = qw/1111111111 2222222222 3333333333 444444444/;
173     foreach (@more_isbns) {
174         $field = create_isbn_field( $_, $marcflavour );
175         $record_for_isbn->append_fields($field);
176     }
177     $isbns = GetMarcISBN( $record_for_isbn, $marcflavour );
178     is( scalar @$isbns, 4, '(GetMarcISBN) The record contains 4 ISBNs');
179     for my $i (0 .. $#more_isbns) {
180         is( $isbns->[$i], $more_isbns[$i],
181             "(GetMarcISBN) Corretly retrieves ISBN #". ($i + 1));
182     }
183
184 }
185
186 sub mock_preference {
187
188     $context->mock( 'preference', sub {
189         my ( $self, $pref ) = @_;
190         if ( $pref eq 'marcflavour' ) {
191             return $global_marcflavour;
192         } else {
193             &$original_preference(@_);
194         }
195     });
196
197 }
198
199 sub mock_marcfromkohafield {
200
201     $context->mock('marcfromkohafield',
202         sub {
203             my ( $self ) = shift;
204
205             if ( $global_marcflavour eq 'MARC21' ) {
206
207                 return  {
208                 '' => {
209                     'biblio.title' => [ '245', 'a' ],
210                     'biblio.biblionumber' => [ '999', 'c' ],
211                     'biblioitems.isbn' => [ '020', 'a' ],
212                     'biblioitems.issn' => [ '022', 'a' ],
213                     'biblioitems.biblioitemnumber' => [ '999', 'd' ]
214                     }
215                 };
216             } elsif ( $global_marcflavour eq 'UNIMARC' ) {
217
218                 return {
219                 '' => {
220                     'biblio.title' => [ '200', 'a' ],
221                     'biblio.biblionumber' => [ '999', 'c' ],
222                     'biblioitems.isbn' => [ '010', 'a' ],
223                     'biblioitems.issn' => [ '011', 'a' ],
224                     'biblioitems.biblioitemnumber' => [ '090', 'a' ]
225                     }
226                 };
227             }
228         });
229 }
230
231 sub create_title_field {
232     my ( $title, $marcflavour ) = @_;
233
234     my $title_field = ( $marcflavour eq 'UNIMARC' ) ? '200' : '245';
235     my $field = MARC::Field->new( $title_field,'','','a' => $title);
236
237     return $field;
238 }
239
240 sub create_isbn_field {
241     my ( $isbn, $marcflavour ) = @_;
242
243     my $isbn_field = ( $marcflavour eq 'UNIMARC' ) ? '010' : '020';
244     my $field = MARC::Field->new( $isbn_field,'','','a' => $isbn);
245
246     return $field;
247 }
248
249 sub create_issn_field {
250     my ( $issn, $marcflavour ) = @_;
251
252     my $issn_field = ( $marcflavour eq 'UNIMARC' ) ? '011' : '022';
253     my $field = MARC::Field->new( $issn_field,'','','a' => $issn);
254
255     return $field;
256 }
257
258 subtest 'MARC21' => sub {
259     plan tests => 25;
260     run_tests('MARC21');
261     $dbh->rollback;
262 };
263
264 subtest 'UNIMARC' => sub {
265     plan tests => 25;
266     run_tests('UNIMARC');
267     $dbh->rollback;
268 };
269
270
271 1;