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