/[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

Contents of /trunk/t/5_Node.t

Parent Directory Parent Directory | Revision Log Revision Log


Revision 190 - (show annotations)
Sun Nov 5 16:25:56 2006 UTC (17 years, 4 months ago) by dpavlin
File MIME type: application/x-troff
File size: 11664 byte(s)
actually wrap $cond->set_distinct in ok() :-)
1 #!/usr/bin/perl -w
2
3 use strict;
4 use blib;
5
6 my $tests = 312;
7
8 use Test::More;
9 use Test::Exception;
10 use Data::Dumper;
11
12 BEGIN { use_ok('Search::Estraier') };
13
14 plan tests => $tests;
15
16 my $debug = shift @ARGV;
17
18 # name of node for test
19 my $test1_node = '_test1_' . $$;
20 my $test2_node = '_test2_' . $$;
21
22 my $estmaster_uri = $ENV{'ESTMASTER_URI'} || 'http://localhost:1978';
23
24 ok(my $node = new Search::Estraier::Node( debug => $debug ), 'new');
25 isa_ok($node, 'Search::Estraier::Node');
26
27 ok($node->set_url("$estmaster_uri/node/$test1_node"), "set_url $test1_node");
28
29 ok($node->set_proxy('', 8080), 'set_proxy');
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
35 my ($user, $passwd) = (
36 $ENV{EST_USER} || 'admin',
37 $ENV{EST_PASSWD} || 'admin'
38 );
39
40 ok($node->set_auth($user, $passwd), 'set_auth');
41
42 cmp_ok($node->status, '==', -1, 'status');
43
44 # test master functionality
45
46 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 diag("node->master shutdown not tested");
52
53 diag("node->master backup not tested");
54
55 ok(my @users = $node->master( action => 'userlist' ), 'userlist');
56
57 #diag "users: ", Dumper( \@users );
58 diag "found ", $#users + 1, " users";
59
60 my $user = {
61 name => '_test_' . $$,
62 flags => 'b',
63 fname => 'Search::Estraier',
64 misc => 'test user',
65 };
66
67 my $msg;
68 ok($msg = $node->master(
69 action => 'useradd',
70 %{ $user },
71 passwd => 'test1234',
72 ), "useradd: $msg");
73
74 ok(my @users2 = $node->master( action => 'userlist' ), 'userlist');
75 cmp_ok($#users2, '==', $#users + 1, 'added user');
76
77 while (my $row = shift @users2) {
78 next unless ($row->{name} eq $user);
79 map {
80 cmp_ok($user->{$_}, 'eq', $row->{$_}, "$_");
81 } keys %{ $user };
82 }
83
84 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 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
104 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 _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 my $draft = <<'_END_OF_DRAFT_';
134 @uri=data0
135 @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 #diag "draft:\n$draft";
144 ok(my $doc = new Search::Estraier::Document($draft), 'new doc from draft');
145
146 ok( $node->put_doc($doc), "put_doc data001");
147
148 for ( 1 .. 17 ) {
149 $doc->add_attr('@uri', 'test' . $_);
150 $doc->set_score( $_ * 10000 );
151 ok( $node->put_doc($doc), "put_doc test$_");
152 #diag $doc->dump_draft;
153 cmp_ok( $node->doc_num, '==', ($_ + 1), "node->doc_num " . ($_ + 1));
154 }
155
156 ok(! $node->uri_to_id( 'does-not-exists' ), "non-existant uri_to_id");
157
158 my $id;
159 ok($id = $node->uri_to_id( 'data0' ), "uri_to_id(data0)");
160
161 throws_ok { $node->get_doc( 'foo') } qr/id must be number/, 'croak on non-number';
162
163 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
168 my $doc_num;
169 ok( $doc_num = $node->doc_num, "node->doc_num $doc_num");
170
171 ok( $node->out_doc( $id ), "out_doc($id)");
172
173 cmp_ok( $node->doc_num, '==', --$doc_num, "node->doc_num " . $doc_num);
174
175 ok( ! $node->edit_doc( $doc ), "edit_doc of removed doc");
176
177 my $cache;
178 ok($cache = $node->cacheusage, "cacheusage: $cache");
179
180 my $delete_num = 5;
181
182 for ( 1 .. $delete_num ) {
183 ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");
184 cmp_ok( $node->doc_num, '==', $doc_num - $_, "node->doc_num " . ($doc_num - $_));
185 }
186
187 my $doc_num2 = $doc_num - $delete_num;
188 cmp_ok($node->doc_num, '==', $doc_num2, "node->doc_num $doc_num2");
189
190 my $max = int($doc_num2 / 2);
191
192 ok(my $cond = new Search::Estraier::Condition, 'new cond');
193 ok($cond->set_phrase('girl'), 'cond set_phrase');
194 ok($cond->set_max($max), "cond set_max($max)");
195 ok($cond->set_order('@uri ASCD'), 'cond set_order');
196 ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');
197 ok($cond->set_mask(qw/1 2/), 'cond set_mask');
198
199 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
201 ok( my $nres = $node->search( $cond, 0 ), 'search');
202
203 isa_ok( $nres, 'Search::Estraier::NodeResult' );
204
205 cmp_ok($nres->doc_num, '==', $max, "nres->doc_num $max");
206
207 cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
208
209 # upper limit is $nres->hits and not $nres->doc_num because we
210 # check all documents, not just results!
211 for my $i ( 0 .. ($nres->hits - 1) ) {
212 my $num = $i + $delete_num + 1;
213 my $uri = 'test' . $num;
214
215 if ($i < $nres->doc_num) {
216 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
217
218 cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
219 cmp_ok( $node->uri_to_id( $uri ), '==', $num + 1, "uri_to_id($uri)");
220
221 ok( my $k = $rdoc->keywords( $id ), "rdoc keywords");
222 } else {
223 ok( ! $nres->get_doc( $i ), "nres->get_doc doesn't exist");
224 }
225
226 ok( my $id = $node->uri_to_id( $uri ), "uri_to_id($uri)");
227 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 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 ok( my $k1 = $node->etch_doc( $id ), "etch_doc_by_uri $uri");
236 ok( my $k2 = $node->etch_doc_by_uri( $uri ), "etch_doc_by_uri $uri");
237 #diag Dumper($k, $k2);
238 ok( eq_hash( $k1, $k2 ), "keywords");
239 }
240
241 ok(my $hints = $nres->hints, 'hints');
242 diag Dumper($hints) if ($debug);
243 foreach my $h (qw/TIME DOCNUM VERSION NODE HIT WORDNUM/) {
244 ok(defined( $nres->hint($h) ), "have hint $h");
245 }
246
247 ok($node->_set_info, "refresh _set_info");
248
249 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 ok(defined($v = $node->word_num), "word_num: $v");
254 ok($v = $node->size, "size: $v");
255
256 ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");
257
258 # 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 cmp_ok($cond->skip, '==', $skip, "skip is $skip");
262
263 like($node->cond_to_query( $cond ), qr/skip=$skip/, 'cond_to_query have skip');
264
265 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 my $uri = 'test' . ($i + $delete_num + $skip + 1);
272 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 # 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 ok($cond->set_distinct( $distinct ), "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
292 # user doesn't exist
293 ok($node->set_user('foobar', 1), 'set_user');
294
295 ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
296 ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
297
298 # croak_on_error
299
300 ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
301 throws_ok { $node->name } qr/404/, 'croak on error';
302
303 # croak_on_error
304 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
306 ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
307
308
309 # test users
310 ok($node->admins, 'have admins');
311 ok(! $node->guests, 'no guests');
312
313
314 # 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 # now, test links
321 my $test2_label = "$test2_node label";
322 my $link_url = "$estmaster_uri/node/$test2_node";
323 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 ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
328
329 ok($msg = $node->master(
330 action => 'nodeclr',
331 name => $node->name,
332 ), "nodeclr " . $node->name . ": $msg");
333
334 cmp_ok($node->doc_num, '==', 0, 'no documents');
335
336 # 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
344 # test create
345 my $node_name = '_test_create_' . $$;
346 my $node_label = "test $$ label";
347
348 ok($node = new Search::Estraier::Node(
349 url => "$estmaster_uri/node/$node_name",
350 create => 1,
351 label => $node_label,
352 croak_on_error => 1
353 ), "new create+croak");
354
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 ok($node = new Search::Estraier::Node(
359 url => "$estmaster_uri/node/$node_name",
360 create => 1,
361 label => $node_label,
362 croak_on_error => 0
363 ), "new create existing");
364
365 ok($node = new Search::Estraier::Node(
366 url => "$estmaster_uri/node/$node_name",
367 create => 1,
368 label => $node_label,
369 croak_on_error => 1
370 ), "new create+croak existing");
371
372 # cleanup
373 ok($msg = $node->master(
374 action => 'nodedel',
375 name => $node_name,
376 ), "nodedel $node_name: $msg");
377
378 # and again, this time without node
379 ok($node = new Search::Estraier::Node(
380 url => "$estmaster_uri/node/$node_name",
381 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 ok($msg = $node->master( action => 'sync' ), "sync: $msg");
396
397 } # SKIP
398
399 diag "over";

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26