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

Legend:
Removed from v.29  
changed lines
  Added in v.150

  ViewVC Help
Powered by ViewVC 1.1.26