Bug 28931: Remove unused Koha::DateUtils from tests
[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 qw( AddAuthority DelAuthority merge );
19 use C4::Biblio qw( ModZebra ModBiblio ModBiblioMarc DelBiblio );
20 use C4::Circulation qw( MarkIssueReturned AddReturn LostItem );
21 use C4::Items qw( ModDateLastSeen ModItemTransfer );
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 => 48;
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     t::lib::Mocks::mock_preference( 'BiblioAddsAuthorities', 0 );
74
75     for my $engine ( @engines ){
76         t::lib::Mocks::mock_preference( 'SearchEngine', $engine );
77         my $mock_index = Test::MockModule->new("Koha::SearchEngine::".$engine."::Indexer");
78
79         my $biblionumber1 = $builder->build_sample_biblio()->biblionumber;
80         my $biblionumber2 = $builder->build_sample_biblio()->biblionumber;
81
82         my $mock_zebra = Test::MockModule->new("Koha::SearchEngine::Zebra::Indexer");
83         $mock_zebra->mock( ModZebra => sub { warn "ModZebra"; } );
84         my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX });
85         warnings_are{
86             $indexer->index_records([$biblionumber1,$biblionumber1],"specialUpdate","biblioserver",undef);
87         } ["ModZebra","ModZebra"],"ModZebra called for each record being indexed for $engine";
88
89         $mock_index->mock( index_records => sub {
90             warn $engine;
91             my ($package, undef, undef) = caller;
92             warn $package;
93         });
94
95         my $auth = MARC::Record->new;
96         my $authid;
97         warnings_are{
98             $authid = AddAuthority( $auth, undef, 'TOPIC_TERM' );
99         } [$engine,"C4::AuthoritiesMarc"], "index_records is called for $engine is called when adding authority";
100
101         warnings_are{
102             $authid = DelAuthority({ authid => $authid, skip_merge => 1 });
103         } [$engine,"C4::AuthoritiesMarc"], "index_records is called for $engine is called when adding authority";
104
105         my $biblio;
106         my $biblio2;
107         my $biblio3;
108         warnings_are{
109             $biblio = $builder->build_sample_biblio();
110             $biblio2 = $builder->build_sample_biblio();
111             $biblio3 = $builder->build_sample_biblio();
112         } [$engine,'C4::Biblio',$engine,'C4::Biblio',$engine,'C4::Biblio'], "index_records is called for $engine when adding a biblio (ModBiblioMarc)";
113
114         my $item;
115         my $item2;
116         my $item3;
117         my $item4;
118         my $item5;
119         my $item6;
120         warnings_are{
121             $item = $builder->build_sample_item({
122                 biblionumber => $biblio->biblionumber,
123                 onloan => '2020-02-02',
124                 datelastseen => '2020-01-01',
125                 replacementprice => 0
126             });
127             $item2 = $builder->build_sample_item({
128                 biblionumber => $biblio->biblionumber,
129                 onloan => '2020-12-12',
130                 datelastseen => '2020-11-11',
131                 replacementprice => 0
132             });
133             $item3 = $builder->build_sample_item({biblionumber => $biblio->biblionumber});
134             $item4 = $builder->build_sample_item({biblionumber => $biblio->biblionumber});
135             $item5 = $builder->build_sample_item({biblionumber => $biblio3->biblionumber});
136             $item6 = $builder->build_sample_item({biblionumber => $biblio3->biblionumber});
137         } [$engine,"Koha::Item",
138            $engine,"Koha::Item",
139            $engine,"Koha::Item",
140            $engine,"Koha::Item",
141            $engine,"Koha::Item",
142            $engine,"Koha::Item"], "index_records is called for $engine when adding an item (Item->store)";
143         warnings_are{
144             $item->store({ skip_record_index => 1 });
145         } undef, "index_records is not called for $engine when adding an item (Item->store) if skip_record_index passed";
146
147         my $issue = $builder->build({
148             source => 'Issue',
149             value  => {
150                 itemnumber => $item->itemnumber
151             }
152         });
153         my $issue2 = $builder->build({
154             source => 'Issue',
155             value  => {
156                 itemnumber => $item2->itemnumber
157             }
158         });
159         warnings_are{
160             MarkIssueReturned( $issue->{borrowernumber}, $item->itemnumber);
161         } [$engine,"Koha::Item"], "index_records is called for $engine when calling MarkIssueReturned";
162         warnings_are{
163             MarkIssueReturned( $issue2->{borrowernumber}, $item2->itemnumber, undef, undef, { skip_record_index => 1});
164         } undef, "index_records is not called for $engine when calling MarkIssueReturned if skip_record_index passed";
165
166         warnings_are{
167             AddReturn($item->barcode, $item->homebranch, 0, undef);
168         } [$engine,'C4::Circulation'], "index_records is called once for $engine when calling AddReturn if item not issued";
169         $issue = $builder->build({
170             source => 'Issue',
171             value  => {
172                 itemnumber => $item->itemnumber
173             }
174         });
175         warnings_are{
176             AddReturn($item->barcode, $item->homebranch, 0, undef);
177         } [$engine,'C4::Circulation'], "index_records is called once for $engine when calling AddReturn if item not issued";
178
179         warnings_are{
180             $item3->move_to_biblio($biblio2);
181         } [$engine,"Koha::Item",$engine,"Koha::Item"], "index_records is called twice for $engine when moving an item to another biblio (Item->move_to_biblio)";
182         warnings_are{
183             $item4->move_to_biblio($biblio2, { skip_record_index => 1 });
184         } undef, "index_records is not called for $engine when moving an item to another biblio (Item->move_to_biblio) if skip_record_index passed";
185
186         warnings_are{
187             $biblio->items->move_to_biblio($biblio2);
188         } [$engine,"Koha::Items",$engine,"Koha::Items"], "index_records is called for from and to biblios for $engine when adopting items (Biblio->items->move_to_biblio(Biblio)";
189
190         my $items = Koha::Items->search({ itemnumber => [ $item2->itemnumber, $item5->itemnumber, $item6->itemnumber ] });
191         warnings_are{
192             $items->move_to_biblio($biblio);
193         } [$engine,"Koha::Items",$engine,"Koha::Items",$engine,"Koha::Items"], "index_records is called for all from and to biblios for $engine when adopting items (Items->move_to_biblio(Biblio)";
194
195         $builder->build({
196             source => 'Issue',
197             value  => {
198                 itemnumber => $item->itemnumber
199             }
200         });
201         $item->onloan('2000-01-01')->store({ skip_record_index => 1 });
202         warnings_are{
203             LostItem( $item->itemnumber, "tests", 1);
204         } [$engine,"Koha::Item"], "index_records is called for $engine when calling LostItem with 'force_mark_returned'";
205         $builder->build({
206             source => 'Issue',
207             value  => {
208                 itemnumber => $item->itemnumber
209             }
210         });
211         $item->onloan('2000-01-01')->store({ skip_record_index => 1 });
212         warnings_are{
213             LostItem( $item->itemnumber, "tests", 1, { skip_record_index => 1 });
214         } undef, "index_records is not called for $engine when calling LostItem with 'force_mark_returned' if skip_record_index";
215
216         $item->datelastseen('2001-01-01')->store({skip_record_index=>1});
217         warnings_are{
218             my $t1 = ModDateLastSeen( $item->itemnumber, 1, undef );
219         } [$engine, "Koha::Item"], "index_records is called for $engine when calling ModDateLastSeen";
220         warnings_are{
221             ModDateLastSeen( $item->itemnumber, 1, { skip_record_index =>1 } );
222         } undef, "index_records is not called for $engine when calling ModDateLastSeen if skip_record_index";
223
224         warnings_are{
225             ModItemTransfer( $item->itemnumber, $item2->homebranch, $item->homebranch,'Manual');
226         } [$engine,"Koha::Item"], "index_records is called for $engine when calling ModItemTransfer";
227         warnings_are{
228             ModItemTransfer( $item->itemnumber, $item->homebranch, $item2->homebranch,'Manual',{skip_record_index=>1});
229         } undef, "index_records is not called for $engine when calling ModItemTransfer with skip_record_index";
230
231         warnings_are{
232             $item->delete();
233         } [$engine,"Koha::Item"], "index_records is called for $engine when deleting an item (Item->delete)";
234         warnings_are{
235             $item2->delete({ skip_record_index => 1 });
236         } undef, "index_records is not called for $engine when adding an item (Item->store) if skip_record_index passed";
237
238         warnings_are{
239             DelBiblio( $biblio3->biblionumber );
240         } [$engine, "C4::Biblio"], "index_records is called for $engine when calling DelBiblio";
241         warnings_are{
242             DelBiblio( $biblio3->biblionumber, { skip_record_index =>1 });
243         } undef, "index_records is not called for $engine when calling DelBiblio if skip_record_index passed";
244
245     }
246
247 };
248
249 $schema->storage->txn_rollback;