Bug 26581: (follow-up) Skip merge when deleting authority
[koha.git] / 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::SearchEngine::Elasticsearch;
24 use Koha::SearchEngine::Indexer;
25
26 use t::lib::TestBuilder;
27 use t::lib::Mocks;
28
29 my $schema  = Koha::Database->new->schema;
30 my $builder = t::lib::TestBuilder->new;
31
32 $schema->storage->txn_begin;
33
34 subtest 'Test indexer object creation' => sub {
35     plan tests => 6;
36
37     t::lib::Mocks::mock_preference( 'SearchEngine', 'Zebra' );
38     my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX });
39     is( ref $indexer, 'Koha::SearchEngine::Zebra::Indexer', 'We get the correct class for Zebra biblios');
40     $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::AUTHORITIES_INDEX });
41     is( ref $indexer, 'Koha::SearchEngine::Zebra::Indexer', 'We get the correct class for Zebra authorities');
42
43     t::lib::Mocks::mock_preference( 'SearchEngine', 'Elasticsearch' );
44
45     SKIP: {
46
47         eval { Koha::SearchEngine::Elasticsearch->get_elasticsearch_params; };
48
49         skip 'Elasticsearch configuration not available', 4
50             if $@;
51
52         $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX });
53         is( ref $indexer, 'Koha::SearchEngine::Elasticsearch::Indexer', 'We get the correct class for Elasticsearch biblios');
54         ok( $indexer->index_name =~ /biblios$/, "The index is set correctly for biblios");
55         $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::AUTHORITIES_INDEX });
56         is( ref $indexer, 'Koha::SearchEngine::Elasticsearch::Indexer', 'We get the correct class for Elasticsearch authorities');
57         ok( $indexer->index_name =~ /authorities$/, "The index is set correctly for authorities");
58
59     }
60 };
61
62 subtest 'Test indexer calls' => sub {
63     plan tests => 40;
64
65     my @engines = ('Zebra');
66     eval { Koha::SearchEngine::Elasticsearch->get_elasticsearch_params; };
67     push @engines, 'Elasticsearch' unless $@;
68     SKIP: {
69     skip 'Elasticsearch configuration not available', 20
70             if scalar @engines == 1;
71     }
72
73     for my $engine ( @engines ){
74         t::lib::Mocks::mock_preference( 'SearchEngine', $engine );
75         my $mock_index = Test::MockModule->new("Koha::SearchEngine::".$engine."::Indexer");
76
77         my $biblionumber1 = $builder->build_sample_biblio()->biblionumber;
78         my $biblionumber2 = $builder->build_sample_biblio()->biblionumber;
79
80         my $mock_zebra = Test::MockModule->new("Koha::SearchEngine::Zebra::Indexer");
81         $mock_zebra->mock( ModZebra => sub { warn "ModZebra"; } );
82         my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX });
83         warnings_are{
84             $indexer->index_records([$biblionumber1,$biblionumber1],"specialUpdate","biblioserver",undef);
85         } ["ModZebra","ModZebra"],"ModZebra called for each record being indexed for $engine";
86
87         $mock_index->mock( index_records => sub {
88             warn $engine;
89             my ($package, undef, undef) = caller;
90             warn $package;
91         });
92
93         my $auth = MARC::Record->new;
94         my $authid;
95         warnings_are{
96             $authid = AddAuthority( $auth, undef, 'TOPIC_TERM' );
97         } [$engine,"C4::AuthoritiesMarc"], "index_records is called for $engine is called when adding authority";
98
99         warnings_are{
100             $authid = DelAuthority({ authid => $authid, skip_merge => 1 });
101         } [$engine,"C4::AuthoritiesMarc"], "index_records is called for $engine is called when adding authority";
102
103         my $biblio;
104         my $biblio2;
105         warnings_are{
106             $biblio = $builder->build_sample_biblio();
107             $biblio2 = $builder->build_sample_biblio();
108         } [$engine,'C4::Biblio',$engine,'C4::Biblio'], "index_records is called for $engine when adding a biblio (ModBiblioMarc)";
109
110
111         my $item;
112         my $item2;
113         warnings_are{
114             $item = $builder->build_sample_item({
115                 biblionumber => $biblio->biblionumber,
116                 onloan => '2020-02-02',
117                 datelastseen => '2020-01-01'
118             });
119             $item2 = $builder->build_sample_item({
120                 biblionumber => $biblio->biblionumber,
121                 onloan => '2020-12-12',
122                 datelastseen => '2020-11-11'
123             });
124         } [$engine,"Koha::Item",$engine,"Koha::Item"], "index_records is called for $engine when adding an item (Item->store)";
125         warnings_are{
126             $item->store({ skip_record_index => 1 });
127         } undef, "index_records is not called for $engine when adding an item (Item->store) if skip_record_index passed";
128
129         my $issue = $builder->build({
130             source => 'Issue',
131             value  => {
132                 itemnumber => $item->itemnumber
133             }
134         });
135         my $issue2 = $builder->build({
136             source => 'Issue',
137             value  => {
138                 itemnumber => $item2->itemnumber
139             }
140         });
141         warnings_are{
142             MarkIssueReturned( $issue->{borrowernumber}, $item->itemnumber);
143         } [$engine,"Koha::Item"], "index_records is called for $engine when calling MarkIssueReturned";
144         warnings_are{
145             MarkIssueReturned( $issue2->{borrowernumber}, $item2->itemnumber, undef, undef, { skip_record_index => 1});
146         } undef, "index_records is not called for $engine when calling MarkIssueReturned if skip_record_index passed";
147
148         warnings_are{
149             AddReturn($item->barcode, $item->homebranch, 0, undef);
150         } [$engine,'C4::Circulation'], "index_records is called once for $engine when calling AddReturn if item not issued";
151         $issue = $builder->build({
152             source => 'Issue',
153             value  => {
154                 itemnumber => $item->itemnumber
155             }
156         });
157         warnings_are{
158             AddReturn($item->barcode, $item->homebranch, 0, undef);
159         } [$engine,'C4::Circulation'], "index_records is called once for $engine when calling AddReturn if item not issued";
160
161         $builder->build({
162             source => 'Branchtransfer',
163             value => {
164                 itemnumber => $item->itemnumber,
165                 datearrived => undef}
166         });
167         warnings_are{
168             LostItem( $item->itemnumber, "tests");
169         } [$engine,"Koha::Item"], "index_records is called for $engine when calling LostItem and transfer exists";
170         $builder->build({
171             source => 'Branchtransfer',
172             value => {
173                 itemnumber => $item2->itemnumber,
174                 datearrived => undef}
175         });
176         warnings_are{
177             LostItem( $item->itemnumber, "tests", undef, { skip_record_index => 1 });
178         } undef, "index_records is not called for $engine when calling LostItem and transfer exists if skip_record_index";
179
180         $item->datelastseen('2020-02-02');
181         $item->store({skip_record_index=>1});
182         warnings_are{
183             my $t1 = ModDateLastSeen( $item->itemnumber, 1, undef );
184         } [$engine, "Koha::Item"], "index_records is called for $engine when calling ModDateLastSeen";
185         warnings_are{
186             ModDateLastSeen( $item->itemnumber, 1, { skip_record_index =>1 } );
187         } undef, "index_records is not called for $engine when calling ModDateLastSeen if skip_record_index";
188
189         warnings_are{
190             ModItemTransfer( $item->itemnumber, $item->homebranch, $item2->homebranch,'Manual');
191         } [$engine,"Koha::Item"], "index_records is called for $engine when calling ModItemTransfer";
192         warnings_are{
193             ModItemTransfer( $item->itemnumber, $item2->homebranch, $item->homebranch,'Manual',{skip_record_index=>1});
194         } undef, "index_records is not called for $engine when calling ModItemTransfer with skip_record_index";
195
196         warnings_are{
197             $item->delete();
198         } [$engine,"Koha::Item"], "index_records is called for $engine when deleting an item (Item->delete)";
199         warnings_are{
200             $item2->delete({ skip_record_index => 1 });
201         } undef, "index_records is not called for $engine when adding an item (Item->store) if skip_record_index passed";
202
203         warnings_are{
204             DelBiblio( $biblio->biblionumber );
205         } [$engine, "C4::Biblio"], "index_records is called for $engine when calling DelBiblio";
206         warnings_are{
207             DelBiblio( $biblio->biblionumber, { skip_record_index =>1 });
208         } undef, "index_records is not called for $engine when calling DelBiblio if skip_record_index passed";
209
210     }
211
212 };
213
214 $schema->storage->txn_rollback;