#!/usr/bin/perl

use strict;
use warnings;

use Test::More;

BEGIN {
    eval { require Test::WWW::Mechanize::Catalyst };
    plan skip_all =>
      "This test requires Test::WWW::Mechanize::Catalyst in order to run"
      if $@;
    plan 'no_plan';
}

{

    package CookieTestApp;
    use Catalyst qw/
      Session
      Session::Store::Dummy
      Session::State::Cookie
      /;

    my $cookie = 'my_cookie';

    sub set_cookie : Local {
        my ( $self, $c ) = @_;
        $c->res->body( $c->action->name );
        $c->session->{bar} = time; # Trigger session write
    }

    sub got_cookie : Local {
        my ( $self, $c ) = @_;
        $c->res->body( $c->req->cookie($cookie) ? 'got cookie' : 'missing cookie' );
        $c->session->{bar} = time; # Trigger session write
    }

    sub remember_me : Local {
        my ( $self, $c, $expires ) = @_;
        $c->res->body( $expires );
        $c->stash->{remember_me} = $expires;
        $c->session->{bar} = time; # Trigger session write
    }

    sub finalize_headers {
        my $c = shift;
        $c->NEXT::finalize_headers( @_ );
        warn "\n>>> after finalize headers (notice if before or after calc_session_cookie_expires ) <<<\n";
    }



    sub calculate_session_cookie_expires {
        my $c = shift;
        warn "\n**in calculate_session_cookie_expires\n";
        return $c->stash->{remember_me};
    }

    __PACKAGE__->config->{session}{cookie_name} = $cookie;

    __PACKAGE__->setup;
}

use Test::WWW::Mechanize::Catalyst qw/CookieTestApp/;

my $m = Test::WWW::Mechanize::Catalyst->new;

# Make sure we get a cookie back
$m->get_ok( "http://localhost/set_cookie", "get page" );
$m->content_contains( "set_cookie", "returned set_cooke" );

ok( $m->response->header('set_cookie'), 'cookie returned on first request' );


# Make sure we send the cookie back.
$m->get_ok( "http://localhost/got_cookie", "send cookie back" );
$m->content_contains( "got cookie", "app got cookie" );


# Make sure we have a session cookie without any expires attribute
my $expired;
$m->cookie_jar->scan( sub { $expired = $_[8] } );

ok( !defined $expired, 'Session cookie returned' );


# Send a request to get a cookie with an expires attribute.

my $expires = time + 3600;
$m->get_ok( "http://localhost/remember_me/$expires", "send cookie back" );
$m->content_contains( $expires, "remember_me action got expires value" );

ok( $m->response->header('set_cookie'), 'cookie returned on second request' );

$m->cookie_jar->scan( sub { $expired = $_[8] } );
is( $expired, $expires, 'Cookie with expires returned' );


