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