/[Search-Estraier]/trunk/t/5_Node.t
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/t/5_Node.t

Parent Directory Parent Directory | Revision Log Revision Log


Revision 189 - (hide annotations)
Sun Nov 5 16:23:03 2006 UTC (17 years, 5 months ago) by dpavlin
File MIME type: application/x-troff
File size: 11628 byte(s)
test set_distinct
1 dpavlin 28 #!/usr/bin/perl -w
2    
3     use strict;
4     use blib;
5    
6 dpavlin 189 my $tests = 311;
7 dpavlin 152
8     use Test::More;
9 dpavlin 28 use Test::Exception;
10     use Data::Dumper;
11    
12     BEGIN { use_ok('Search::Estraier') };
13    
14 dpavlin 152 plan tests => $tests;
15    
16 dpavlin 148 my $debug = shift @ARGV;
17 dpavlin 40
18 dpavlin 35 # name of node for test
19 dpavlin 137 my $test1_node = '_test1_' . $$;
20     my $test2_node = '_test2_' . $$;
21 dpavlin 35
22 dpavlin 152 my $estmaster_uri = $ENV{'ESTMASTER_URI'} || 'http://localhost:1978';
23    
24 dpavlin 57 ok(my $node = new Search::Estraier::Node( debug => $debug ), 'new');
25 dpavlin 28 isa_ok($node, 'Search::Estraier::Node');
26    
27 dpavlin 152 ok($node->set_url("$estmaster_uri/node/$test1_node"), "set_url $test1_node");
28 dpavlin 29
29 dpavlin 38 ok($node->set_proxy('', 8080), 'set_proxy');
30 dpavlin 30 throws_ok {$node->set_proxy('proxy.example.com', 'foo') } qr/port/, 'set_proxy port NaN';
31    
32     ok($node->set_timeout(42), 'set_timeout');
33     throws_ok {$node->set_timeout('foo') } qr/timeout/, 'set_timeout NaN';
34 dpavlin 31
35 dpavlin 153 my ($user, $passwd) = (
36     $ENV{EST_USER} || 'admin',
37     $ENV{EST_PASSWD} || 'admin'
38     );
39 dpavlin 32
40 dpavlin 153 ok($node->set_auth($user, $passwd), 'set_auth');
41    
42 dpavlin 32 cmp_ok($node->status, '==', -1, 'status');
43 dpavlin 35
44 dpavlin 134 # test master functionality
45    
46 dpavlin 152 SKIP: {
47    
48     skip "can't find estmaster at $estmaster_uri", ($tests - 9) if (! eval { $node->master( action => 'nodelist' ) } );
49    
50     diag "using $estmaster_uri";
51 dpavlin 151 diag("node->master shutdown not tested");
52 dpavlin 134
53 dpavlin 151 diag("node->master backup not tested");
54 dpavlin 134
55 dpavlin 135 ok(my @users = $node->master( action => 'userlist' ), 'userlist');
56    
57 dpavlin 137 #diag "users: ", Dumper( \@users );
58     diag "found ", $#users + 1, " users";
59 dpavlin 135
60 dpavlin 137 my $user = {
61     name => '_test_' . $$,
62     flags => 'b',
63     fname => 'Search::Estraier',
64     misc => 'test user',
65     };
66 dpavlin 73
67 dpavlin 151 my $msg;
68 dpavlin 137 ok($msg = $node->master(
69     action => 'useradd',
70     %{ $user },
71     passwd => 'test1234',
72     ), "useradd: $msg");
73 dpavlin 73
74 dpavlin 137 ok(my @users2 = $node->master( action => 'userlist' ), 'userlist');
75     cmp_ok($#users2, '==', $#users + 1, 'added user');
76 dpavlin 38
77 dpavlin 137 while (my $row = shift @users2) {
78     next unless ($row->{name} eq $user);
79     map {
80     cmp_ok($user->{$_}, 'eq', $row->{$_}, "$_");
81     } keys %{ $user };
82 dpavlin 37 }
83 dpavlin 35
84 dpavlin 137 ok($msg = $node->master(
85     action => 'userdel',
86     name => $user->{name},
87     ), "userdel: $msg");
88    
89     ok(@users2 = $node->master( action => 'userlist' ), 'userlist');
90     cmp_ok($#users2, '==', $#users, 'removed user');
91    
92     ok(my @nodes = $node->master( action => 'nodelist' ), 'nodelist' );
93     #diag "nodelist: ", Dumper( \@nodes );
94     diag "found ", $#nodes + 1, " nodes";
95    
96     if ($#nodes > 42) {
97     diag <<'_END_OF_WARNING_';
98    
99     This tests create three nodes in your Hyper Estraier.
100    
101 dpavlin 138 Since you have more than 43 modes, and Hyper Estraier needs more than
102     1024 file descriptors for more than 46 nodes, expect tests to fail.
103 dpavlin 137
104 dpavlin 138 If tests do fail, you can try to add
105    
106     ulimit -n 2048
107    
108     before staring estmaster, which will increase number of available nodes
109     to 96 before estmaster runs out of file descriptors.
110    
111 dpavlin 137 _END_OF_WARNING_
112     }
113    
114     my $temp_node = "_test_temp_$$";
115    
116     foreach my $node_name ( $test1_node , $test2_node, $temp_node ) {
117     ok($msg = $node->master(
118     action => 'nodeadd',
119     name => $node_name,
120     label => "$node_name label",
121     ), "nodeadd $node_name: $msg");
122     }
123    
124     ok($msg = $node->master(
125     action => 'nodedel',
126     name => $temp_node,
127     ), "nodedel $temp_node: $msg");
128    
129     #diag "not testing logrtt\n";
130    
131     # test document creation
132    
133 dpavlin 35 my $draft = <<'_END_OF_DRAFT_';
134 dpavlin 148 @uri=data0
135 dpavlin 35 @title=Material Girl
136    
137     Living in a material world
138     And I am a material girl
139     You know that we are living in a material world
140     And I am a material girl
141     _END_OF_DRAFT_
142    
143 dpavlin 40 #diag "draft:\n$draft";
144     ok(my $doc = new Search::Estraier::Document($draft), 'new doc from draft');
145    
146 dpavlin 46 ok( $node->put_doc($doc), "put_doc data001");
147    
148 dpavlin 148 for ( 1 .. 17 ) {
149 dpavlin 41 $doc->add_attr('@uri', 'test' . $_);
150 dpavlin 187 $doc->set_score( $_ * 10000 );
151 dpavlin 41 ok( $node->put_doc($doc), "put_doc test$_");
152     #diag $doc->dump_draft;
153 dpavlin 151 cmp_ok( $node->doc_num, '==', ($_ + 1), "node->doc_num " . ($_ + 1));
154 dpavlin 41 }
155    
156 dpavlin 148 ok(! $node->uri_to_id( 'does-not-exists' ), "non-existant uri_to_id");
157    
158 dpavlin 50 my $id;
159 dpavlin 148 ok($id = $node->uri_to_id( 'data0' ), "uri_to_id(data0)");
160 dpavlin 41
161 dpavlin 169 throws_ok { $node->get_doc( 'foo') } qr/id must be number/, 'croak on non-number';
162    
163 dpavlin 148 ok($doc = $node->get_doc( $id ), "get_doc($id) for edit");
164     $doc->add_attr('foo', 'bar');
165     #diag Dumper($doc);
166     ok( $node->edit_doc( $doc ), 'edit_doc');
167 dpavlin 100
168 dpavlin 150 my $doc_num;
169     ok( $doc_num = $node->doc_num, "node->doc_num $doc_num");
170    
171 dpavlin 148 ok( $node->out_doc( $id ), "out_doc($id)");
172    
173 dpavlin 150 cmp_ok( $node->doc_num, '==', --$doc_num, "node->doc_num " . $doc_num);
174    
175 dpavlin 148 ok( ! $node->edit_doc( $doc ), "edit_doc of removed doc");
176    
177 dpavlin 160 my $cache;
178     ok($cache = $node->cacheusage, "cacheusage: $cache");
179    
180 dpavlin 148 my $delete_num = 5;
181    
182     for ( 1 .. $delete_num ) {
183 dpavlin 43 ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");
184 dpavlin 150 cmp_ok( $node->doc_num, '==', $doc_num - $_, "node->doc_num " . ($doc_num - $_));
185 dpavlin 41 }
186 dpavlin 42
187 dpavlin 148 my $doc_num2 = $doc_num - $delete_num;
188     cmp_ok($node->doc_num, '==', $doc_num2, "node->doc_num $doc_num2");
189 dpavlin 50
190 dpavlin 148 my $max = int($doc_num2 / 2);
191 dpavlin 50
192 dpavlin 51 ok(my $cond = new Search::Estraier::Condition, 'new cond');
193     ok($cond->set_phrase('girl'), 'cond set_phrase');
194 dpavlin 148 ok($cond->set_max($max), "cond set_max($max)");
195 dpavlin 51 ok($cond->set_order('@uri ASCD'), 'cond set_order');
196     ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');
197 dpavlin 173 ok($cond->set_mask(qw/1 2/), 'cond set_mask');
198 dpavlin 51
199 dpavlin 173 cmp_ok($node->cond_to_query( $cond ), 'eq' , 'phrase=girl&attr1=%40title%20STRINC%20Material&order=%40uri%20ASCD&max='.$max.'&wwidth=480&hwidth=96&awidth=96&mask=6', 'cond_to_query');
200 dpavlin 51
201 dpavlin 91 ok( my $nres = $node->search( $cond, 0 ), 'search');
202 dpavlin 51
203 dpavlin 91 isa_ok( $nres, 'Search::Estraier::NodeResult' );
204 dpavlin 51
205 dpavlin 148 cmp_ok($nres->doc_num, '==', $max, "nres->doc_num $max");
206 dpavlin 53
207 dpavlin 148 cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
208 dpavlin 100
209 dpavlin 148 # upper limit is $nres->hits and not $nres->doc_num because we
210     # check all documents, not just results!
211 dpavlin 115 for my $i ( 0 .. ($nres->hits - 1) ) {
212 dpavlin 148 my $num = $i + $delete_num + 1;
213     my $uri = 'test' . $num;
214 dpavlin 115
215     if ($i < $nres->doc_num) {
216 dpavlin 148 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
217 dpavlin 115
218     cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
219 dpavlin 148 cmp_ok( $node->uri_to_id( $uri ), '==', $num + 1, "uri_to_id($uri)");
220    
221 dpavlin 115 ok( my $k = $rdoc->keywords( $id ), "rdoc keywords");
222 dpavlin 148 } else {
223     ok( ! $nres->get_doc( $i ), "nres->get_doc doesn't exist");
224 dpavlin 115 }
225    
226 dpavlin 148 ok( my $id = $node->uri_to_id( $uri ), "uri_to_id($uri)");
227 dpavlin 187 my $doc;
228     my $score = $num * 10000;
229     ok( $doc = $node->get_doc( $id ), "get_doc($id)");
230     cmp_ok( $doc->score, '==', $score, "score $score");
231     ok( $doc = $node->get_doc_by_uri( $uri ), "get_doc_by_uri($uri)");
232     cmp_ok( $doc->score, '==', $score, "score $score");
233 dpavlin 49 cmp_ok( $node->get_doc_attr( $id, '@uri' ), 'eq', $uri, "get_doc_attr $id");
234     cmp_ok( $node->get_doc_attr_by_uri( $uri, '@uri' ), 'eq', $uri, "get_doc_attr $id");
235 dpavlin 115 ok( my $k1 = $node->etch_doc( $id ), "etch_doc_by_uri $uri");
236 dpavlin 49 ok( my $k2 = $node->etch_doc_by_uri( $uri ), "etch_doc_by_uri $uri");
237     #diag Dumper($k, $k2);
238 dpavlin 115 ok( eq_hash( $k1, $k2 ), "keywords");
239 dpavlin 43 }
240 dpavlin 48
241 dpavlin 91 ok(my $hints = $nres->hints, 'hints');
242 dpavlin 152 diag Dumper($hints) if ($debug);
243 dpavlin 170 foreach my $h (qw/TIME DOCNUM VERSION NODE HIT WORDNUM/) {
244     ok(defined( $nres->hint($h) ), "have hint $h");
245     }
246 dpavlin 91
247 dpavlin 72 ok($node->_set_info, "refresh _set_info");
248    
249 dpavlin 48 my $v;
250     ok($v = $node->name, "name: $v");
251     ok($v = $node->label, "label: $v");
252     ok($v = $node->doc_num, "doc_num: $v");
253 dpavlin 110 ok(defined($v = $node->word_num), "word_num: $v");
254 dpavlin 48 ok($v = $node->size, "size: $v");
255    
256 dpavlin 55 ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");
257    
258 dpavlin 148 # test skip
259     my $skip = int($max / 2) || die "skip is zero, can't test";
260     ok($cond->set_skip( $skip ), "cond set_skip($skip)");
261 dpavlin 167 cmp_ok($cond->skip, '==', $skip, "skip is $skip");
262 dpavlin 148
263 dpavlin 155 like($node->cond_to_query( $cond ), qr/skip=$skip/, 'cond_to_query have skip');
264    
265 dpavlin 148 ok( $nres = $node->search( $cond, 0 ), 'search');
266     isa_ok( $nres, 'Search::Estraier::NodeResult' );
267     cmp_ok($nres->doc_num, '==', $max, "nres->doc_num " . ($max - $skip));
268     cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
269    
270     for my $i ( 0 .. ($nres->doc_num - 1) ) {
271 dpavlin 155 my $uri = 'test' . ($i + $delete_num + $skip + 1);
272 dpavlin 148 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
273     if ($rdoc) {
274     cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
275     } else {
276     fail('no rdoc');
277     }
278     }
279    
280 dpavlin 189 # test distinct
281     ok(my $cond = new Search::Estraier::Condition, 'new cond');
282     ok($cond->set_phrase('girl'), 'cond set_phrase');
283     my $distinct = '@title';
284     $cond->set_distinct( $distinct );
285     cmp_ok($cond->distinct, 'eq', $distinct, "distinct is $distinct");
286     like($node->cond_to_query( $cond ), qr/distinct=%40title/, 'cond_to_query have distinct');
287     ok( $nres = $node->search( $cond, 0 ), 'search with distinct');
288     cmp_ok($nres->doc_num, '==', 1, "nres->doc_num");
289     cmp_ok($nres->hits, '==', 1, "nres->hits");
290     diag "nres = ", Dumper( $nres ) if ($debug);
291 dpavlin 148
292 dpavlin 56 # user doesn't exist
293 dpavlin 156 ok($node->set_user('foobar', 1), 'set_user');
294 dpavlin 56
295 dpavlin 152 ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
296 dpavlin 94 ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
297 dpavlin 57
298 dpavlin 78 # croak_on_error
299    
300 dpavlin 152 ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
301 dpavlin 94 throws_ok { $node->name } qr/404/, 'croak on error';
302 dpavlin 78
303 dpavlin 103 # croak_on_error
304 dpavlin 153 ok($node = new Search::Estraier::Node( url => "$estmaster_uri/node/$test1_node", croak_on_error => 1, user => $user, passwd => $passwd, debug => $debug ), "new $test1_node");
305 dpavlin 94
306 dpavlin 103 ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
307    
308 dpavlin 137
309 dpavlin 107 # test users
310 dpavlin 156 ok($node->admins, 'have admins');
311 dpavlin 107 ok(! $node->guests, 'no guests');
312    
313 dpavlin 137
314 dpavlin 129 # test search without results
315     ok($cond = new Search::Estraier::Condition, 'new cond');
316     ok($cond->set_phrase('this_is_phrase_which_does_not_exits'), 'cond set_phrase');
317    
318     ok($nres = $node->search( $cond, 0 ), 'search');
319    
320 dpavlin 137 # now, test links
321     my $test2_label = "$test2_node label";
322 dpavlin 152 my $link_url = "$estmaster_uri/node/$test2_node";
323 dpavlin 137 ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");
324     ok(my $links = $node->links, 'links');
325     cmp_ok($#{$links}, '==', 0, 'one link');
326     like($links->[0], qr/^$link_url/, 'link correct');
327 dpavlin 152 ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
328 dpavlin 72
329 dpavlin 151 ok($msg = $node->master(
330     action => 'nodeclr',
331     name => $node->name,
332 dpavlin 155 ), "nodeclr " . $node->name . ": $msg");
333 dpavlin 151
334     cmp_ok($node->doc_num, '==', 0, 'no documents');
335    
336 dpavlin 137 # cleanup test nodes
337     foreach my $node_name ( $test1_node , $test2_node ) {
338     ok($msg = $node->master(
339     action => 'nodedel',
340     name => $node_name,
341     ), "nodedel $node_name: $msg");
342     }
343 dpavlin 107
344 dpavlin 139 # test create
345     my $node_name = '_test_create_' . $$;
346     my $node_label = "test $$ label";
347    
348     ok($node = new Search::Estraier::Node(
349 dpavlin 152 url => "$estmaster_uri/node/$node_name",
350 dpavlin 139 create => 1,
351     label => $node_label,
352     croak_on_error => 1
353 dpavlin 140 ), "new create+croak");
354 dpavlin 139
355     cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
356     cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
357    
358 dpavlin 140 ok($node = new Search::Estraier::Node(
359 dpavlin 152 url => "$estmaster_uri/node/$node_name",
360 dpavlin 140 create => 1,
361     label => $node_label,
362     croak_on_error => 0
363     ), "new create existing");
364    
365     ok($node = new Search::Estraier::Node(
366 dpavlin 152 url => "$estmaster_uri/node/$node_name",
367 dpavlin 140 create => 1,
368     label => $node_label,
369     croak_on_error => 1
370     ), "new create+croak existing");
371    
372     # cleanup
373 dpavlin 139 ok($msg = $node->master(
374     action => 'nodedel',
375     name => $node_name,
376     ), "nodedel $node_name: $msg");
377    
378 dpavlin 140 # and again, this time without node
379     ok($node = new Search::Estraier::Node(
380 dpavlin 152 url => "$estmaster_uri/node/$node_name",
381 dpavlin 140 create => 1,
382     label => $node_label,
383     croak_on_error => 0
384     ), "new create non-existing");
385    
386     cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
387     cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
388    
389     # cleanup
390     ok($msg = $node->master(
391     action => 'nodedel',
392     name => $node_name,
393     ), "nodedel $node_name: $msg");
394    
395 dpavlin 151 ok($msg = $node->master( action => 'sync' ), "sync: $msg");
396    
397 dpavlin 152 } # SKIP
398    
399 dpavlin 55 diag "over";

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26