3 # Copyright 2015 Koha Development team
5 # This file is part of Koha
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
22 use Test::More tests => 6;
33 use Koha::Authorities;
34 use Koha::Authority::MergeRequest;
35 use Koha::Authority::MergeRequests;
36 use Koha::Authority::Type;
37 use Koha::Authority::Types;
41 use t::lib::TestBuilder;
44 #TODO Helpful as long as we have issues here
45 my $mock = Test::MockObject->new();
46 $mock->fake_module( 'Catmandu::Store::ElasticSearch' );
49 my $schema = Koha::Database->new->schema;
50 $schema->storage->txn_begin;
53 our $search_compat_pars;
54 our $builder = t::lib::TestBuilder->new;
56 my $nb_of_authorities = Koha::Authorities->search->count;
57 my $nb_of_authority_types = Koha::Authority::Types->search->count;
58 my $new_authority_type_1 = Koha::Authority::Type->new(
59 { authtypecode => 'my_ac_1',
60 authtypetext => 'my authority type text 1',
61 auth_tag_to_report => '100',
62 summary => 'my summary for authority 1',
65 my $new_authority_1 = Koha::Authority->new( { authtypecode => $new_authority_type_1->authtypecode, } )->store;
66 my $new_authority_2 = Koha::Authority->new( { authtypecode => $new_authority_type_1->authtypecode, } )->store;
68 is( Koha::Authority::Types->search->count, $nb_of_authority_types + 1, 'The authority type should have been added' );
69 is( Koha::Authorities->search->count, $nb_of_authorities + 2, 'The 2 authorities should have been added' );
71 $new_authority_1->delete;
72 is( Koha::Authorities->search->count, $nb_of_authorities + 1, 'Delete should have deleted the authority' );
74 subtest 'New merge request, method oldmarc' => sub {
77 my $marc = MARC::Record->new;
79 MARC::Field->new( '100', '', '', a => 'a', b => 'b_findme' ),
80 MARC::Field->new( '200', '', '', a => 'aa' ),
82 my $req = Koha::Authority::MergeRequest->new({
83 authid => $new_authority_2->authid,
84 reportxml => 'Should be discarded',
86 is( $req->reportxml, undef, 'Reportxml is undef without oldrecord' );
88 $req = Koha::Authority::MergeRequest->new({
89 authid => $new_authority_2->authid,
92 like( $req->reportxml, qr/b_findme/, 'Reportxml initialized' );
94 # Check if oldmarc is a MARC::Record and has one field
95 is( ref( $req->oldmarc ), 'MARC::Record', 'Check oldmarc method' );
96 is( scalar $req->oldmarc->fields, 1, 'Contains one field' );
99 subtest 'Testing reporting_tag_xml in MergeRequests' => sub {
102 my $record = MARC::Record->new;
103 $record->append_fields(
104 MARC::Field->new( '024', '', '', a => 'aaa' ),
105 MARC::Field->new( '100', '', '', a => 'Best author' ),
106 MARC::Field->new( '234', '', '', a => 'Just a field' ),
108 my $xml = Koha::Authority::MergeRequests->reporting_tag_xml({
109 record => $record, tag => '110',
111 is( $xml, undef, 'Expected no result for wrong tag' );
112 $xml = Koha::Authority::MergeRequests->reporting_tag_xml({
113 record => $record, tag => '100',
115 my $newrecord = MARC::Record->new_from_xml(
117 C4::Context->preference('marcflavour') eq 'UNIMARC' ?
120 ); # MARC format does not actually matter here
121 cmp_deeply( $record->field('100')->subfields,
122 $newrecord->field('100')->subfields,
123 'Compare reporting tag in both records',
127 subtest 'Trivial tests for get_count_usage and linked_biblionumbers' => sub {
130 # NOTE: We are not testing $searcher->simple_search_compat here. Suppose
131 # that should be done in t/db../Koha/SearchEngine?
132 # So we're just testing the 'wrapper' here.
134 my ( $mods, $koha_fields );
135 t::lib::Mocks::mock_preference('SearchEngine', 'Zebra');
136 $mods->{zebra} = Test::MockModule->new( 'Koha::SearchEngine::Zebra::Search' );
137 $mods->{elastic} = Test::MockModule->new( 'Koha::SearchEngine::Elasticsearch::Search' );
138 $mods->{biblio} = Test::MockModule->new( 'C4::Biblio' );
139 $mods->{zebra}->mock( 'simple_search_compat', \&simple_search_compat );
140 $mods->{elastic}->mock( 'simple_search_compat', \&simple_search_compat );
141 $mods->{biblio}->mock( 'GetMarcFromKohaField', sub { return @$koha_fields; });
143 my $auth1 = $builder->build({ source => 'AuthHeader' });
144 $auth1 = Koha::Authorities->find( $auth1->{authid} );
146 # Test error condition
148 $search_compat_pars = [ 0, 'some_error' ];
149 warning_like { $count = $auth1->get_usage_count }
150 qr/some_error/, 'Catch warn of simple_search_compat';
151 is( $count, undef, 'Undef returned when error encountered' );
153 # Simple test with some results; one result discarded in the 2nd test
154 $search_compat_pars = [ 1 ];
155 $koha_fields = [ '001', '' ];
156 is( $auth1->get_usage_count, 3, 'Three results expected (Zebra)' );
157 cmp_deeply( [ $auth1->linked_biblionumbers ], [ 1001, 3003 ],
158 'linked_biblionumbers should ignore record without biblionumber' );
160 # And a simple test with Elastic
161 t::lib::Mocks::mock_preference('SearchEngine', 'Elasticsearch');
162 cmp_deeply( [ $auth1->linked_biblionumbers ], [ 2001 ],
163 'linked_biblionumbers with Elasticsearch' );
166 sub simple_search_compat {
167 if( $search_compat_pars->[0] == 0 ) {
168 return ( $search_compat_pars->[1], [], 0 );
169 } elsif( $search_compat_pars->[0] == 1 ) {
170 my $records = C4::Context->preference('SearchEngine') eq 'Zebra'
171 ? few_marcxml_records()
172 : few_marc_records();
173 return ( undef, $records, scalar @$records );
177 sub few_marcxml_records {
179 q|<?xml version="1.0" encoding="UTF-8"?>
180 <record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
181 <controlfield tag="001">1001</controlfield>
182 <datafield tag="110" ind1=" " ind2=" ">
183 <subfield code="9">102</subfield>
184 <subfield code="a">My Corporation</subfield>
187 q|<?xml version="1.0" encoding="UTF-8"?>
188 <record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
189 <!-- No biblionumber here -->
190 <datafield tag="610" ind1=" " ind2=" ">
191 <subfield code="9">112</subfield>
192 <subfield code="a">Another Corporation</subfield>
195 q|<?xml version="1.0" encoding="UTF-8"?>
196 <record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
197 <controlfield tag="001">3003</controlfield>
198 <datafield tag="110" ind1=" " ind2=" ">
199 <subfield code="9">102</subfield>
200 <subfield code="a">My Corporation</subfield>
206 sub few_marc_records {
207 my $marc = MARC::Record->new;
208 $marc->append_fields(
209 MARC::Field->new( '001', '2001' ),
210 MARC::Field->new( '245', '', '', a => 'Title' ),
215 $schema->storage->txn_rollback;