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

Diff of /trunk/t/5_Node.t

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 100 by dpavlin, Sat Jan 28 19:41:59 2006 UTC revision 192 by dpavlin, Sun Nov 5 16:28:31 2006 UTC
# Line 3  Line 3 
3  use strict;  use strict;
4  use blib;  use blib;
5    
6  use Test::More tests => 99;  my $tests = 312;
7    
8    use Test::More;
9  use Test::Exception;  use Test::Exception;
10  use Data::Dumper;  use Data::Dumper;
11    
12  BEGIN { use_ok('Search::Estraier') };  BEGIN { use_ok('Search::Estraier') };
13    
14  my $debug = 0;  plan tests => $tests;
15    
16    my $debug = shift @ARGV;
17    
18  # name of node for test  # name of node for test
19  my $test1_node = 'test1';  my $test1_node = '_test1_' . $$;
20  my $test2_node = 'test2';  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');  ok(my $node = new Search::Estraier::Node( debug => $debug ), 'new');
25  isa_ok($node, 'Search::Estraier::Node');  isa_ok($node, 'Search::Estraier::Node');
26    
27  ok($node->set_url("http://localhost:1978/node/$test1_node"), "set_url $test1_node");  ok($node->set_url("$estmaster_uri/node/$test1_node"), "set_url $test1_node");
28    
29  ok($node->set_proxy('', 8080), 'set_proxy');  ok($node->set_proxy('', 8080), 'set_proxy');
30  throws_ok {$node->set_proxy('proxy.example.com', 'foo') } qr/port/, 'set_proxy port NaN';  throws_ok {$node->set_proxy('proxy.example.com', 'foo') } qr/port/, 'set_proxy port NaN';
# Line 26  throws_ok {$node->set_proxy('proxy.examp Line 32  throws_ok {$node->set_proxy('proxy.examp
32  ok($node->set_timeout(42), 'set_timeout');  ok($node->set_timeout(42), 'set_timeout');
33  throws_ok {$node->set_timeout('foo') } qr/timeout/, 'set_timeout NaN';  throws_ok {$node->set_timeout('foo') } qr/timeout/, 'set_timeout NaN';
34    
35  ok($node->set_auth('admin','admin'), 'set_auth');  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');  cmp_ok($node->status, '==', -1, 'status');
43    
44    # test master functionality
45    
46  SKIP: {  SKIP: {
47    
48  skip "no $test1_node node in Hyper Estraier", 88, unless($node->name);  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  my @res = ( -1, 200 );  diag("node->master backup not tested");
54    
55  my $nodelist;  ok(my @users = $node->master( action => 'userlist' ), 'userlist');
56  foreach my $url (qw{?action=nodelist http://localhost:1978/master?action=nodelist}) {  
57          cmp_ok(  #diag "users: ", Dumper( \@users );
58                  $node->shuttle_url( $url, 'text/plain', undef, \$nodelist)  diag "found ", $#users + 1, " users";
59          ,'==', shift @res, 'nodelist');  
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_';  my $draft = <<'_END_OF_DRAFT_';
134  @uri=data001  @uri=data0
135  @title=Material Girl  @title=Material Girl
136    
137  Living in a material world  Living in a material world
# Line 58  ok(my $doc = new Search::Estraier::Docum Line 145  ok(my $doc = new Search::Estraier::Docum
145    
146  ok( $node->put_doc($doc), "put_doc data001");  ok( $node->put_doc($doc), "put_doc data001");
147    
148  for ( 1 .. 10 ) {  for ( 1 .. 17 ) {
149          $doc->add_attr('@uri', 'test' . $_);          $doc->add_attr('@uri', 'test' . $_);
150            $doc->set_score( $_ * 10000 );
151          ok( $node->put_doc($doc), "put_doc test$_");          ok( $node->put_doc($doc), "put_doc test$_");
152          #diag $doc->dump_draft;          #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;  my $id;
159  ok($id = $node->uri_to_id( 'data001' ), "uri_to_id = $id");  ok($id = $node->uri_to_id( 'data0' ), "uri_to_id(data0)");
160    
161  my $data_max = 5;  throws_ok { $node->get_doc( 'foo') } qr/id must be number/, 'croak on non-number';
162    
163  for ( 1 .. $data_max ) {  ok($doc = $node->get_doc( $id ), "get_doc($id) for edit");
         ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");  
 }  
   
 ok($doc = $node->get_doc( $id ), 'get_doc for edit');  
164  $doc->add_attr('foo', 'bar');  $doc->add_attr('foo', 'bar');
165  #diag Dumper($doc);  #diag Dumper($doc);
166  ok( $node->edit_doc( $doc ), 'edit_doc');  ok( $node->edit_doc( $doc ), 'edit_doc');
167    
168  ok( $node->out_doc( $id ), "out_doc $id");  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  ok( ! $node->edit_doc( $doc ), "edit removed");  cmp_ok( $node->doc_num, '==', --$doc_num, "node->doc_num " . $doc_num);
174    
175  my $max = 3;  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');  ok(my $cond = new Search::Estraier::Condition, 'new cond');
193  ok($cond->set_phrase('girl'), 'cond set_phrase');  ok($cond->set_phrase('girl'), 'cond set_phrase');
194  ok($cond->set_max($max), "cond set_max $max");  ok($cond->set_max($max), "cond set_max($max)");
195  ok($cond->set_order('@uri ASCD'), 'cond set_order');  ok($cond->set_order('@uri ASCD'), 'cond set_order');
196  ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');  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', 'cond_to_query');  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');  ok( my $nres = $node->search( $cond, 0 ), 'search');
202    
203  isa_ok( $nres, 'Search::Estraier::NodeResult' );  isa_ok( $nres, 'Search::Estraier::NodeResult' );
204    
205  cmp_ok($nres->doc_num, '==', $max, "doc_num = $max");  cmp_ok($nres->doc_num, '==', $max, "nres->doc_num $max");
206    
207  cmp_ok($nres->hits, '==', $data_max, "hits");  cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
208    
209  for ( 6 .. 10 ) {  # upper limit is $nres->hits and not $nres->doc_num because we
210          my $uri = 'test' . $_;  # check all documents, not just results!
211          ok( my $id = $node->uri_to_id( $uri ), "uri_to_id $uri");  for my $i ( 0 .. ($nres->hits - 1) ) {
212          ok( $node->get_doc( $id ), "get_doc $id");          my $num = $i + $delete_num + 1;
213          ok( $node->get_doc_by_uri( $uri ), "get_doc_by_uri $uri");          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");          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");          cmp_ok( $node->get_doc_attr_by_uri( $uri, '@uri' ), 'eq', $uri, "get_doc_attr $id");
235          ok( my $k = $node->etch_doc( $id ), "etch_doc_by_uri $uri");          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");          ok( my $k2 = $node->etch_doc_by_uri( $uri ), "etch_doc_by_uri $uri");
237          #diag Dumper($k, $k2);          #diag Dumper($k, $k2);
238          ok( eq_hash( $k, $k2 ), "keywords");          ok( eq_hash( $k1, $k2 ), "keywords");
239  }  }
240    
241  ok(my $hints = $nres->hints, 'hints');  ok(my $hints = $nres->hints, 'hints');
242  diag Dumper($hints);  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");  ok($node->_set_info, "refresh _set_info");
248    
# Line 122  my $v; Line 250  my $v;
250  ok($v = $node->name, "name: $v");  ok($v = $node->name, "name: $v");
251  ok($v = $node->label, "label: $v");  ok($v = $node->label, "label: $v");
252  ok($v = $node->doc_num, "doc_num: $v");  ok($v = $node->doc_num, "doc_num: $v");
253  ok($v = $node->word_num, "word_num: $v");  ok(defined($v = $node->word_num), "word_num: $v");
254  ok($v = $node->size, "size: $v");  ok($v = $node->size, "size: $v");
255    
256  ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");  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($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  # user doesn't exist
293  ok(! $node->set_user('foobar', 1), 'set_user');  ok($node->set_user('foobar', 1), 'set_user');
294    
295  ok(my $node2 = new Search::Estraier::Node( "http://localhost:1978/node/$test2_node" ), "new $test2_node");  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");  ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
297    
298  # croak_on_error  # croak_on_error
299    
300  ok($node = new Search::Estraier::Node( url => "http://localhost:1978/non-existant", croak_on_error => 1 ), "new non-existant");  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';  throws_ok { $node->name } qr/404/, 'croak on error';
302    
303  # support for undef and 0 values  # croak_on_error
304  #ok($node = new Search::Estraier::Node( url => "http://localhost:1978/$test1_node", croak_on_error => 1 ), "new $test1_node");  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    
 SKIP: {  
         skip "no $test2_node in Hyper Estraier, skipping set_link", 2 unless (my $test2_label = $node2->label);  
308    
309          ok($node->set_link("http://localhost:1978/node/$test2_node", $test2_label, 42), "set_link $test2_node ($test2_label) 42");  # test users
310          ok($node->set_link("http://localhost:1978/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");  ok($node->admins, 'have admins');
311  }       # SKIP 2  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 1  } # SKIP
398    
399  diag "over";  diag "over";

Legend:
Removed from v.100  
changed lines
  Added in v.192

  ViewVC Help
Powered by ViewVC 1.1.26