768c27e4415b3e2eec7cd48250ddbecf0860c8d8
[ZOOM-Perl-moved-to-github.git] / t / 12-query.t
1 # $Id: 12-query.t,v 1.11 2008-05-14 13:32:55 mike Exp $
2
3 # Before `make install' is performed this script should be runnable with
4 # `make test'. After `make install' it should work as `perl 12-query.t'
5
6 use strict;
7 use warnings;
8 use Test::More tests => 41;
9 BEGIN { use_ok('Net::Z3950::ZOOM') };
10
11 # Net::Z3950::ZOOM::yaz_log_init_level(Net::Z3950::ZOOM::yaz_log_mask_str("zoom"));
12
13 my $q = Net::Z3950::ZOOM::query_create();
14 ok(defined $q, "create empty query");
15
16 Net::Z3950::ZOOM::query_destroy($q);
17 ok(1, "destroyed empty query");
18
19 $q = Net::Z3950::ZOOM::query_create();
20 ok(defined $q, "recreated empty query");
21
22 # Invalid CQL is not recognised as such, because ZOOM-C does not
23 # attempt to parse it: it just gets passed to the server when the
24 # query is used.
25 my $res = Net::Z3950::ZOOM::query_cql($q, "creator=pike and");
26 ok($res == 0, "invalid CQL accepted (pass-through)");
27 $res = Net::Z3950::ZOOM::query_cql($q, "creator=pike and subject=unix");
28 ok($res == 0, "valid CQL accepted");
29
30 $res = Net::Z3950::ZOOM::query_prefix($q, '@and @attr 1=1003 pike');
31 ok($res < 0, "invalid PQF rejected");
32 $res = Net::Z3950::ZOOM::query_prefix($q, '@and @attr 1=1003 pike @attr 1=21 unix');
33 ok($res == 0, "set PQF into query");
34
35 $res = Net::Z3950::ZOOM::query_sortby($q, "");
36 ok($res < 0, "zero-length sort criteria rejected");
37
38 $res = Net::Z3950::ZOOM::query_sortby($q, "foo bar baz");
39 ok($res == 0, "sort criteria accepted");
40
41 Net::Z3950::ZOOM::query_destroy($q);
42 ok(1, "destroyed complex query");
43
44 # Up till now, we have been doing query management.  Now to actually
45 # use the query.  This is done using connection_search() -- there are
46 # no other uses of query objects -- but we need to establish a
47 # connection for it to work on first.
48
49 my $host = "z3950.indexdata.com/gils";
50 my $conn = Net::Z3950::ZOOM::connection_new($host, 0);
51 my($errcode, $errmsg, $addinfo) = (undef, "dummy", "dummy");
52 $errcode = Net::Z3950::ZOOM::connection_error($conn, $errmsg, $addinfo);
53 ok($errcode == 0, "connection to '$host'");
54
55 Net::Z3950::ZOOM::connection_option_set($conn,
56                                         preferredRecordSyntax => "usmarc");
57
58 $q = Net::Z3950::ZOOM::query_create();
59 ok(defined $q, "create empty query");
60 $res = Net::Z3950::ZOOM::query_prefix($q,
61                         '@and @attr 1=4 utah @attr 1=62 epicenter');
62 ok($res == 0, "set PQF into query");
63 check_record($conn, $q);
64 Net::Z3950::ZOOM::query_destroy($q);
65
66 # Now try a CQL query: this will fail due to lack of server support
67 $q = Net::Z3950::ZOOM::query_create();
68 ok(defined $q, "create empty query");
69 $res = Net::Z3950::ZOOM::query_cql($q, 'title=utah and description=epicenter');
70 ok($res == 0, "valid CQL accepted");
71 my $rs = Net::Z3950::ZOOM::connection_search($conn, $q);
72 my $diagset = "dummy";
73 $errcode = Net::Z3950::ZOOM::connection_error_x($conn, $errmsg, $addinfo,
74                                                 $diagset);
75 ok($errcode == 107 && $diagset eq "Bib-1",
76    "query rejected: error " . $errcode);
77 Net::Z3950::ZOOM::query_destroy($q);
78
79 # Client-side compiled CQL: this will fail due to lack of config-file
80 $q = Net::Z3950::ZOOM::query_create();
81 ok(defined $q, "create empty query");
82 $res = Net::Z3950::ZOOM::query_cql2rpn($q,
83                                        'title=utah and description=epicenter',
84                                        $conn);
85 $errcode = Net::Z3950::ZOOM::connection_error_x($conn, $errmsg, $addinfo,
86                                                 $diagset);
87 ok($res < 0 &&
88    $errcode == Net::Z3950::ZOOM::ERROR_CQL_TRANSFORM &&
89    $diagset eq "ZOOM",
90    "can't make CQL2RPN query: error " . $errcode);
91 Net::Z3950::ZOOM::query_destroy($q);
92
93 # Do a successful client-compiled CQL search
94 $q = Net::Z3950::ZOOM::query_create();
95 ok(defined $q, "create empty query");
96 Net::Z3950::ZOOM::connection_option_set($conn, cqlfile =>
97                                         "samples/cql/pqf.properties");
98 $res = Net::Z3950::ZOOM::query_cql2rpn($q,
99                                        'title=utah and description=epicenter',
100                                        $conn);
101 ok($res == 0, "created CQL2RPN query");
102 check_record($conn, $q);
103 Net::Z3950::ZOOM::query_destroy($q);
104
105 # Client-side compiled CCL: this will fail due to incorrect syntax
106 $q = Net::Z3950::ZOOM::query_create();
107 ok(defined $q, "create empty query");
108 my($ccl_errcode, $ccl_errstr, $ccl_errpos) = (0, "", 0);
109
110 $res = Net::Z3950::ZOOM::query_ccl2rpn($q,
111                                        'ti=utah and',
112                                        "ti u=4 s=pw\nab u=62 s=pw",
113                                        $ccl_errcode, $ccl_errstr, $ccl_errpos);
114 ok($res < 0 &&
115    $ccl_errcode == Net::Z3950::ZOOM::CCL_ERR_TERM_EXPECTED,
116    "can't make CCL2RPN query: error $ccl_errcode ($ccl_errstr)");
117 Net::Z3950::ZOOM::query_destroy($q);
118
119 # Do a successful client-compiled CCL search
120 $q = Net::Z3950::ZOOM::query_create();
121 ok(defined $q, "create empty query");
122 $res = Net::Z3950::ZOOM::query_ccl2rpn($q,
123                                        'ti=utah and ab=epicenter',
124                                        "ti u=4 s=pw\nab u=62 s=pw",
125                                        $ccl_errcode,
126                                        $ccl_errstr,
127                                        $ccl_errpos);
128 ok($res == 0, "created CCL2RPN query");
129 check_record($conn, $q);
130 Net::Z3950::ZOOM::query_destroy($q);
131
132 Net::Z3950::ZOOM::connection_destroy($conn);
133 ok(1, "destroyed all objects");
134
135
136 sub check_record {
137     my($conn, $q) = @_;
138
139     my $rs = Net::Z3950::ZOOM::connection_search($conn, $q);
140     my($errcode, $errmsg, $addinfo) = (undef, "dummy", "dummy");
141     $errcode = Net::Z3950::ZOOM::connection_error($conn, $errmsg, $addinfo);
142     ok($errcode == 0, "search");
143
144     my $n = Net::Z3950::ZOOM::resultset_size($rs);
145     ok($n == 1, "found 1 record as expected");
146
147     my $rec = Net::Z3950::ZOOM::resultset_record($rs, 0);
148     ok(1, "got record idenfified by query");
149
150     my $data = Net::Z3950::ZOOM::record_get($rec, "render");
151     ok(1, "rendered record");
152     ok($data =~ /^035    \$a ESDD0006$/m, "record is the expected one");
153
154     Net::Z3950::ZOOM::resultset_destroy($rs);
155 }