/[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 169 - (show annotations)
Sun Aug 6 16:42:39 2006 UTC (17 years, 8 months ago) by dpavlin
File MIME type: application/x-troff
File size: 10729 byte(s)
test error handling of $node->get_doc
1 #!/usr/bin/perl -w
2
3 use strict;
4 use blib;
5
6 my $tests = 273;
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 ok( $node->put_doc($doc), "put_doc test$_");
151 #diag $doc->dump_draft;
152 cmp_ok( $node->doc_num, '==', ($_ + 1), "node->doc_num " . ($_ + 1));
153 }
154
155 ok(! $node->uri_to_id( 'does-not-exists' ), "non-existant uri_to_id");
156
157 my $id;
158 ok($id = $node->uri_to_id( 'data0' ), "uri_to_id(data0)");
159
160 throws_ok { $node->get_doc( 'foo') } qr/id must be number/, 'croak on non-number';
161
162 ok($doc = $node->get_doc( $id ), "get_doc($id) for edit");
163 $doc->add_attr('foo', 'bar');
164 #diag Dumper($doc);
165 ok( $node->edit_doc( $doc ), 'edit_doc');
166
167 my $doc_num;
168 ok( $doc_num = $node->doc_num, "node->doc_num $doc_num");
169
170 ok( $node->out_doc( $id ), "out_doc($id)");
171
172 cmp_ok( $node->doc_num, '==', --$doc_num, "node->doc_num " . $doc_num);
173
174 ok( ! $node->edit_doc( $doc ), "edit_doc of removed doc");
175
176 my $cache;
177 ok($cache = $node->cacheusage, "cacheusage: $cache");
178
179 my $delete_num = 5;
180
181 for ( 1 .. $delete_num ) {
182 ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");
183 cmp_ok( $node->doc_num, '==', $doc_num - $_, "node->doc_num " . ($doc_num - $_));
184 }
185
186 my $doc_num2 = $doc_num - $delete_num;
187 cmp_ok($node->doc_num, '==', $doc_num2, "node->doc_num $doc_num2");
188
189 my $max = int($doc_num2 / 2);
190
191 ok(my $cond = new Search::Estraier::Condition, 'new cond');
192 ok($cond->set_phrase('girl'), 'cond set_phrase');
193 ok($cond->set_max($max), "cond set_max($max)");
194 ok($cond->set_order('@uri ASCD'), 'cond set_order');
195 ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');
196
197 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', 'cond_to_query');
198
199 ok( my $nres = $node->search( $cond, 0 ), 'search');
200
201 isa_ok( $nres, 'Search::Estraier::NodeResult' );
202
203 cmp_ok($nres->doc_num, '==', $max, "nres->doc_num $max");
204
205 cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
206
207 # upper limit is $nres->hits and not $nres->doc_num because we
208 # check all documents, not just results!
209 for my $i ( 0 .. ($nres->hits - 1) ) {
210 my $num = $i + $delete_num + 1;
211 my $uri = 'test' . $num;
212
213 if ($i < $nres->doc_num) {
214 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
215
216 cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
217 cmp_ok( $node->uri_to_id( $uri ), '==', $num + 1, "uri_to_id($uri)");
218
219 ok( my $k = $rdoc->keywords( $id ), "rdoc keywords");
220 } else {
221 ok( ! $nres->get_doc( $i ), "nres->get_doc doesn't exist");
222 }
223
224 ok( my $id = $node->uri_to_id( $uri ), "uri_to_id($uri)");
225 ok( $node->get_doc( $id ), "get_doc($id)");
226 ok( $node->get_doc_by_uri( $uri ), "get_doc_by_uri($uri)");
227 cmp_ok( $node->get_doc_attr( $id, '@uri' ), 'eq', $uri, "get_doc_attr $id");
228 cmp_ok( $node->get_doc_attr_by_uri( $uri, '@uri' ), 'eq', $uri, "get_doc_attr $id");
229 ok( my $k1 = $node->etch_doc( $id ), "etch_doc_by_uri $uri");
230 ok( my $k2 = $node->etch_doc_by_uri( $uri ), "etch_doc_by_uri $uri");
231 #diag Dumper($k, $k2);
232 ok( eq_hash( $k1, $k2 ), "keywords");
233 }
234
235 ok(my $hints = $nres->hints, 'hints');
236 diag Dumper($hints) if ($debug);
237
238 ok($node->_set_info, "refresh _set_info");
239
240 my $v;
241 ok($v = $node->name, "name: $v");
242 ok($v = $node->label, "label: $v");
243 ok($v = $node->doc_num, "doc_num: $v");
244 ok(defined($v = $node->word_num), "word_num: $v");
245 ok($v = $node->size, "size: $v");
246
247 ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");
248
249 # test skip
250 my $skip = int($max / 2) || die "skip is zero, can't test";
251 ok($cond->set_skip( $skip ), "cond set_skip($skip)");
252 cmp_ok($cond->skip, '==', $skip, "skip is $skip");
253
254 like($node->cond_to_query( $cond ), qr/skip=$skip/, 'cond_to_query have skip');
255
256 ok( $nres = $node->search( $cond, 0 ), 'search');
257 isa_ok( $nres, 'Search::Estraier::NodeResult' );
258 cmp_ok($nres->doc_num, '==', $max, "nres->doc_num " . ($max - $skip));
259 cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
260
261 for my $i ( 0 .. ($nres->doc_num - 1) ) {
262 my $uri = 'test' . ($i + $delete_num + $skip + 1);
263 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
264 if ($rdoc) {
265 cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
266 } else {
267 fail('no rdoc');
268 }
269 }
270
271
272 # user doesn't exist
273 ok($node->set_user('foobar', 1), 'set_user');
274
275 ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
276 ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
277
278 # croak_on_error
279
280 ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
281 throws_ok { $node->name } qr/404/, 'croak on error';
282
283 # croak_on_error
284 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");
285
286 ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
287
288
289 # test users
290 ok($node->admins, 'have admins');
291 ok(! $node->guests, 'no guests');
292
293
294 # test search without results
295 ok($cond = new Search::Estraier::Condition, 'new cond');
296 ok($cond->set_phrase('this_is_phrase_which_does_not_exits'), 'cond set_phrase');
297
298 ok($nres = $node->search( $cond, 0 ), 'search');
299
300 # now, test links
301 my $test2_label = "$test2_node label";
302 my $link_url = "$estmaster_uri/node/$test2_node";
303 ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");
304 ok(my $links = $node->links, 'links');
305 cmp_ok($#{$links}, '==', 0, 'one link');
306 like($links->[0], qr/^$link_url/, 'link correct');
307 ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
308
309 ok($msg = $node->master(
310 action => 'nodeclr',
311 name => $node->name,
312 ), "nodeclr " . $node->name . ": $msg");
313
314 cmp_ok($node->doc_num, '==', 0, 'no documents');
315
316 # cleanup test nodes
317 foreach my $node_name ( $test1_node , $test2_node ) {
318 ok($msg = $node->master(
319 action => 'nodedel',
320 name => $node_name,
321 ), "nodedel $node_name: $msg");
322 }
323
324 # test create
325 my $node_name = '_test_create_' . $$;
326 my $node_label = "test $$ label";
327
328 ok($node = new Search::Estraier::Node(
329 url => "$estmaster_uri/node/$node_name",
330 create => 1,
331 label => $node_label,
332 croak_on_error => 1
333 ), "new create+croak");
334
335 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
336 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
337
338 ok($node = new Search::Estraier::Node(
339 url => "$estmaster_uri/node/$node_name",
340 create => 1,
341 label => $node_label,
342 croak_on_error => 0
343 ), "new create existing");
344
345 ok($node = new Search::Estraier::Node(
346 url => "$estmaster_uri/node/$node_name",
347 create => 1,
348 label => $node_label,
349 croak_on_error => 1
350 ), "new create+croak existing");
351
352 # cleanup
353 ok($msg = $node->master(
354 action => 'nodedel',
355 name => $node_name,
356 ), "nodedel $node_name: $msg");
357
358 # and again, this time without node
359 ok($node = new Search::Estraier::Node(
360 url => "$estmaster_uri/node/$node_name",
361 create => 1,
362 label => $node_label,
363 croak_on_error => 0
364 ), "new create non-existing");
365
366 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
367 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
368
369 # cleanup
370 ok($msg = $node->master(
371 action => 'nodedel',
372 name => $node_name,
373 ), "nodedel $node_name: $msg");
374
375 ok($msg = $node->master( action => 'sync' ), "sync: $msg");
376
377 } # SKIP
378
379 diag "over";

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26