source: trunk/t/33_supersearch_advanced_search.t @ 469

Last change on this file since 469 was 469, checked in by kake, 17 years ago

Added option of using Plucene for searching.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.7 KB
Line 
1use strict;
2use CGI::Wiki::Setup::SQLite;
3use Config::Tiny;
4use OpenGuides::SuperSearch;
5use Test::More tests => 8;
6
7eval { require DBD::SQLite; };
8my $have_sqlite = $@ ? 0 : 1;
9
10SKIP: {
11    skip "DBD::SQLite not installed - no database to test with", 8
12      unless $have_sqlite;
13
14    # Clear out the database from any previous runs.
15    unlink "t/node.db";
16    unlink <t/indexes/*>;
17
18    CGI::Wiki::Setup::SQLite::setup( { dbname => "t/node.db" } );
19    my $config = Config::Tiny->new;
20    $config->{_} = {
21                     dbtype             => "sqlite",
22                     dbname             => "t/node.db",
23                     indexing_directory => "t/indexes",
24                     script_name        => "wiki.cgi",
25                     script_url         => "http://example.com/",
26                     site_name          => "Test Site",
27                     template_path      => "./templates",
28                   };
29
30    # Plucene is the recommended searcher now.
31    eval { require CGI::Wiki::Search::Plucene; };
32    unless ( $@ ) {
33        $config->{_}{use_plucene} = 1;
34    }
35
36    my $search = OpenGuides::SuperSearch->new( config => $config );
37
38    # Add some data.  Write more than one pub to avoid hitting the redirect.
39    my $wiki = $search->{wiki}; # white boxiness
40    my $ctdata = {
41                   os_x      => 523465,
42                   os_y      => 177490,
43                   latitude  => 51.482385,
44                   longitude => -0.221743,
45                   category  => "Pubs",
46                 };
47    $wiki->write_node( "Crabtree Tavern",
48                       "Nice pub on the riverbank.",
49                       undef,
50                       $ctdata,
51                     ) or die "Couldn't write node";
52    my $badata = {
53                   os_x      => 522909,
54                   os_y      => 178232,
55                   latitude  => 51.489176,
56                   longitude => -0.229488,
57                   category  => "Pubs",
58                 };
59    $wiki->write_node( "Blue Anchor",
60                       "Another pub.",
61                       undef,
62                       $badata,
63                     ) or die "Couldn't write node";
64    my $stdata = {
65                   os_x      => 528107,
66                   os_y      => 179347,
67                   latitude  => 51.498043,
68                   longitude => -0.154247,
69                   category  => "Pubs",
70                 };
71    $wiki->write_node( "Star Tavern",
72                       "A most excellent pub.",
73                       undef,
74                       $stdata,
75                     ) or die "Couldn't write node";
76    my $hbdata = {
77                   os_x      => 522983,
78                   os_y      => 178118,
79                   latitude  => 51.488135,
80                   longitude => -0.228463,
81                 };
82    $wiki->write_node( "Hammersmith Bridge",
83                       "It's a bridge.",
84                       undef,
85                       $hbdata,
86                     ) or die "Couldn't write node";
87
88    # Check that a distance search finds them.
89    my %tt_vars = $search->run(
90                                return_tt_vars => 1,
91                                vars => {
92                                          lat  => 51.484320,
93                                          long => -0.223484,
94                                          distance_in_metres => 1000,
95                                        },
96                              );
97    my @ordered = map { $_->{name} } @{ $tt_vars{results} || [] };
98    my @found = sort @ordered;
99    print "# Distances should be:\n";
100    use CGI::Wiki::Plugin::Locator::UK;
101    my $locator = CGI::Wiki::Plugin::Locator::UK->new;
102    $wiki->register_plugin( plugin => $locator );
103    foreach my $node ( "Blue Anchor", "Crabtree Tavern", "Hammersmith Bridge"){
104        print "# $node: " . $locator->distance( from_lat  => 51.484320,
105                                                from_long => -0.223484,
106                                                to_node   => $node ) . "\n";
107    }
108    is_deeply( \@found,
109               [ "Blue_Anchor", "Crabtree_Tavern", "Hammersmith_Bridge" ],
110               "distance search finds the right things" );
111    is_deeply( \@ordered,
112               [ "Crabtree_Tavern", "Hammersmith_Bridge", "Blue_Anchor" ],
113               "...and returns them in the right order" );
114
115    %tt_vars = $search->run(
116                             return_tt_vars => 1,
117                             vars => {
118                                       lat  => 51.484320,
119                                       long => -0.223484,
120                                       distance_in_metres => 1000,
121                                       search => " ",
122                                     },
123                           );
124    @ordered = map { $_->{name} } @{ $tt_vars{results} || [] };
125    @found = sort @ordered;
126    is_deeply( \@found,
127               [ "Blue_Anchor", "Crabtree_Tavern", "Hammersmith_Bridge" ],
128               "...still works if whitespace-only search text supplied" );
129
130    %tt_vars = $search->run(
131                             return_tt_vars => 1,
132                             vars => {
133                                       os_x => 523450,
134                                       os_y => 177650,
135                                       distance_in_metres => 1000,
136                                       search => " ",
137                                     },
138                           );
139    @ordered = map { $_->{name} } @{ $tt_vars{results} || [] };
140    @found = sort @ordered;
141    is_deeply( \@found,
142               [ "Blue_Anchor", "Crabtree_Tavern", "Hammersmith_Bridge" ],
143               "...works with OS co-ords" );
144
145    %tt_vars = eval {
146               $search->run(
147                             return_tt_vars => 1,
148                             vars => {
149                                       os_x => 523450,
150                                       os_y => 177650,
151                                       distance_in_metres => 1000,
152                                       search => " ",
153                                       lat => " ",
154                                       long => " ",
155                                     },
156                           );
157    };
158    is( $@, "", "...works with OS co-ords and whitespace-only lat/long" );
159    @ordered = map { $_->{name} } @{ $tt_vars{results} || [] };
160    @found = sort @ordered;
161    is_deeply( \@found,
162               [ "Blue_Anchor", "Crabtree_Tavern", "Hammersmith_Bridge" ],
163                 "...returns the right stuff" );
164
165    %tt_vars = $search->run(
166                             return_tt_vars => 1,
167                             vars => {
168                                       lat  => 51.484320,
169                                       long => -0.223484,
170                                       distance_in_metres => 1000,
171                                       search => "pubs",
172                                     },
173                           );
174    @found = sort map { $_->{name} } @{ $tt_vars{results} || [] };
175    is_deeply( \@found, [ "Blue_Anchor", "Crabtree_Tavern", ],
176               "distance search in combination with text search works" );
177
178    %tt_vars = $search->run(
179                             return_tt_vars => 1,
180                             vars => {
181                                       os_x => 523450,
182                                       os_y => 177650,
183                                       distance_in_metres => 1000,
184                                       search => "pubs",
185                                     },
186                           );
187    @found = sort map { $_->{name} } @{ $tt_vars{results} || [] };
188    is_deeply( \@found, [ "Blue_Anchor", "Crabtree_Tavern", ],
189               "...works with OS co-ords too" );
190}
Note: See TracBrowser for help on using the repository browser.