I finally spent time looking at why this plugin didn't work.  I use
session cookies and the module didn't work with session cookies.

Here's a failing (now passing) test case and patch against svn.



-- 
Bill Moseley
[EMAIL PROTECTED]

Index: t/session_cookie.t
===================================================================
--- t/session_cookie.t	(revision 0)
+++ t/session_cookie.t	(revision 0)
@@ -0,0 +1,127 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+use HTTP::Date;
+
+BEGIN {
+    eval { require Catalyst::Plugin::Session::State::Cookie; Catalyst::Plugin::Session::State::Cookie->VERSION(0.03) }
+      or plan skip_all =>
+      "Catalyst::Plugin::Session::State::Cookie 0.03 or higher is required for this test";
+
+    eval { require Test::WWW::Mechanize::Catalyst }
+      or plan skip_all =>
+      "Test::WWW::Mechanize::Catalyst is required for this test";
+
+    plan tests => 13;
+}
+
+my $cookie_name = 'test_session';
+my $ttl = 60 * 60;  # Remember me for an hour
+
+{
+    package SessionTest;
+    use strict;
+    use warnings;
+
+    use Catalyst qw/
+        Session::DynamicExpiry
+        Session
+        Session::Store::Dummy
+        Session::State::Cookie
+    /;
+
+    my $config = {
+        session => {
+            cookie_name     => $cookie_name,
+            cookie_expires  => 0,   # Use session cookies
+        },
+    };
+
+    sub counter : Path( '/foo/counter' )  {
+        my ( $self, $c ) = @_;
+        $c->res->body( ++$c->session->{counter} );
+    }
+
+    sub remember_me : Path( '/foo/remember_me' ) {
+        my ( $self, $c ) = @_;
+        $c->session_time_to_live( $ttl );
+        $c->forward("counter");
+    }
+
+    __PACKAGE__->config( $config );
+    __PACKAGE__->setup;
+}
+
+
+
+
+use Test::WWW::Mechanize::Catalyst 'SessionTest';
+
+    my $m = Test::WWW::Mechanize::Catalyst->new;
+
+    # Add an initial bad cookie for good measure.
+    $m->cookie_jar->set_cookie(
+        0,               # version
+        $cookie_name,    # key
+        time(),          # invalid session id
+        '/',             # path
+        '.local',        # domain   # is this portable?
+        80,              # port
+        0,               # path_spec
+        0,               # secure
+        100,             # max_age ttl seconds
+        0,               # discard
+    );
+
+    $m->get_ok("http://localhost/foo/counter";);
+    $m->content_is( 1, "counter worked" );
+
+
+
+
+    $m->get_ok("http://localhost/foo/counter";);
+    $m->content_is( 2, "counter worked" );
+
+    my $cookie_expires = cookie_expires( $m->response );
+
+
+    ok( !defined($cookie_expires), "have session cookie (no expires)" );
+
+
+
+    # This sets the session value.
+
+    $m->get_ok("http://localhost/foo/remember_me";);
+    $m->content_is( 3, "counter worked" );
+
+    my $long_cookie_expires = cookie_expires( $m->response );
+
+    ok( defined($long_cookie_expires), "expiry time defined" );
+
+    cmp_ok( $long_cookie_expires, '>', time() + $ttl - 20, "The expire time is set");
+
+
+    # Now a request to see if the long time is still there
+
+    $m->get_ok("http://localhost/foo/counter";);
+    $m->content_is( 4, "counter worked" );
+
+    $long_cookie_expires = cookie_expires( $m->response );
+
+    ok( defined($long_cookie_expires), "expiry time defined" );
+
+    cmp_ok( $long_cookie_expires, '>', time() + $ttl - 20, "The expire time is still set");
+
+sub cookie_expires {
+    my $response = shift;
+
+    my $c = CGI::Simple::Cookie->parse( $response->header( 'Set-Cookie' ) )->{expires};
+
+    return unless $c;
+
+    return str2time( $c->value );
+}
+
Index: lib/Catalyst/Plugin/Session/DynamicExpiry.pm
===================================================================
--- lib/Catalyst/Plugin/Session/DynamicExpiry.pm	(revision 7224)
+++ lib/Catalyst/Plugin/Session/DynamicExpiry.pm	(working copy)
@@ -6,7 +6,7 @@
 
 use NEXT;
 
-our $VERSION='0.03';
+our $VERSION='0.04';
 
 __PACKAGE__->mk_accessors(qw/_session_time_to_live/);
 
@@ -44,6 +44,21 @@
     return $c->NEXT::calculate_extended_session_expires( @_ );
 }
 
+# Handle the situation when using session cookies (cookie_expiers == 0)
+sub calculate_session_cookie_expires {
+    my $c       = shift;
+    my $expires = $c->config->{session}{cookie_expires};
+    my $ttl     = $c->session_time_to_live;
+
+    # Return our ttl if it's set and configured for session cookies
+
+    return $ttl && defined $expires && $expires == 0
+        ? time() + $ttl
+        : $c->NEXT::calculate_session_cookie_expires(@_);
+}
+
+
+
 sub _save_session {
     my $c = shift;
 
Index: Changes
===================================================================
--- Changes	(revision 7224)
+++ Changes	(working copy)
@@ -1,5 +1,9 @@
 Revision history for Perl extension Catalyst::Plugin::Session::DynamicExpiry
 
+0.04
+        - Added failing test for session cookie
+        - Added calculate_session_cookie_expires() to fix above failing test.
+
 0.03    2007-09-06
         - Added plugin order warning
         - Switch to module::install
_______________________________________________
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[EMAIL PROTECTED]/
Dev site: http://dev.catalyst.perl.org/

Reply via email to