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

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26