adding in tests for the raw HASH session
[catagits/Web-Session.git] / t / lib / TestSessionHash.pm
diff --git a/t/lib/TestSessionHash.pm b/t/lib/TestSessionHash.pm
new file mode 100644 (file)
index 0000000..4573134
--- /dev/null
@@ -0,0 +1,210 @@
+package t::lib::TestSessionHash;
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Exception;
+use Plack::Middleware::Session;
+
+sub create_session {
+    my($mw, $env) = @_;
+
+    my ($session, $session_options);
+    my $app = sub {
+        my $env = shift;
+        $session         = $env->{'psgix.session'};
+        $session_options = $env->{'psgix.session.options'};
+        return sub {
+            my $responder = shift;
+            $responder->([ 200, [], [] ]);
+        };
+    };
+
+    my $res = $mw->($app)->($env);
+
+    return ($session, $session_options, $res);
+}
+
+sub run_all_tests {
+    my %params = @_;
+
+    my (
+        $env_cb,
+        $state,
+        $storage,
+        $response_test,
+        $middleware_create_cb
+    ) = @params{qw[
+        env_cb
+        state
+        store
+        response_test
+        middleware_create_cb
+    ]};
+
+    my $m = $middleware_create_cb
+          || sub { Plack::Middleware::Session->wrap($_[0], state => $state, store => $storage) };
+
+    $response_test ||= sub {
+        my($res_cb, $session_id, $check_expired) = @_;
+        $res_cb->(sub { my $res = shift });
+    };
+
+    my @sids;
+    {
+        my($s, $opts, $res) = create_session($m, $env_cb->());
+
+        push @sids, $opts->{id};
+
+        ok(!$s->{'foo'}, '... no value stored in foo for session');
+
+        lives_ok {
+            $s->{foo} = 'bar';
+        } '... set the value successfully in session';
+
+        is($s->{'foo'}, 'bar', '... got the foo value back successfully from session');
+
+        ok(!$s->{'bar'}, '... no value stored in foo for session');
+
+        lives_ok {
+            $s->{bar} = 'baz';
+        } '... set the value successfully in session';
+
+        is($s->{'bar'}, 'baz', '... got the foo value back successfully from session');
+
+        is_deeply( $s, { foo => 'bar', bar => 'baz' }, '... got the session dump we expected');
+
+        $response_test->($res, $sids[0]);
+    }
+
+    {
+        my($s, $opts, $res) = create_session($m, $env_cb->());
+
+        push @sids, $opts->{id};
+
+        isnt($sids[0], $sids[1], "no same Session ID");
+        ok(!$s->{'foo'}, '... no value stored for foo in session');
+
+        lives_ok {
+            $s->{foo} = 'baz';
+        } '... set the value successfully';
+
+        is($s->{'foo'}, 'baz', '... got the foo value back successfully from session');
+
+        is_deeply( $s, { foo => 'baz' }, '... got the session dump we expected');
+
+        $response_test->($res, $sids[1]);
+    }
+
+    {
+        my($s, $opts, $res) = create_session($m, $env_cb->({ plack_session => $sids[0] }));
+        is($opts->{id}, $sids[0], '... got a basic session id');
+
+        is($s->{'foo'}, 'bar', '... got the value for foo back successfully from session');
+
+
+        lives_ok {
+            delete $s->{'foo'};
+        } '... removed the foo value successfully from session';
+
+        ok(!$s->{'foo'}, '... no value stored for foo in session');
+
+        is_deeply( $s, { bar => 'baz' }, '... got the session dump we expected');
+
+        $response_test->( $res, $sids[0] );
+    }
+
+
+    {
+        my($s, $opts, $res) = create_session($m, $env_cb->({ plack_session => $sids[1] }));
+
+        is($opts->{id}, $sids[1], '... got a basic session id');
+
+        is($s->{'foo'}, 'baz', '... got the foo value back successfully from session');
+
+        is_deeply( $s, { foo => 'baz' }, '... got the session dump we expected');
+
+        $response_test->( $res, $sids[1] );
+    }
+
+    {
+        my($s, $opts, $res) = create_session($m, $env_cb->({ plack_session => $sids[0] }));
+
+        is($opts->{id}, $sids[0], '... got a basic session id');
+
+        ok(!$s->{'foo'}, '... no value stored for foo in session');
+
+        lives_ok {
+            $s->{baz} = 'gorch';
+        } '... set the bar value successfully in session';
+
+        is_deeply( $s, { bar => 'baz', baz => 'gorch' }, '... got the session dump we expected');
+
+        $response_test->( $res, $sids[0] );
+    }
+
+    {
+        my($s, $opts, $res) = create_session($m, $env_cb->({ plack_session => $sids[0] }));
+
+        is($s->{'bar'}, 'baz', '... got the bar value back successfully from session');
+
+        lives_ok {
+            $opts->{expire} = 1;
+        } '... expired session successfully';
+
+        $response_test->( $res, $sids[0], 1 );
+
+        # XXX
+        # this will not pass, because
+        # it is just a hash ref and we are
+        # not clearing it. Should we be?
+        # - SL
+        # is_deeply( $s, {}, '... got the session dump we expected');
+    }
+
+    {
+        my($s, $opts, $res) = create_session($m, $env_cb->({ plack_session => $sids[0] }));
+
+        push @sids, $opts->{id};
+        isnt($opts->{id}, $sids[0], 'expired ... got a new session id');
+
+        ok(!$s->{'bar'}, '... no bar value stored');
+
+        is_deeply( $s, {}, '... got the session dump we expected');
+
+        $response_test->( $res, $sids[2] );
+    }
+
+    {
+        my($s, $opts, $res) = create_session($m, $env_cb->({ plack_session => $sids[1] }));
+
+        is($opts->{id}, $sids[1], '... got a basic session id');
+
+        is($s->{'foo'}, 'baz', '... got the foo value back successfully from session');
+
+        is_deeply( $s, { foo => 'baz' }, '... got the session dump we expected');
+
+        $response_test->( $res, $sids[1] );
+    }
+
+    {
+        # wrong format session_id
+        my($s, $opts, $res) = create_session($m, $env_cb->({ plack_session => "../wrong" }));
+
+        isnt('../wrong' => $opts->{id}, '... regenerate session id');
+
+        ok(!$s->{'foo'}, '... no value stored for foo in session');
+
+        lives_ok {
+            $s->{foo} = 'baz';
+        } '... set the value successfully';
+
+        is($s->{'foo'}, 'baz', '... got the foo value back successfully from session');
+
+        is_deeply( $s, { foo => 'baz' }, '... got the session dump we expected');
+
+        $response_test->( $res, $opts->{id} );
+    }
+}
+
+1;