/[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 190 by dpavlin, Sun Nov 5 16:25:56 2006 UTC
# Line 3  Line 3 
3  use strict;  use strict;
4  use blib;  use blib;
5    
6  use Test::More tests => 5;  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  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('', 8080), 'set_proxy');
30    throws_ok {$node->set_proxy('proxy.example.com', 'foo') } qr/port/, 'set_proxy port NaN';
31    
32    ok($node->set_timeout(42), 'set_timeout');
33    throws_ok {$node->set_timeout('foo') } qr/timeout/, 'set_timeout NaN';
34    
35    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');
43    
44    # 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    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_';
134    @uri=data0
135    @title=Material Girl
136    
137    Living in a material world
138    And I am a material girl
139    You know that we are living in a material world
140    And I am a material girl
141    _END_OF_DRAFT_
142    
143    #diag "draft:\n$draft";
144    ok(my $doc = new Search::Estraier::Document($draft), 'new doc from draft');
145    
146    ok( $node->put_doc($doc), "put_doc data001");
147    
148    for ( 1 .. 17 ) {
149            $doc->add_attr('@uri', 'test' . $_);
150            $doc->set_score( $_ * 10000 );
151            ok( $node->put_doc($doc), "put_doc test$_");
152            #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;
159    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    ok($doc = $node->get_doc( $id ), "get_doc($id) for edit");
164    $doc->add_attr('foo', 'bar');
165    #diag Dumper($doc);
166    ok( $node->edit_doc( $doc ), 'edit_doc');
167    
168    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    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    # test distinct
281    ok(my $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
293    ok($node->set_user('foobar', 1), 'set_user');
294    
295    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");
297    
298    # croak_on_error
299    
300    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';
302    
303    # croak_on_error
304    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    
308    
309    # test users
310    ok($node->admins, 'have admins');
311    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
398    
399  ok($node->set_proxy('proxy.example.com', 8080), 'set_proxy');  diag "over";

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

  ViewVC Help
Powered by ViewVC 1.1.26