Bug 13937: Add tests for search and retrieval
[koha.git] / t / db_dependent / Koha / Z3950Responder / GenericSession.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4
5 use Test::More tests => 3;
6 use t::lib::Mocks qw(mock_preference);
7
8 use YAML;
9 use ZOOM;
10
11 BEGIN {
12     use_ok('Koha::Z3950Responder');
13     use_ok('Koha::Z3950Responder::GenericSession');
14 }
15
16 our $child;
17
18 subtest 'test_search' => sub {
19
20     plan tests => 9;
21
22     t::lib::Mocks::mock_preference('SearchEngine', 'Elasticsearch');
23
24     my $marc_record_1 = MARC::Record->new();
25     $marc_record_1->leader('     cam  22      a 4500');
26     $marc_record_1->append_fields(
27         MARC::Field->new('001', '123'),
28         MARC::Field->new('020', '', '', a => '1-56619-909-3'),
29         MARC::Field->new('100', '', '', a => 'Author 1'),
30         MARC::Field->new('110', '', '', a => 'Corp Author'),
31         MARC::Field->new('210', '', '', a => 'Title 1'),
32         MARC::Field->new('245', '', '', a => 'Title:', b => 'first record'),
33         MARC::Field->new('999', '', '', c => '1234567'),
34     );
35
36     my $marc_record_2 = MARC::Record->new();
37     $marc_record_2->leader('     cam  22      a 4500');
38     $marc_record_2->append_fields(
39         MARC::Field->new('001', '234'),
40         MARC::Field->new('020', '', '', a => '1-56619-909-3'),
41         MARC::Field->new('100', '', '', a => 'Author 2'),
42         MARC::Field->new('110', '', '', a => 'Corp Author'),
43         MARC::Field->new('210', '', '', a => 'Title 2'),
44         MARC::Field->new('245', '', '', a => 'Title:', b => 'second record'),
45         MARC::Field->new('999', '', '', c => '1234567'),
46     );
47
48     my $yaml = new Test::MockModule('YAML');
49     $yaml->mock('LoadFile', sub {
50         return {
51             biblios => {
52                 use => {
53                     1 => 'author',
54                     4 => 'title'
55                 }
56             }
57         };
58     });
59
60     my $builder = new Test::MockModule('Koha::SearchEngine::Elasticsearch::QueryBuilder');
61     $builder->mock('build_query_compat', sub {
62         my ( $self, $operators, $operands ) = @_;
63
64         return (undef, $operands->[0]);
65     });
66
67     my $search = new Test::MockModule('Koha::SearchEngine::Elasticsearch::Search');
68     $search->mock('simple_search_compat', sub {
69         my ( $self, $query ) = @_;
70
71         return (1, undef, 0) unless $query eq '((author:(author)) AND (title:(title)))';
72
73         my @records = ($marc_record_1, $marc_record_2);
74         return (undef, \@records, 2);
75     });
76
77     $child = fork();
78     if ($child == 0) {
79         my @yaz_options = ( '@:42111' );
80         my $z = Koha::Z3950Responder->new( {
81             config_dir => '',
82             yaz_options => [ @yaz_options ]
83         });
84         $z->start();
85         exit;
86     }
87     sleep(1);
88
89     my $o = new ZOOM::Options();
90     $o->option(preferredRecordSyntax => 'xml');
91     $o->option(elementSetName => 'marcxml');
92     $o->option(databaseName => 'biblios');
93
94     my $Zconn = ZOOM::Connection->create($o);
95     ok($Zconn, 'ZOOM connection created');
96
97     $Zconn->connect('127.0.0.1:42111', 0);
98     is($Zconn->errcode(), 0, 'Connection is successful: ' . $Zconn->errmsg());
99
100     my $rs = $Zconn->search_pqf('@and @attr 1=1 author @attr 1=4 title');
101     is($Zconn->errcode(), 0, 'Search is successful: ' . $Zconn->errmsg());
102
103     is($rs->size(), 2, 'Two results returned');
104
105     my $returned1 = MARC::Record->new_from_xml($rs->record(0)->raw());
106     ok ($returned1, 'Record 1 returned as MARCXML');
107     is($returned1->as_xml, $marc_record_1->as_xml, 'Record 1 returned properly');
108
109     my $returned2= MARC::Record->new_from_xml($rs->record(1)->raw());
110     ok ($returned2, 'Record 2 returned as MARCXML');
111     is($returned2->as_xml, $marc_record_2->as_xml, 'Record 2 returned properly');
112
113     is($rs->record(2), undef, 'Record 3 does not exist');
114
115     cleanup();
116 };
117
118 sub cleanup {
119     if ($child) {
120         kill 9, $child;
121         $child = undef;
122     }
123 }
124
125 # Fall back to make sure that the Zebra process
126 # and files get cleaned up
127 END {
128     cleanup();
129 }