1 # $Id: 22-query.t,v 1.4 2005-12-22 08:58:27 mike Exp $
3 # Before `make install' is performed this script should be runnable with
4 # `make test'. After `make install' it should work as `perl 22-query.t'
8 use Test::More tests => 31;
9 BEGIN { use_ok('ZOOM') };
11 #ZOOM::Log::init_level(ZOOM::Log::mask_str("zoom"));
14 eval { $q = new ZOOM::Query() };
15 ok(defined $@ && $@ =~ /can.t create ZOOM::Query/,
16 "instantiation of ZOOM::Query base class rejected");
18 ok(1, "[no query to destroy]");
20 ok(1, "[no need to recreate empty query]");
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
25 $q = new ZOOM::Query::CQL("creator=pike and");
26 ok(defined $q, "invalid CQL accepted (pass-through)");
27 $q = new ZOOM::Query::CQL("creator=pike and subject=unix");
28 ok(defined $q, "valid CQL accepted");
30 eval { $q = new ZOOM::Query::PQF('@and @attr 1=1003 pike') };
31 ok($@ && $@->isa("ZOOM::Exception") &&
32 $@->code() == ZOOM::Error::QUERY_PQF,
33 "invalid PQF rejected");
35 eval { $q = new ZOOM::Query::PQF('@and @attr 1=1003 pike @attr 1=21 unix') };
36 ok(!$@, "set PQF into query");
38 eval { $q->sortby("") };
39 ok($@ && $@->isa("ZOOM::Exception") &&
40 $@->code() == ZOOM::Error::SORTBY,
41 "zero-length sort criteria rejected");
43 eval { $q->sortby("foo bar baz") };
44 ok(!$@, "sort criteria accepted");
47 ok(1, "destroyed complex query");
49 # Up till now, we have been doing query management. Now to actually
50 # use the query. This is done using Connection::search() -- there are
51 # no other uses of query objects -- but we need to establish a
52 # connection for it to work on first.
54 my $host = "indexdata.com/gils";
56 eval { $conn = new ZOOM::Connection($host, 0) };
57 ok(!$@, "connection to '$host'");
58 $conn->option(preferredRecordSyntax => "usmarc");
60 ok(1, "[no need to create empty query]");
61 eval { $q = new ZOOM::Query::PQF('@and @attr 1=4 utah @attr 1=62 epicenter') };
62 ok(!$@, "created PQF query");
63 check_record($conn, $q);
66 # Now try a CQL query: this will fail due to lack of server support
67 ok(1, "[no need to create empty query]");
68 eval { $q = new ZOOM::Query::CQL('title=utah and description=epicenter') };
69 ok(!$@, "created CQL query");
70 #check_failure($conn, $q, 107, "Bib-1");
72 # Client-side compiled CQL: this will fail due to lack of config-file
73 ok(1, "[no need to create empty query]");
74 eval { $q = new ZOOM::Query::CQL2RPN('title=utah and description=epicenter',
76 ok($@ && $@->isa("ZOOM::Exception") &&
77 $@->code() == ZOOM::Error::CQL_TRANSFORM && $@->diagset() eq "ZOOM",
78 "can't make CQL2RPN query: error " . $@->code());
80 # Finally, do a successful client-compiled CQL search
81 ok(1, "[no need to create empty query]");
82 $conn->option(cqlfile => "samples/cql/pqf.properties");
83 eval { $q = new ZOOM::Query::CQL2RPN('title=utah and description=epicenter',
85 ok(!$@, "created CQL2RPN query: \@=$@");
86 check_record($conn, $q);
89 ok(1, "destroyed all objects");
96 eval { $rs = $conn->search($q) };
101 ok($n == 1, "found 1 record as expected");
103 my $rec = $rs->record(0);
104 ok(1, "got record idenfified by query");
106 my $data = $rec->render();
107 ok(1, "rendered record");
108 ok($data =~ /^035 +\$a ESDD0006$/m, "record is the expected one");
115 my($conn, $q, $expected_error, $expected_dset) = @_;
118 eval { $rs = $conn->search($q) };
119 ok($@ && $@->isa("ZOOM::Exception") &&
120 $@->code() == $expected_error && $@->diagset() eq $expected_dset,
121 "query rejected: error " . $@->code());