use strict; use Wiki::Toolkit::Setup::SQLite; use OpenGuides::Test; use OpenGuides; use Test::More; eval { require DBD::SQLite; }; if ( $@ ) { my ($error) = $@ =~ /^(.*?)\n/; plan skip_all => "DBD::SQLite could not be used - no database to test with ($error)"; } plan tests => 8; my ( $config, $guide, $wiki ); # Clear out database from previous runs, set up a guide. OpenGuides::Test::refresh_db(); $config = OpenGuides::Test->make_basic_config; $config->script_url( "http://www.example.com/" ); $config->script_name( "wiki.cgi" ); $guide = OpenGuides->new( config => $config ); $wiki = $guide->wiki; # Write some data. my %nodes = map { $_ => "A pub." } ( "Red Lion", "Farmers Arms", "Angel" ); foreach my $node ( keys %nodes ) { OpenGuides::Test->write_data( guide => $guide, node => $node, return_output => 1, ); } # See what we get when we ask for a random page. my $output = $guide->display_random_page( return_output => 1 ); # Old versions of CGI.pm mistakenly print location: instead of Location: like( $output, qr/[lL]ocation: http:\/\/www.example.com\/wiki.cgi/, "->display_random_page makes a redirect" ); my $node = get_node_from_output( $output ); print "# Random node chosen: $node\n"; ok( $nodes{$node}, "...to an existing node" ); # Clear the database and write some data including categories and locales. OpenGuides::Test::refresh_db(); $config = OpenGuides::Test->make_basic_config; $config->script_url( "http://www.example.com/" ); $config->script_name( "wiki.cgi" ); $guide = OpenGuides->new( config => $config ); $wiki = $guide->wiki; # Write data including some categories/locales. OpenGuides::Test->write_data( guide => $guide, node => "Red Lion", locales => "Hammersmith", categories => "Pubs", return_output => 1, ); # Check we can turn off locales. $config = OpenGuides::Test->make_basic_config; $config->script_url( "http://www.example.com/" ); $config->script_name( "wiki.cgi" ); $config->random_page_omits_locales( 1 ); $guide = OpenGuides->new( config => $config ); $wiki = $guide->wiki; $output = $guide->display_random_page( return_output => 1 ); $node = get_node_from_output( $output ); print "# Random node chosen: $node\n"; isnt( $node, "Locale Hammersmith", "locale nodes not picked up as random page " . "(this test may sometimes pass when it shouldn't)" ); # Check we can turn off categories. $config = OpenGuides::Test->make_basic_config; $config->script_url( "http://www.example.com/" ); $config->script_name( "wiki.cgi" ); $config->random_page_omits_categories( 1 ); $guide = OpenGuides->new( config => $config ); $wiki = $guide->wiki; $output = $guide->display_random_page( return_output => 1 ); $node = get_node_from_output( $output ); print "# Random node chosen: $node\n"; isnt( $node, "Category Pubs", "category nodes not picked up as random page " . "(this test may sometimes pass when it shouldn't)" ); # Now make sure we can pick things up from specific categories/locales if asked OpenGuides::Test::refresh_db(); $config = OpenGuides::Test->make_basic_config; $guide = OpenGuides->new( config => $config ); OpenGuides::Test->write_data( guide => $guide, node => "Red Lion", locales => "Hammersmith", categories => "Pubs", return_output => 1, ); OpenGuides::Test->write_data( guide => $guide, node => "Poppy Hana", locales => "Bermondsey", categories => "Restaurants", return_output => 1, ); $output = $guide->display_random_page( category => "Pubs", return_output => 1 ); $node = get_node_from_output( $output ); print "# Random node chosen: $node\n"; is( $node, "Red Lion", "can ask for a random pub " . "(this test may sometimes pass when it shouldn't)" ); $output = $guide->display_random_page( locale => "Bermondsey", return_output => 1 ); $node = get_node_from_output( $output ); print "# Random node chosen: $node\n"; is( $node, "Poppy Hana", "can ask for a random thing in Bermondsey " . "(this test may sometimes pass when it shouldn't)" ); OpenGuides::Test->write_data( guide => $guide, node => "Stanley Arms", locales => "Bermondsey", categories => "Pubs", return_output => 1, ); $output = $guide->display_random_page( locale => "Bermondsey", category => "Pubs", return_output => 1 ); $node = get_node_from_output( $output ); print "# Random node chosen: $node\n"; is( $node, "Stanley Arms", "can ask for a random pub in Bermondsey " . "(this test may sometimes pass when it shouldn't)" ); $output = $guide->display_random_page( locale => "Islington", category => "Cinemas", return_output => 1 ); unlike( $output, qr/Status: 302/, "don't get a redirect if we ask for category/locale with no pages in" ); sub get_node_from_output { my $node_param = shift; $node_param =~ s/^.*\?//s; $node_param =~ s/\s+$//; my $formatter = $guide->wiki->formatter; my $node = $formatter->node_param_to_node_name( $node_param ); return $node; }