3 # Tests for Koha/SearchEngine/Search
7 use Test::More tests => 2;
18 use C4::AuthoritiesMarc;
24 use Koha::SearchEngine::Elasticsearch;
25 use Koha::SearchEngine::Indexer;
27 use t::lib::TestBuilder;
30 my $schema = Koha::Database->new->schema;
31 my $builder = t::lib::TestBuilder->new;
33 $schema->storage->txn_begin;
35 subtest 'Test indexer object creation' => sub {
38 t::lib::Mocks::mock_preference( 'SearchEngine', 'Zebra' );
39 my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX });
40 is( ref $indexer, 'Koha::SearchEngine::Zebra::Indexer', 'We get the correct class for Zebra biblios');
41 $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::AUTHORITIES_INDEX });
42 is( ref $indexer, 'Koha::SearchEngine::Zebra::Indexer', 'We get the correct class for Zebra authorities');
44 t::lib::Mocks::mock_preference( 'SearchEngine', 'Elasticsearch' );
48 eval { Koha::SearchEngine::Elasticsearch->get_elasticsearch_params; };
50 skip 'Elasticsearch configuration not available', 4
53 $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX });
54 is( ref $indexer, 'Koha::SearchEngine::Elasticsearch::Indexer', 'We get the correct class for Elasticsearch biblios');
55 ok( $indexer->index_name =~ /biblios$/, "The index is set correctly for biblios");
56 $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::AUTHORITIES_INDEX });
57 is( ref $indexer, 'Koha::SearchEngine::Elasticsearch::Indexer', 'We get the correct class for Elasticsearch authorities');
58 ok( $indexer->index_name =~ /authorities$/, "The index is set correctly for authorities");
63 subtest 'Test indexer calls' => sub {
66 my @engines = ('Zebra');
67 eval { Koha::SearchEngine::Elasticsearch->get_elasticsearch_params; };
68 push @engines, 'Elasticsearch' unless $@;
70 skip 'Elasticsearch configuration not available', 20
71 if scalar @engines == 1;
74 for my $engine ( @engines ){
75 t::lib::Mocks::mock_preference( 'SearchEngine', $engine );
76 my $mock_index = Test::MockModule->new("Koha::SearchEngine::".$engine."::Indexer");
78 my $biblionumber1 = $builder->build_sample_biblio()->biblionumber;
79 my $biblionumber2 = $builder->build_sample_biblio()->biblionumber;
81 my $mock_zebra = Test::MockModule->new("Koha::SearchEngine::Zebra::Indexer");
82 $mock_zebra->mock( ModZebra => sub { warn "ModZebra"; } );
83 my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX });
85 $indexer->index_records([$biblionumber1,$biblionumber1],"specialUpdate","biblioserver",undef);
86 } ["ModZebra","ModZebra"],"ModZebra called for each record being indexed for $engine";
88 $mock_index->mock( index_records => sub {
90 my ($package, undef, undef) = caller;
94 my $auth = MARC::Record->new;
97 $authid = AddAuthority( $auth, undef, 'TOPIC_TERM' );
98 } [$engine,"C4::AuthoritiesMarc"], "index_records is called for $engine is called when adding authority";
101 $authid = DelAuthority({ authid => $authid, skip_merge => 1 });
102 } [$engine,"C4::AuthoritiesMarc"], "index_records is called for $engine is called when adding authority";
107 $biblio = $builder->build_sample_biblio();
108 $biblio2 = $builder->build_sample_biblio();
109 } [$engine,'C4::Biblio',$engine,'C4::Biblio'], "index_records is called for $engine when adding a biblio (ModBiblioMarc)";
115 $item = $builder->build_sample_item({
116 biblionumber => $biblio->biblionumber,
117 onloan => '2020-02-02',
118 datelastseen => '2020-01-01'
120 $item2 = $builder->build_sample_item({
121 biblionumber => $biblio->biblionumber,
122 onloan => '2020-12-12',
123 datelastseen => '2020-11-11'
125 } [$engine,"Koha::Item",$engine,"Koha::Item"], "index_records is called for $engine when adding an item (Item->store)";
127 $item->store({ skip_record_index => 1 });
128 } undef, "index_records is not called for $engine when adding an item (Item->store) if skip_record_index passed";
130 my $issue = $builder->build({
133 itemnumber => $item->itemnumber
136 my $issue2 = $builder->build({
139 itemnumber => $item2->itemnumber
143 MarkIssueReturned( $issue->{borrowernumber}, $item->itemnumber);
144 } [$engine,"Koha::Item"], "index_records is called for $engine when calling MarkIssueReturned";
146 MarkIssueReturned( $issue2->{borrowernumber}, $item2->itemnumber, undef, undef, { skip_record_index => 1});
147 } undef, "index_records is not called for $engine when calling MarkIssueReturned if skip_record_index passed";
150 AddReturn($item->barcode, $item->homebranch, 0, undef);
151 } [$engine,'C4::Circulation'], "index_records is called once for $engine when calling AddReturn if item not issued";
152 $issue = $builder->build({
155 itemnumber => $item->itemnumber
159 AddReturn($item->barcode, $item->homebranch, 0, undef);
160 } [$engine,'C4::Circulation'], "index_records is called once for $engine when calling AddReturn if item not issued";
164 source => 'Branchtransfer',
166 itemnumber => $item->itemnumber,
167 datesent => dt_from_string,
168 datearrived => undef,
169 datecancelled => undef
174 LostItem( $item->itemnumber, "tests");
175 } [$engine,"Koha::Item"], "index_records is called for $engine when calling LostItem and transfer exists";
178 source => 'Branchtransfer',
180 itemnumber => $item2->itemnumber,
181 datesent => dt_from_string,
182 datearrived => undef,
183 datecancelled => undef
188 LostItem( $item->itemnumber, "tests", undef, { skip_record_index => 1 });
189 } undef, "index_records is not called for $engine when calling LostItem and transfer exists if skip_record_index";
191 $item->datelastseen('2020-02-02');
192 $item->store({skip_record_index=>1});
194 my $t1 = ModDateLastSeen( $item->itemnumber, 1, undef );
195 } [$engine, "Koha::Item"], "index_records is called for $engine when calling ModDateLastSeen";
197 ModDateLastSeen( $item->itemnumber, 1, { skip_record_index =>1 } );
198 } undef, "index_records is not called for $engine when calling ModDateLastSeen if skip_record_index";
201 ModItemTransfer( $item->itemnumber, $item2->homebranch, $item->homebranch,'Manual');
202 } [$engine,"Koha::Item"], "index_records is called for $engine when calling ModItemTransfer";
204 ModItemTransfer( $item->itemnumber, $item->homebranch, $item2->homebranch,'Manual',{skip_record_index=>1});
205 } undef, "index_records is not called for $engine when calling ModItemTransfer with skip_record_index";
209 } [$engine,"Koha::Item"], "index_records is called for $engine when deleting an item (Item->delete)";
211 $item2->delete({ skip_record_index => 1 });
212 } undef, "index_records is not called for $engine when adding an item (Item->store) if skip_record_index passed";
215 DelBiblio( $biblio->biblionumber );
216 } [$engine, "C4::Biblio"], "index_records is called for $engine when calling DelBiblio";
218 DelBiblio( $biblio->biblionumber, { skip_record_index =>1 });
219 } undef, "index_records is not called for $engine when calling DelBiblio if skip_record_index passed";
225 $schema->storage->txn_rollback;