The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Wiki::Toolkit::Setup::SQLite;
use OpenGuides::Config;
use OpenGuides;
use OpenGuides::CGI;
use OpenGuides::Test;
use Time::Piece;
use Time::Seconds;
use Test::More tests => 11;

eval { OpenGuides::CGI->make_recent_changes_cookie; };
ok( $@, "->make_recent_changes_cookie dies if no config object supplied" );

eval { OpenGuides::CGI->make_recent_changes_cookie( config => "foo" ); };
ok( $@, "...or if config isn't an OpenGuides::Config" );

my $config = OpenGuides::Config->new( vars => { site_name => "Test Site" } );

eval { OpenGuides::CGI->make_recent_changes_cookie( config => $config ); };
is( $@, "", "...but not if it is" );

my $cookie = OpenGuides::CGI->make_recent_changes_cookie( config => $config );
isa_ok( $cookie, "CGI::Cookie",
        "->make_recent_changes_cookie returns a cookie" );

my $expiry_string = $cookie->expires;
# Hack off the timezone bit since strptime can't parse it portably.
# Timezones taken from RFC 822.
$expiry_string =~ s/ (UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|1[A-IK-Z]|\+\d\d\d\d|-\d\d\d\d)$//;
print "# (String hacked to $expiry_string)\n";
my $expiry = Time::Piece->strptime( $expiry_string, "%a, %d-%b-%Y %T");
print "# Expires: " . $cookie->expires . ", ie $expiry\n";
my $now = localtime;
print "# cookie should still be valid in a year, ie " . ($now + ONE_YEAR) . "\n";
ok( $expiry - ( $now + ONE_YEAR ) > 0, "cookie expiry date correct" );

$ENV{HTTP_COOKIE} = $cookie;

eval { OpenGuides::CGI->get_last_recent_changes_visit_from_cookie; };
ok( $@, "->get_last_recent_changes_visit_from_cookie dies if no config object supplied" );

eval { OpenGuides::CGI->get_last_recent_changes_visit_from_cookie( config => "foo" ); };
ok( $@, "...or if config isn't an OpenGuides::Config" );

eval { OpenGuides::CGI->get_last_recent_changes_visit_from_cookie( config => $config ); };
is( $@, "", "...but not if it is" );

# Check that cookie parsing fails nicely if no cookie set.
delete $ENV{HTTP_COOKIE};
eval { OpenGuides::CGI->get_last_recent_changes_visit_from_cookie( config => $config ); };
is( $@, "", "->get_last_recent_changes_visit_from_cookie doesn't die if no cookie set" );

# Now test that the prefs option is taken note of.
my $have_sqlite = 1;
my $sqlite_error;

eval { require DBD::SQLite; };
if ( $@ ) {
    ($sqlite_error) = $@ =~ /^(.*?)\n/;
    $have_sqlite = 0;
}

SKIP: {
    skip "DBD::SQLite could not be used - no database to test with. ($sqlite_error)", 2
      unless $have_sqlite;
    OpenGuides::Test::refresh_db();


    my $config = OpenGuides::Config->new(
           vars => {
                     dbtype             => "sqlite",
                     dbname             => "t/node.db",
                     indexing_directory => "t/indexes",
                     script_name        => "wiki.cgi",
                     script_url         => "http://example.com/",
                     site_name          => "Test Site",
                     template_path      => "./templates",
                     home_name          => "Home",
                   }
    );
    eval { require Wiki::Toolkit::Search::Plucene; };
    if ( $@ ) { $config->use_plucene ( 0 ) };

    my $guide = OpenGuides->new( config => $config );

    my $prefs_cookie = OpenGuides::CGI->make_prefs_cookie(
        config => $config,
        track_recent_changes_views => 1,
    );
    my $rc_cookie = OpenGuides::CGI->make_recent_changes_cookie(
        config => $config
    );
    $ENV{HTTP_COOKIE} = $prefs_cookie . "; " . $rc_cookie;
    my $output = $guide->display_node(
                                       id            => "RecentChanges",
                                       return_output => 1,
                                     );
    like( $output, qr/Set-Cookie:/, "recent changes cookie set when asked" );

    $prefs_cookie = OpenGuides::CGI->make_prefs_cookie(
        config => $config,
        track_recent_changes_views => 0,
    );
    $ENV{HTTP_COOKIE} = $prefs_cookie . "; " . $rc_cookie;
    $output = $guide->display_node(
                                    id            => "RecentChanges",
                                    return_output => 1,
                                  );
    unlike( $output, qr/Set-Cookie:/, "...and not when not" );
}