Bug 24446: (follow-up) Fix tests
[srvgit] / t / db_dependent / Koha / SearchEngine / Indexer.t
1 #!/usr/bin/perl
2
3 # Tests for Koha/SearchEngine/Search
4
5 use Modern::Perl;
6
7 use Test::More tests => 2;
8 use Test::Warn;
9
10 use MARC::Field;
11 use MARC::Record;
12 use Test::MockModule;
13 use Test::MockObject;
14
15 use t::lib::Mocks;
16
17 #use C4::Biblio qw//;
18 use C4::AuthoritiesMarc;
19 use C4::Biblio;
20 use C4::Circulation;
21 use C4::Items;
22 use Koha::Database;
23 use Koha::DateUtils;
24 use Koha::SearchEngine::Elasticsearch;
25 use Koha::SearchEngine::Indexer;
26
27 use t::lib::TestBuilder;
28 use t::lib::Mocks;
29
30 my $schema  = Koha::Database->new->schema;
31 my $builder = t::lib::TestBuilder->new;
32
33 $schema->storage->txn_begin;
34
35 subtest 'Test indexer object creation' => sub {
36     plan tests => 6;
37
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');
43
44     t::lib::Mocks::mock_preference( 'SearchEngine', 'Elasticsearch' );
45
46     SKIP: {
47
48         eval { Koha::SearchEngine::Elasticsearch->get_elasticsearch_params; };
49
50         skip 'Elasticsearch configuration not available', 4
51             if $@;
52
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");
59
60     }
61 };
62
63 subtest 'Test indexer calls' => sub {
64     plan tests => 40;
65
66     my @engines = ('Zebra');
67     eval { Koha::SearchEngine::Elasticsearch->get_elasticsearch_params; };
68     push @engines, 'Elasticsearch' unless $@;
69     SKIP: {
70     skip 'Elasticsearch configuration not available', 20
71             if scalar @engines == 1;
72     }
73
74     for my $engine ( @engines ){
75         t::lib::Mocks::mock_preference( 'SearchEngine', $engine );
76         my $mock_index = Test::MockModule->new("Koha::SearchEngine::".$engine."::Indexer");
77
78         my $biblionumber1 = $builder->build_sample_biblio()->biblionumber;
79         my $biblionumber2 = $builder->build_sample_biblio()->biblionumber;
80
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 });
84         warnings_are{
85             $indexer->index_records([$biblionumber1,$biblionumber1],"specialUpdate","biblioserver",undef);
86         } ["ModZebra","ModZebra"],"ModZebra called for each record being indexed for $engine";
87
88         $mock_index->mock( index_records => sub {
89             warn $engine;
90             my ($package, undef, undef) = caller;
91             warn $package;
92         });
93
94         my $auth = MARC::Record->new;
95         my $authid;
96         warnings_are{
97             $authid = AddAuthority( $auth, undef, 'TOPIC_TERM' );
98         } [$engine,"C4::AuthoritiesMarc"], "index_records is called for $engine is called when adding authority";
99
100         warnings_are{
101             $authid = DelAuthority({ authid => $authid, skip_merge => 1 });
102         } [$engine,"C4::AuthoritiesMarc"], "index_records is called for $engine is called when adding authority";
103
104         my $biblio;
105         my $biblio2;
106         warnings_are{
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)";
110
111
112         my $item;
113         my $item2;
114         warnings_are{
115             $item = $builder->build_sample_item({
116                 biblionumber => $biblio->biblionumber,
117                 onloan => '2020-02-02',
118                 datelastseen => '2020-01-01'
119             });
120             $item2 = $builder->build_sample_item({
121                 biblionumber => $biblio->biblionumber,
122                 onloan => '2020-12-12',
123                 datelastseen => '2020-11-11'
124             });
125         } [$engine,"Koha::Item",$engine,"Koha::Item"], "index_records is called for $engine when adding an item (Item->store)";
126         warnings_are{
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";
129
130         my $issue = $builder->build({
131             source => 'Issue',
132             value  => {
133                 itemnumber => $item->itemnumber
134             }
135         });
136         my $issue2 = $builder->build({
137             source => 'Issue',
138             value  => {
139                 itemnumber => $item2->itemnumber
140             }
141         });
142         warnings_are{
143             MarkIssueReturned( $issue->{borrowernumber}, $item->itemnumber);
144         } [$engine,"Koha::Item"], "index_records is called for $engine when calling MarkIssueReturned";
145         warnings_are{
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";
148
149         warnings_are{
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({
153             source => 'Issue',
154             value  => {
155                 itemnumber => $item->itemnumber
156             }
157         });
158         warnings_are{
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";
161
162         $builder->build(
163             {
164                 source => 'Branchtransfer',
165                 value  => {
166                     itemnumber    => $item->itemnumber,
167                     datesent      => dt_from_string,
168                     datearrived   => undef,
169                     datecancelled => undef
170                 }
171             }
172         );
173         warnings_are{
174             LostItem( $item->itemnumber, "tests");
175         } [$engine,"Koha::Item"], "index_records is called for $engine when calling LostItem and transfer exists";
176         $builder->build(
177             {
178                 source => 'Branchtransfer',
179                 value  => {
180                     itemnumber    => $item2->itemnumber,
181                     datesent      => dt_from_string,
182                     datearrived   => undef,
183                     datecancelled => undef
184                 }
185             }
186         );
187         warnings_are{
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";
190
191         $item->datelastseen('2020-02-02');
192         $item->store({skip_record_index=>1});
193         warnings_are{
194             my $t1 = ModDateLastSeen( $item->itemnumber, 1, undef );
195         } [$engine, "Koha::Item"], "index_records is called for $engine when calling ModDateLastSeen";
196         warnings_are{
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";
199
200         warnings_are{
201             ModItemTransfer( $item->itemnumber, $item2->homebranch, $item->homebranch,'Manual');
202         } [$engine,"Koha::Item"], "index_records is called for $engine when calling ModItemTransfer";
203         warnings_are{
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";
206
207         warnings_are{
208             $item->delete();
209         } [$engine,"Koha::Item"], "index_records is called for $engine when deleting an item (Item->delete)";
210         warnings_are{
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";
213
214         warnings_are{
215             DelBiblio( $biblio->biblionumber );
216         } [$engine, "C4::Biblio"], "index_records is called for $engine when calling DelBiblio";
217         warnings_are{
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";
220
221     }
222
223 };
224
225 $schema->storage->txn_rollback;