/[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 30 by dpavlin, Thu Jan 5 15:33:48 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 => 8;  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  ok(my $node = new Search::Estraier::Node, 'new');  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');  isa_ok($node, 'Search::Estraier::Node');
26    
27  ok($node->set_url('http://localhost:1978/'), 'set_url');  ok($node->set_url("$estmaster_uri/node/$test1_node"), "set_url $test1_node");
28    
29  ok($node->set_proxy('proxy.example.com', 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';
31    
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');
36    
37    cmp_ok($node->status, '==', -1, 'status');
38    
39    # test master functionality
40    
41    SKIP: {
42    
43    skip "can't find estmaster at $estmaster_uri", ($tests - 9) if (! eval { $node->master( action => 'nodelist' ) } );
44    
45    diag "using $estmaster_uri";
46    diag("node->master shutdown not tested");
47    
48    diag("node->master backup not tested");
49    
50    ok(my @users = $node->master( action => 'userlist' ), 'userlist');
51    
52    #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_';
129    @uri=data0
130    @title=Material Girl
131    
132    Living in a material world
133    And I am a material girl
134    You know that we are living in a material world
135    And I am a material girl
136    _END_OF_DRAFT_
137    
138    #diag "draft:\n$draft";
139    ok(my $doc = new Search::Estraier::Document($draft), 'new doc from draft');
140    
141    ok( $node->put_doc($doc), "put_doc data001");
142    
143    for ( 1 .. 17 ) {
144            $doc->add_attr('@uri', 'test' . $_);
145            ok( $node->put_doc($doc), "put_doc test$_");
146            #diag $doc->dump_draft;
147            cmp_ok( $node->doc_num, '==', ($_ + 1), "node->doc_num " . ($_ + 1));
148    }
149    
150    ok(! $node->uri_to_id( 'does-not-exists' ), "non-existant uri_to_id");
151    
152    my $id;
153    ok($id = $node->uri_to_id( 'data0' ), "uri_to_id(data0)");
154    
155    ok($doc = $node->get_doc( $id ), "get_doc($id) for edit");
156    $doc->add_attr('foo', 'bar');
157    #diag Dumper($doc);
158    ok( $node->edit_doc( $doc ), 'edit_doc');
159    
160    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_doc of removed doc");
168    
169    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');
182    ok($cond->set_phrase('girl'), 'cond set_phrase');
183    ok($cond->set_max($max), "cond set_max($max)");
184    ok($cond->set_order('@uri ASCD'), 'cond set_order');
185    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');
188    
189    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    cmp_ok($nres->hits, '==', $doc_num2, "nres->hits $doc_num2");
196    
197    # 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            if ($i < $nres->doc_num) {
204                    ok( my $rdoc = $nres->get_doc( $i ), "nres->get_doc $i");
205    
206                    cmp_ok( $rdoc->attr('@uri'), 'eq', $uri, "\@uri = $uri");
207                    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");
218            cmp_ok( $node->get_doc_attr_by_uri( $uri, '@uri' ), 'eq', $uri, "get_doc_attr $id");
219            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");
221            #diag Dumper($k, $k2);
222            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");
229    
230    my $v;
231    ok($v = $node->name, "name: $v");
232    ok($v = $node->label, "label: $v");
233    ok($v = $node->doc_num, "doc_num: $v");
234    ok(defined($v = $node->word_num), "word_num: $v");
235    ok($v = $node->size, "size: $v");
236    
237    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
260    ok(! $node->set_user('foobar', 1), 'set_user');
261    
262    ok(my $node2 = new Search::Estraier::Node( "$estmaster_uri/node/$test2_node" ), "new $test2_node");
263    ok($node2->set_auth('admin','admin'), "set_auth $test2_node");
264    
265    # croak_on_error
266    
267    ok($node = new Search::Estraier::Node( url => "$estmaster_uri/non-existant", croak_on_error => 1 ), "new non-existant");
268    throws_ok { $node->name } qr/404/, 'croak on error';
269    
270    # croak_on_error
271    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($msg = $node->master( action => 'sync' ), "sync: $msg");
363    
364    } # SKIP
365    
366    diag "over";

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

  ViewVC Help
Powered by ViewVC 1.1.26