/[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 187 - (show annotations)
Sun Nov 5 16:01:36 2006 UTC (17 years, 5 months ago) by dpavlin
File MIME type: application/x-troff
File size: 11082 byte(s)
added tests for set_score and score
1 #!/usr/bin/perl -w
2
3 use strict;
4 use blib;
5
6 my $tests = 304;
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
281 # user doesn't exist
282 ok($node->set_user('foobar', 1), 'set_user');
283
284 ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
285 ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
286
287 # croak_on_error
288
289 ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
290 throws_ok { $node->name } qr/404/, 'croak on error';
291
292 # croak_on_error
293 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");
294
295 ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
296
297
298 # test users
299 ok($node->admins, 'have admins');
300 ok(! $node->guests, 'no guests');
301
302
303 # test search without results
304 ok($cond = new Search::Estraier::Condition, 'new cond');
305 ok($cond->set_phrase('this_is_phrase_which_does_not_exits'), 'cond set_phrase');
306
307 ok($nres = $node->search( $cond, 0 ), 'search');
308
309 # now, test links
310 my $test2_label = "$test2_node label";
311 my $link_url = "$estmaster_uri/node/$test2_node";
312 ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");
313 ok(my $links = $node->links, 'links');
314 cmp_ok($#{$links}, '==', 0, 'one link');
315 like($links->[0], qr/^$link_url/, 'link correct');
316 ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
317
318 ok($msg = $node->master(
319 action => 'nodeclr',
320 name => $node->name,
321 ), "nodeclr " . $node->name . ": $msg");
322
323 cmp_ok($node->doc_num, '==', 0, 'no documents');
324
325 # cleanup test nodes
326 foreach my $node_name ( $test1_node , $test2_node ) {
327 ok($msg = $node->master(
328 action => 'nodedel',
329 name => $node_name,
330 ), "nodedel $node_name: $msg");
331 }
332
333 # test create
334 my $node_name = '_test_create_' . $$;
335 my $node_label = "test $$ label";
336
337 ok($node = new Search::Estraier::Node(
338 url => "$estmaster_uri/node/$node_name",
339 create => 1,
340 label => $node_label,
341 croak_on_error => 1
342 ), "new create+croak");
343
344 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
345 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
346
347 ok($node = new Search::Estraier::Node(
348 url => "$estmaster_uri/node/$node_name",
349 create => 1,
350 label => $node_label,
351 croak_on_error => 0
352 ), "new create existing");
353
354 ok($node = new Search::Estraier::Node(
355 url => "$estmaster_uri/node/$node_name",
356 create => 1,
357 label => $node_label,
358 croak_on_error => 1
359 ), "new create+croak existing");
360
361 # cleanup
362 ok($msg = $node->master(
363 action => 'nodedel',
364 name => $node_name,
365 ), "nodedel $node_name: $msg");
366
367 # and again, this time without node
368 ok($node = new Search::Estraier::Node(
369 url => "$estmaster_uri/node/$node_name",
370 create => 1,
371 label => $node_label,
372 croak_on_error => 0
373 ), "new create non-existing");
374
375 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
376 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
377
378 # cleanup
379 ok($msg = $node->master(
380 action => 'nodedel',
381 name => $node_name,
382 ), "nodedel $node_name: $msg");
383
384 ok($msg = $node->master( action => 'sync' ), "sync: $msg");
385
386 } # SKIP
387
388 diag "over";

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26