/[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 153 - (show annotations)
Tue May 16 16:01:09 2006 UTC (17 years, 11 months ago) by dpavlin
File MIME type: application/x-troff
File size: 10433 byte(s)
added usage of EST_USER and EST_PASSWD enviroment variables for credentials if
they exists (otherwise, it will fallback to admin:admin)
1 #!/usr/bin/perl -w
2
3 use strict;
4 use blib;
5
6 my $tests = 269;
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 ok( $nres = $node->search( $cond, 0 ), 'search');
249 isa_ok( $nres, 'Search::Estraier::NodeResult' );
250 cmp_ok($nres->doc_num, '==', $max, "nres->doc_num " . ($max - $skip));
251 cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
252
253 for my $i ( 0 .. ($nres->doc_num - 1) ) {
254 my $uri = 'test' . ($i + $delete_num + 1);
255 ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
256 if ($rdoc) {
257 cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
258 } else {
259 fail('no rdoc');
260 }
261 }
262
263
264 # user doesn't exist
265 ok(! $node->set_user('foobar', 1), 'set_user');
266
267 ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
268 ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
269
270 # croak_on_error
271
272 ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
273 throws_ok { $node->name } qr/404/, 'croak on error';
274
275 # croak_on_error
276 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");
277
278 ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
279
280
281 # test users
282 ok(! $node->admins, 'no admins');
283 ok(! $node->guests, 'no guests');
284
285
286 # test search without results
287 ok($cond = new Search::Estraier::Condition, 'new cond');
288 ok($cond->set_phrase('this_is_phrase_which_does_not_exits'), 'cond set_phrase');
289
290 ok($nres = $node->search( $cond, 0 ), 'search');
291
292 # now, test links
293 my $test2_label = "$test2_node label";
294 my $link_url = "$estmaster_uri/node/$test2_node";
295 ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");
296 ok(my $links = $node->links, 'links');
297 cmp_ok($#{$links}, '==', 0, 'one link');
298 like($links->[0], qr/^$link_url/, 'link correct');
299 ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
300
301 ok($msg = $node->master(
302 action => 'nodeclr',
303 name => $node->name,
304 ), "nodeclr $node->name: $msg");
305
306 cmp_ok($node->doc_num, '==', 0, 'no documents');
307
308 # cleanup test nodes
309 foreach my $node_name ( $test1_node , $test2_node ) {
310 ok($msg = $node->master(
311 action => 'nodedel',
312 name => $node_name,
313 ), "nodedel $node_name: $msg");
314 }
315
316 # test create
317 my $node_name = '_test_create_' . $$;
318 my $node_label = "test $$ label";
319
320 ok($node = new Search::Estraier::Node(
321 url => "$estmaster_uri/node/$node_name",
322 create => 1,
323 label => $node_label,
324 croak_on_error => 1
325 ), "new create+croak");
326
327 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
328 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
329
330 ok($node = new Search::Estraier::Node(
331 url => "$estmaster_uri/node/$node_name",
332 create => 1,
333 label => $node_label,
334 croak_on_error => 0
335 ), "new create existing");
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 existing");
343
344 # cleanup
345 ok($msg = $node->master(
346 action => 'nodedel',
347 name => $node_name,
348 ), "nodedel $node_name: $msg");
349
350 # and again, this time without node
351 ok($node = new Search::Estraier::Node(
352 url => "$estmaster_uri/node/$node_name",
353 create => 1,
354 label => $node_label,
355 croak_on_error => 0
356 ), "new create non-existing");
357
358 cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
359 cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
360
361 # cleanup
362 ok($msg = $node->master(
363 action => 'nodedel',
364 name => $node_name,
365 ), "nodedel $node_name: $msg");
366
367 ok($msg = $node->master( action => 'sync' ), "sync: $msg");
368
369 } # SKIP
370
371 diag "over";

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26