/[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 78 by dpavlin, Mon Jan 16 21:42:09 2006 UTC revision 152 by dpavlin, Tue May 16 12:11:39 2006 UTC
# Line 3  Line 3 
3  use strict;  use strict;
4  use blib;  use blib;
5    
6  use Test::More tests => 97;  my $tests = 269;
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 30  ok($node->set_auth('admin','admin'), 'se Line 36  ok($node->set_auth('admin','admin'), 'se
36    
37  cmp_ok($node->status, '==', -1, 'status');  cmp_ok($node->status, '==', -1, 'status');
38    
39    # test master functionality
40    
41  SKIP: {  SKIP: {
42    
43  skip "no $test1_node node in Hyper Estraier", 87, unless($node->name);  skip "can't find estmaster at $estmaster_uri", ($tests - 9) if (! eval { $node->master( action => 'nodelist' ) } );
44    
45  my @res = ( -1, 200 );  diag "using $estmaster_uri";
46    diag("node->master shutdown not tested");
47    
48  my $nodelist;  diag("node->master backup not tested");
49  foreach my $url (qw{?action=nodelist http://localhost:1978/master?action=nodelist}) {  
50          cmp_ok(  ok(my @users = $node->master( action => 'userlist' ), 'userlist');
51                  $node->shuttle_url( $url, 'text/plain', undef, \$nodelist)  
52          ,'==', shift @res, 'nodelist');  #diag "users: ", Dumper( \@users );
53    diag "found ", $#users + 1, " users";
54    
55    my $user = {
56            name => '_test_' . $$,
57            flags => 'b',
58            fname => 'Search::Estraier',
59            misc => 'test user',
60    };
61    
62    my $msg;
63    ok($msg = $node->master(
64            action => 'useradd',
65            %{ $user },
66            passwd => 'test1234',
67    ), "useradd: $msg");
68    
69    ok(my @users2 = $node->master( action => 'userlist' ), 'userlist');
70    cmp_ok($#users2, '==', $#users + 1, 'added user');
71    
72    while (my $row = shift @users2) {
73            next unless ($row->{name} eq $user);
74            map {
75                    cmp_ok($user->{$_}, 'eq', $row->{$_}, "$_");
76            } keys %{ $user };
77  }  }
78    
79    ok($msg = $node->master(
80            action => 'userdel',
81            name => $user->{name},
82    ), "userdel: $msg");
83    
84    ok(@users2 = $node->master( action => 'userlist' ), 'userlist');
85    cmp_ok($#users2, '==', $#users, 'removed user');
86    
87    ok(my @nodes = $node->master( action => 'nodelist' ), 'nodelist' );
88    #diag "nodelist: ", Dumper( \@nodes );
89    diag "found ", $#nodes + 1, " nodes";
90    
91    if ($#nodes > 42) {
92            diag <<'_END_OF_WARNING_';
93    
94    This tests create three nodes in your Hyper Estraier.
95    
96    Since you have more than 43 modes, and Hyper Estraier needs more than
97    1024 file descriptors for more than 46 nodes, expect tests to fail.
98    
99    If tests do fail, you can try to add
100    
101    ulimit -n 2048
102    
103    before staring estmaster, which will increase number of available nodes
104    to 96 before estmaster runs out of file descriptors.
105    
106    _END_OF_WARNING_
107    }
108    
109    my $temp_node = "_test_temp_$$";
110    
111    foreach my $node_name ( $test1_node , $test2_node, $temp_node ) {
112            ok($msg = $node->master(
113                    action => 'nodeadd',
114                    name => $node_name,
115                    label => "$node_name label",
116            ), "nodeadd $node_name: $msg");
117    }
118    
119    ok($msg = $node->master(
120            action => 'nodedel',
121            name => $temp_node,
122    ), "nodedel $temp_node: $msg");
123    
124    #diag "not testing logrtt\n";
125    
126    # test document creation
127    
128  my $draft = <<'_END_OF_DRAFT_';  my $draft = <<'_END_OF_DRAFT_';
129  @uri=data001  @uri=data0
130  @title=Material Girl  @title=Material Girl
131    
132  Living in a material world  Living in a material world
# Line 58  ok(my $doc = new Search::Estraier::Docum Line 140  ok(my $doc = new Search::Estraier::Docum
140    
141  ok( $node->put_doc($doc), "put_doc data001");  ok( $node->put_doc($doc), "put_doc data001");
142    
143  for ( 1 .. 10 ) {  for ( 1 .. 17 ) {
144          $doc->add_attr('@uri', 'test' . $_);          $doc->add_attr('@uri', 'test' . $_);
145          ok( $node->put_doc($doc), "put_doc test$_");          ok( $node->put_doc($doc), "put_doc test$_");
146          #diag $doc->dump_draft;          #diag $doc->dump_draft;
147            cmp_ok( $node->doc_num, '==', ($_ + 1), "node->doc_num " . ($_ + 1));
148  }  }
149    
150  my $id;  ok(! $node->uri_to_id( 'does-not-exists' ), "non-existant uri_to_id");
 ok($id = $node->uri_to_id( 'data001' ), "uri_to_id = $id");  
151    
152  for ( 1 .. 5 ) {  my $id;
153          ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");  ok($id = $node->uri_to_id( 'data0' ), "uri_to_id(data0)");
 }  
154    
155  ok($doc = $node->get_doc( $id ), 'get_doc for edit');  ok($doc = $node->get_doc( $id ), "get_doc($id) for edit");
156  $doc->add_attr('foo', 'bar');  $doc->add_attr('foo', 'bar');
157  #diag Dumper($doc);  #diag Dumper($doc);
158  ok( $node->edit_doc( $doc ), 'edit_doc');  ok( $node->edit_doc( $doc ), 'edit_doc');
159    
160  ok( $node->out_doc( $id ), "out_doc $id");  my $doc_num;
161    ok( $doc_num = $node->doc_num, "node->doc_num $doc_num");
162    
163    ok( $node->out_doc( $id ), "out_doc($id)");
164    
165    cmp_ok( $node->doc_num, '==', --$doc_num, "node->doc_num " . $doc_num);
166    
167  ok( ! $node->edit_doc( $doc ), "edit removed");  ok( ! $node->edit_doc( $doc ), "edit_doc of removed doc");
168    
169  my $max = 3;  my $delete_num = 5;
170    
171    for ( 1 .. $delete_num ) {
172            ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");
173            cmp_ok( $node->doc_num, '==', $doc_num - $_, "node->doc_num " . ($doc_num - $_));
174    }
175    
176    my $doc_num2 = $doc_num - $delete_num;
177    cmp_ok($node->doc_num, '==', $doc_num2, "node->doc_num $doc_num2");
178    
179    my $max = int($doc_num2 / 2);
180    
181  ok(my $cond = new Search::Estraier::Condition, 'new cond');  ok(my $cond = new Search::Estraier::Condition, 'new cond');
182  ok($cond->set_phrase('girl'), 'cond set_phrase');  ok($cond->set_phrase('girl'), 'cond set_phrase');
183  ok($cond->set_max($max), "cond set_max $max");  ok($cond->set_max($max), "cond set_max($max)");
184  ok($cond->set_order('@uri ASCD'), 'cond set_order');  ok($cond->set_order('@uri ASCD'), 'cond set_order');
185  ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');  ok($cond->add_attr('@title STRINC Material'), 'cond add_attr');
186    
187  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', 'cond_to_query');
188    
189  ok( my $nrec = $node->search( $cond, 0 ), 'search');  ok( my $nres = $node->search( $cond, 0 ), 'search');
190    
191    isa_ok( $nres, 'Search::Estraier::NodeResult' );
192    
193    cmp_ok($nres->doc_num, '==', $max, "nres->doc_num $max");
194    
195  isa_ok( $nrec, 'Search::Estraier::NodeResult' );  cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
196    
197  cmp_ok($nrec->doc_num, '==', $max, "doc_num = $max");  # upper limit is $nres->hits and not $nres->doc_num because we
198    # check all documents, not just results!
199    for my $i ( 0 .. ($nres->hits - 1) ) {
200            my $num = $i + $delete_num + 1;
201            my $uri = 'test' . $num;
202    
203  for ( 6 .. 10 ) {          if ($i < $nres->doc_num) {
204          my $uri = 'test' . $_;                  ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
205          ok( my $id = $node->uri_to_id( $uri ), "uri_to_id $uri");  
206          ok( $node->get_doc( $id ), "get_doc $id");                  cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
207          ok( $node->get_doc_by_uri( $uri ), "get_doc_by_uri $uri");                  cmp_ok( $node->uri_to_id( $uri ), '==', $num + 1, "uri_to_id($uri)");
208    
209                    ok( my $k = $rdoc->keywords( $id ), "rdoc keywords");
210            } else {
211                    ok( ! $nres->get_doc( $i ), "nres->get_doc doesn't exist");
212            }
213    
214            ok( my $id = $node->uri_to_id( $uri ), "uri_to_id($uri)");
215            ok( $node->get_doc( $id ), "get_doc($id)");
216            ok( $node->get_doc_by_uri( $uri ), "get_doc_by_uri($uri)");
217          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");
218          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");
219          ok( my $k = $node->etch_doc( $id ), "etch_doc_by_uri $uri");          ok( my $k1 = $node->etch_doc( $id ), "etch_doc_by_uri $uri");
220          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");
221          #diag Dumper($k, $k2);          #diag Dumper($k, $k2);
222          ok( eq_hash( $k, $k2 ), "keywords");          ok( eq_hash( $k1, $k2 ), "keywords");
223  }  }
224    
225    ok(my $hints = $nres->hints, 'hints');
226    diag Dumper($hints) if ($debug);
227    
228  ok($node->_set_info, "refresh _set_info");  ok($node->_set_info, "refresh _set_info");
229    
230  my $v;  my $v;
231  ok($v = $node->name, "name: $v");  ok($v = $node->name, "name: $v");
232  ok($v = $node->label, "label: $v");  ok($v = $node->label, "label: $v");
233  ok($v = $node->doc_num, "doc_num: $v");  ok($v = $node->doc_num, "doc_num: $v");
234  ok($v = $node->word_num, "word_num: $v");  ok(defined($v = $node->word_num), "word_num: $v");
235  ok($v = $node->size, "size: $v");  ok($v = $node->size, "size: $v");
236    
237  ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");  ok($node->set_snippet_width( 100, 10, 10 ), "set_snippet_width");
238    
239    # test skip
240    my $skip = int($max / 2) || die "skip is zero, can't test";
241    ok($cond->set_skip( $skip ), "cond set_skip($skip)");
242    
243    ok( $nres = $node->search( $cond, 0 ), 'search');
244    isa_ok( $nres, 'Search::Estraier::NodeResult' );
245    cmp_ok($nres->doc_num, '==', $max, "nres->doc_num " . ($max - $skip));
246    cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
247    
248    for my $i ( 0 .. ($nres->doc_num - 1) ) {
249            my $uri = 'test' . ($i + $delete_num + 1);
250            ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
251            if ($rdoc) {
252                    cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
253            } else {
254                    fail('no rdoc');
255            }
256    }
257    
258    
259  # user doesn't exist  # user doesn't exist
260  ok(! $node->set_user('foobar', 1), 'set_user');  ok(! $node->set_user('foobar', 1), 'set_user');
261    
262  ok(my $node1 = 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");
263  ok($node1->set_auth('admin','admin'), "set_auth $test2_node");  ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
264    
265  # croak_on_error  # croak_on_error
266    
267  ok(my $node2 = 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");
268  throws_ok { $node->name } qr/port/, 'croak on error';  throws_ok { $node->name } qr/404/, 'croak on error';
269    
270  SKIP: {  # croak_on_error
271          skip "no $test2_node in Hyper Estraier, skipping set_link", 2 unless (my $test1_label = $node1->label);  ok($node = new Search::Estraier::Node( url => "$estmaster_uri/node/$test1_node", croak_on_error => 1 ), "new $test1_node");
272    
273    ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
274    
275    
276    # test users
277    ok(! $node->admins, 'no admins');
278    ok(! $node->guests, 'no guests');
279    
280    
281    # test search without results
282    ok($cond = new Search::Estraier::Condition, 'new cond');
283    ok($cond->set_phrase('this_is_phrase_which_does_not_exits'), 'cond set_phrase');
284    
285    ok($nres = $node->search( $cond, 0 ), 'search');
286    
287    # now, test links
288    my $test2_label = "$test2_node label";
289    my $link_url = "$estmaster_uri/node/$test2_node";
290    ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");
291    ok(my $links = $node->links, 'links');
292    cmp_ok($#{$links}, '==', 0, 'one link');
293    like($links->[0], qr/^$link_url/, 'link correct');
294    ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
295    
296    ok($msg = $node->master(
297            action => 'nodeclr',
298            name => $node->name,
299    ), "nodeclr $node->name: $msg");
300    
301    cmp_ok($node->doc_num, '==', 0, 'no documents');
302    
303    # cleanup test nodes
304    foreach my $node_name ( $test1_node , $test2_node ) {
305            ok($msg = $node->master(
306                    action => 'nodedel',
307                    name => $node_name,
308            ), "nodedel $node_name: $msg");
309    }
310    
311    # test create
312    my $node_name = '_test_create_' . $$;
313    my $node_label = "test $$ label";
314    
315    ok($node = new Search::Estraier::Node(
316            url => "$estmaster_uri/node/$node_name",
317            create => 1,
318            label => $node_label,
319            croak_on_error => 1
320    ), "new create+croak");
321    
322    cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
323    cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
324    
325    ok($node = new Search::Estraier::Node(
326            url => "$estmaster_uri/node/$node_name",
327            create => 1,
328            label => $node_label,
329            croak_on_error => 0
330    ), "new create existing");
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 => 1
337    ), "new create+croak existing");
338    
339    # cleanup
340    ok($msg = $node->master(
341            action => 'nodedel',
342            name => $node_name,
343    ), "nodedel $node_name: $msg");
344    
345    # and again, this time without node
346    ok($node = new Search::Estraier::Node(
347            url => "$estmaster_uri/node/$node_name",
348            create => 1,
349            label => $node_label,
350            croak_on_error => 0
351    ), "new create non-existing");
352    
353    cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
354    cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
355    
356    # cleanup
357    ok($msg = $node->master(
358            action => 'nodedel',
359            name => $node_name,
360    ), "nodedel $node_name: $msg");
361    
362          ok($node->set_link("http://localhost:1978/node/$test2_node", $test1_label, 42), "set_link $test2_node ($test1_label) 42");  ok($msg = $node->master( action => 'sync' ), "sync: $msg");
         ok($node->set_link("http://localhost:1978/node/$test2_node", $test1_label, 0), "set_link $test2_node ($test1_label) delete");  
 }       # SKIP 2  
363    
364  }       # SKIP 1  } # SKIP
365    
366  diag "over";  diag "over";

Legend:
Removed from v.78  
changed lines
  Added in v.152

  ViewVC Help
Powered by ViewVC 1.1.26