Markdown
[ZOOM-Perl-moved-to-github.git] / t / 23-resultset.t
1 # Before `make install' is performed this script should be runnable with
2 # `make test'. After `make install' it should work as `perl 23-resultset.t'
3
4 use strict;
5 use warnings;
6 use Test::More tests => 24;
7 BEGIN { use_ok('ZOOM') };
8
9 my $host = "z3950.indexdata.com/gils";
10 my $conn;
11 eval { $conn = new ZOOM::Connection($host, 0) };
12 ok(!$@, "connection to '$host'");
13
14 my $query = '@attr 1=4 mineral';
15 my $rs;
16 eval { $rs = $conn->search_pqf($query) };
17 ok(!$@, "search for '$query'");
18 ok($rs->size() == 2, "found 2 records");
19
20 my $syntax = "canmarc";         # not supported
21 $rs->option(preferredRecordSyntax => $syntax);
22 my $val = $rs->option("preferredRecordSyntax");
23 ok($val eq $syntax, "preferred record syntax set to '$val'");
24
25 my $rec = $rs->record(0);
26 my($errcode, $errmsg) = $rec->error();
27 ok($errcode == 238, "can't fetch CANMARC ($errmsg)");
28
29 $rs->option(preferredRecordSyntax => "usmarc");
30 $rec = $rs->record(0);
31 my $data1 = $rec->render();
32 $rs->option(elementSetName => "b");
33 my $data2 = $rec->render();
34 ok($data2 eq $data1, "record doesn't know about RS options");
35 # Now re-fetch record from result-set with new option
36 $rec = $rs->record(0);
37 $data2 = $rec->render();
38 ok(length($data2) < length($data1), "re-fetched record is brief, old was full");
39
40 $rs->option(preferredRecordSyntax => "xml");
41 $rec = $rs->record(0);
42 my $cloned = $rec->clone();
43 ok(defined $cloned, "cloned record");
44 $data2 = $rec->render();
45 ok($data2 =~ /<title>/i, "option for XML syntax is honoured");
46
47 # Now we test ZOOM_resultset_record_immediate(), which should only
48 # work for records that have already been placed in the cache, and
49 # ZOOM_resultset_records() which populates the cache, and
50 # ZOOM_resultset_cache_reset(), which presumably empties it.
51 #
52 $rec = $rs->record_immediate(0);
53 ok(defined $rec, "prefetched record obtained with _immediate()");
54 my $data3 = $rec->render();
55 ok($data3 eq $data2, "_immediate record renders as expected");
56 $rec = $rs->record_immediate(1);
57 #{ use Data::Dumper; print "rec=$rec = ", Dumper($rec) }
58 ok(!defined $rec, "non-prefetched record obtained with _immediate()");
59 $rs->cache_reset();
60 $rec = $rs->record_immediate(0);
61 ok(!defined $rec, "_immediate(0) fails after cache reset");
62 # Fill both cache slots, but with no record array
63 my $tmp = $rs->records(0, 2, 0);
64 ok(!defined $tmp, "resultset_records() returns undef as expected");
65 $rec = $rs->record_immediate(0);
66 ok(defined $rec, "_immediate(0) ok after resultset_records()");
67 # Fetch all records at once using records()
68 $tmp = $rs->records(0, 2, 1);
69 ok(@$tmp == 2, "resultset_records() returned two records");
70 $data3 = $tmp->[0]->render();
71 ok($data3 eq $data2, "record returned from resultset_records() renders as expected");
72 $rec = $rs->record_immediate(1);
73 ok(defined $rec, "_immediate(1) ok after resultset_records()");
74
75 $rs->destroy();
76 ok(1, "destroyed result-set");
77 $conn->destroy();
78 ok(1, "destroyed connection");
79
80 $data3 = $cloned->render();
81 ok(1, "rendered cloned record after its result-set was destroyed");
82 ok($data3 eq $data2, "render of clone as expected");
83 $cloned->destroy();
84 ok(1, "destroyed cloned record");