3 # This file is part of Koha.
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.
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.
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>.
20 use Test::More tests => 3;
29 my $dbh = C4::Context->dbh;
31 $dbh->{AutoCommit} = 0;
32 $dbh->{RaiseError} = 1;
34 my $global_marcflavour;
36 my $original_preference = C4::Context->can( 'preference' );
37 my $context = new Test::MockModule('C4::Context');
40 mock_marcfromkohafield();
44 # Undef C4::Biblio::inverted_field_map to avoid problems introduced
45 # by caching in TransformMarcToKoha
46 undef $C4::Biblio::inverted_field_map;
48 my $marcflavour = shift;
49 $global_marcflavour = $marcflavour;
51 my $isbn = '0590353403';
52 my $title = 'Foundation';
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 );
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.');
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.');
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.');
83 $field = MARC::Field->new(
85 'a' => 'Auction catalogs',
89 $marc_record->append_fields($field);
90 $success = ModBiblio($marc_record,$biblionumber,'');
95 ok($success, "ModBiblio handles authority-linked 655");
98 $field->delete_subfields('a');
99 $marc_record->append_fields($field);
100 $success = ModBiblio($marc_record,$biblionumber,'');
105 ok($success, "ModBiblio handles 655 with authority link but no heading");
108 $field->delete_subfields('9');
109 $marc_record->append_fields($field);
110 $success = ModBiblio($marc_record,$biblionumber,'');
115 ok($success, "ModBiblio handles 655 with no subfields");
117 ## Testing GetMarcISSN
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)' );
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);
139 $issns = GetMarcISSN( $marc_record, $marcflavour );
140 is( scalar @$issns, 4,
141 'GetMARCISSN handles records with multiple ISSN fields (count correct)');
143 ## Testing GetMarcControlnumber
145 $controlnumber = GetMarcControlnumber( $marc_record, $marcflavour );
146 is( $controlnumber, '', 'GetMarcControlnumber handles records without 001' );
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' );
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' );
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');
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');
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);
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));
186 sub mock_preference {
188 $context->mock( 'preference', sub {
189 my ( $self, $pref ) = @_;
190 if ( $pref eq 'marcflavour' ) {
191 return $global_marcflavour;
193 &$original_preference(@_);
199 sub mock_marcfromkohafield {
201 $context->mock('marcfromkohafield',
203 my ( $self ) = shift;
205 if ( $global_marcflavour eq 'MARC21' ) {
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' ]
216 } elsif ( $global_marcflavour eq 'UNIMARC' ) {
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' ]
231 sub create_title_field {
232 my ( $title, $marcflavour ) = @_;
234 my $title_field = ( $marcflavour eq 'UNIMARC' ) ? '200' : '245';
235 my $field = MARC::Field->new( $title_field,'','','a' => $title);
240 sub create_isbn_field {
241 my ( $isbn, $marcflavour ) = @_;
243 my $isbn_field = ( $marcflavour eq 'UNIMARC' ) ? '010' : '020';
244 my $field = MARC::Field->new( $isbn_field,'','','a' => $isbn);
249 sub create_issn_field {
250 my ( $issn, $marcflavour ) = @_;
252 my $issn_field = ( $marcflavour eq 'UNIMARC' ) ? '011' : '022';
253 my $field = MARC::Field->new( $issn_field,'','','a' => $issn);
258 subtest 'MARC21' => sub {
264 subtest 'UNIMARC' => sub {
266 run_tests('UNIMARC');