/[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 43 by dpavlin, Fri Jan 6 00:04:28 2006 UTC revision 187 by dpavlin, Sun Nov 5 16:01:36 2006 UTC
# Line 3  Line 3 
3  use strict;  use strict;
4  use blib;  use blib;
5    
6  use Test::More tests => 40;  my $tests = 304;
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 $test_node = 'Search-Estraier';  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), '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/searchestraier'), 'set_url');  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 25  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  my @res = ( -1, 200 );  # 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  my $nodelist;  if ($#nodes > 42) {
97  foreach my $url (qw{?action=nodelist http://localhost:1978/master?action=nodelist}) {          diag <<'_END_OF_WARNING_';
98          cmp_ok(  
99                  $node->shuttle_url( $url, 'text/plain', undef, \$nodelist)  This tests create three nodes in your Hyper Estraier.
100          ,'==', shift @res, 'nodelist');  
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 51  _END_OF_DRAFT_ Line 143  _END_OF_DRAFT_
143  #diag "draft:\n$draft";  #diag "draft:\n$draft";
144  ok(my $doc = new Search::Estraier::Document($draft), 'new doc from draft');  ok(my $doc = new Search::Estraier::Document($draft), 'new doc from draft');
145    
146  for ( 1 .. 10 ) {  ok( $node->put_doc($doc), "put_doc data001");
147    
148    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->out_doc( 0 ), 'out_doc');  ok(! $node->uri_to_id( 'does-not-exists' ), "non-existant uri_to_id");
157    
158  for ( 1 .. 5 ) {  my $id;
159          ok( $node->out_doc_by_uri( 'test' . $_ ), "out_doc_by_uri test$_");  ok($id = $node->uri_to_id( 'data0' ), "uri_to_id(data0)");
160  }  
161    throws_ok { $node->get_doc( 'foo') } qr/id must be number/, 'croak on non-number';
162    
163  $doc->add_attr('@uri', 'data001');  ok($doc = $node->get_doc( $id ), "get_doc($id) for edit");
164  $doc->add_attr('foo', 'bar');  $doc->add_attr('foo', 'bar');
165    #diag Dumper($doc);
166  ok( $node->edit_doc( $doc ), 'edit_doc');  ok( $node->edit_doc( $doc ), 'edit_doc');
167    
168  for ( 6 .. 10 ) {  my $doc_num;
169          ok( $node->get_doc( $_ ), "get_doc $_");  ok( $doc_num = $node->doc_num, "node->doc_num $doc_num");
170          ok( $node->get_doc_by_uri( 'test' . $_ ), "get_doc_by_uri test$_");  
171    ok( $node->out_doc( $id ), "out_doc($id)");
172    
173    cmp_ok( $node->doc_num, '==', --$doc_num, "node->doc_num " . $doc_num);
174    
175    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');
193    ok($cond->set_phrase('girl'), 'cond set_phrase');
194    ok($cond->set_max($max), "cond set_max($max)");
195    ok($cond->set_order('@uri ASCD'), 'cond set_order');
196    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&mask=6', 'cond_to_query');
200    
201    ok( my $nres = $node->search( $cond, 0 ), 'search');
202    
203    isa_ok( $nres, 'Search::Estraier::NodeResult' );
204    
205    cmp_ok($nres->doc_num, '==', $max, "nres->doc_num $max");
206    
207    cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
208    
209    # upper limit is $nres->hits and not $nres->doc_num because we
210    # check all documents, not just results!
211    for my $i ( 0 .. ($nres->hits - 1) ) {
212            my $num = $i + $delete_num + 1;
213            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");
234            cmp_ok( $node->get_doc_attr_by_uri( $uri, '@uri' ), 'eq', $uri, "get_doc_attr $id");
235            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");
237            #diag Dumper($k, $k2);
238            ok( eq_hash( $k1, $k2 ), "keywords");
239  }  }
240    
241    ok(my $hints = $nres->hints, 'hints');
242    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");
248    
249    my $v;
250    ok($v = $node->name, "name: $v");
251    ok($v = $node->label, "label: $v");
252    ok($v = $node->doc_num, "doc_num: $v");
253    ok(defined($v = $node->word_num), "word_num: $v");
254    ok($v = $node->size, "size: $v");
255    
256    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    
281    # user doesn't exist
282    ok($node->set_user('foobar', 1), 'set_user');
283    
284    ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
285    ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
286    
287    # croak_on_error
288    
289    ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
290    throws_ok { $node->name } qr/404/, 'croak on error';
291    
292    # croak_on_error
293    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");
294    
295    ok(! $node->uri_to_id('foobar'), 'uri_to_id without croak');
296    
297    
298    # test users
299    ok($node->admins, 'have admins');
300    ok(! $node->guests, 'no guests');
301    
302    
303    # test search without results
304    ok($cond = new Search::Estraier::Condition, 'new cond');
305    ok($cond->set_phrase('this_is_phrase_which_does_not_exits'), 'cond set_phrase');
306    
307    ok($nres = $node->search( $cond, 0 ), 'search');
308    
309    # now, test links
310    my $test2_label = "$test2_node label";
311    my $link_url = "$estmaster_uri/node/$test2_node";
312    ok($node->set_link( $link_url, $test2_label, 42), "set_link $test2_node ($test2_label) 42");
313    ok(my $links = $node->links, 'links');
314    cmp_ok($#{$links}, '==', 0, 'one link');
315    like($links->[0], qr/^$link_url/, 'link correct');
316    ok($node->set_link("$estmaster_uri/node/$test2_node", $test2_label, 0), "set_link $test2_node ($test2_label) delete");
317    
318    ok($msg = $node->master(
319            action => 'nodeclr',
320            name => $node->name,
321    ), "nodeclr " . $node->name . ": $msg");
322    
323    cmp_ok($node->doc_num, '==', 0, 'no documents');
324    
325    # cleanup test nodes
326    foreach my $node_name ( $test1_node , $test2_node ) {
327            ok($msg = $node->master(
328                    action => 'nodedel',
329                    name => $node_name,
330            ), "nodedel $node_name: $msg");
331    }
332    
333    # test create
334    my $node_name = '_test_create_' . $$;
335    my $node_label = "test $$ label";
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");
343    
344    cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
345    cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
346    
347    ok($node = new Search::Estraier::Node(
348            url => "$estmaster_uri/node/$node_name",
349            create => 1,
350            label => $node_label,
351            croak_on_error => 0
352    ), "new create existing");
353    
354    ok($node = new Search::Estraier::Node(
355            url => "$estmaster_uri/node/$node_name",
356            create => 1,
357            label => $node_label,
358            croak_on_error => 1
359    ), "new create+croak existing");
360    
361    # cleanup
362    ok($msg = $node->master(
363            action => 'nodedel',
364            name => $node_name,
365    ), "nodedel $node_name: $msg");
366    
367    # and again, this time without node
368    ok($node = new Search::Estraier::Node(
369            url => "$estmaster_uri/node/$node_name",
370            create => 1,
371            label => $node_label,
372            croak_on_error => 0
373    ), "new create non-existing");
374    
375    cmp_ok($node->name, 'eq', $node_name, "node $node_name exists");
376    cmp_ok($node->label, 'eq', $node_label, "node label: $node_label");
377    
378    # cleanup
379    ok($msg = $node->master(
380            action => 'nodedel',
381            name => $node_name,
382    ), "nodedel $node_name: $msg");
383    
384    ok($msg = $node->master( action => 'sync' ), "sync: $msg");
385    
386    } # SKIP
387    
388    diag "over";

Legend:
Removed from v.43  
changed lines
  Added in v.187

  ViewVC Help
Powered by ViewVC 1.1.26