Version 0.35
[catagits/Catalyst-Plugin-Session.git] / lib / Catalyst / Plugin / Session / Test / Store.pm
1 #!/usr/bin/perl
2
3 package Catalyst::Plugin::Session::Test::Store;
4
5 use strict;
6 use warnings;
7
8 use utf8;
9
10 use Test::More;
11 use File::Temp;
12 use File::Spec;
13
14 use Catalyst ();
15
16 sub import {
17     shift;
18     my %args = @_;
19
20     plan tests => 19 + ($args{extra_tests} || 0);
21
22     my $backend = $args{backend};
23     my $cfg     = $args{config};
24
25     my $p = "Session::Store::$backend";
26     use_ok( my $m = "Catalyst::Plugin::$p" );
27
28     isa_ok( bless( {}, $m ), "Catalyst::Plugin::Session::Store" );
29
30     {
31         package # Hide from PAUSE
32             Catalyst::Plugin::SessionStateTest;
33         use base qw/Catalyst::Plugin::Session::State/;
34
35         no strict 'refs';
36
37         sub get_session_id {
38             my $c = shift;
39             ${ ref($c) . "::session_id" };
40         }
41
42         sub set_session_id {
43             my ( $c, $sid ) = @_;
44             ${ ref($c) . "::session_id" } = $sid;
45         }
46
47         sub delete_session_id {
48             my $c = shift;
49             undef ${ ref($c) . "::session_id" };
50         }
51     }
52
53     {
54
55         package # Hide from PAUSE
56             SessionStoreTest;
57         use Catalyst qw/Session SessionStateTest/;
58         push our (@ISA), $m;
59
60         use strict;
61         use warnings;
62
63         use Test::More;
64
65         sub create_session : Global {
66             my ( $self, $c ) = @_;
67             ok( !$c->session_is_valid, "no session id yet" );
68             ok( $c->session,           "session created" );
69             ok( $c->session_is_valid,  "with a session id" );
70
71             $c->session->{magic} = "møøse";
72         }
73
74         sub recover_session : Global {
75             my ( $self, $c ) = @_;
76             ok( $c->session_is_valid, "session id exists" );
77             is( $c->sessionid, our $session_id,
78                 "and is the one we saved in the last action" );
79             ok( $c->session, "a session exists" );
80             is( $c->session->{magic},
81                 "møøse",
82                 "and it contains what we put in on the last attempt" );
83             $c->delete_session("user logout");
84         }
85
86         sub after_session : Global {
87             my ( $self, $c ) = @_;
88             ok( !$c->session_is_valid,      "no session id" );
89             ok( !$c->session->{magic},      "session data not restored" );
90             ok( !$c->session_delete_reason, "no reason for deletion" );
91         }
92
93         @{ __PACKAGE__->config->{'Plugin::Session'} }{ keys %$cfg } = values %$cfg;
94
95         { __PACKAGE__->setup; }; # Extra block here is an INSANE HACK to get inlined constructor
96                                  # (i.e. to make B::Hooks::EndOfScope fire)
97     }
98
99     {
100
101         package # Hide from PAUSE
102             SessionStoreTest2;
103         use Catalyst qw/Session SessionStateTest/;
104         push our (@ISA), $m;
105
106         use Test::More;
107
108         sub create_session : Global {
109             my ( $self, $c ) = @_;
110
111             $c->session->{magic} = "møøse";
112         }
113
114         sub recover_session : Global {
115             my ( $self, $c ) = @_;
116
117             ok( !$c->session_is_valid, "session is gone" );
118
119             is(
120                 $c->session_delete_reason,
121                 "session expired",
122                 "reason is that the session expired"
123             );
124
125             ok( !$c->session->{magic}, "no saved data" );
126         }
127
128         __PACKAGE__->config->{'Plugin::Session'}{expires} = 0;
129
130         @{ __PACKAGE__->config->{'Plugin::Session'} }{ keys %$cfg } = values %$cfg;
131
132         { __PACKAGE__->setup; }; # INSANE HACK (the block - as above)
133     }
134
135     use Test::More;
136
137     can_ok( $m, "get_session_data" );
138     can_ok( $m, "store_session_data" );
139     can_ok( $m, "delete_session_data" );
140     can_ok( $m, "delete_expired_sessions" );
141
142     {
143
144         package # Hide from PAUSE
145             t1;
146         use Catalyst::Test "SessionStoreTest";
147
148         # idiotic void context warning workaround
149         
150         my $x = get("/create_session");
151         $x = get("/recover_session");
152         $x = get("/after_session");
153     }
154
155     {
156
157         package # Hide fram PAUSE
158             t2;
159         use Catalyst::Test "SessionStoreTest2";
160
161         my $x = get("/create_session");
162         sleep 1;    # let the session expire
163         $x = get("/recover_session");
164     }
165 }
166
167 __PACKAGE__;
168
169 __END__
170
171 =pod
172
173 =head1 NAME
174
175 Catalyst::Plugin::Session::Test::Store - Reusable sanity for session storage
176 engines.
177
178 =head1 SYNOPSIS
179
180     #!/usr/bin/perl
181
182     use Catalyst::Plugin::Session::Test::Store (
183         backend => "FastMmap",
184         config => {
185             storage => "/tmp/foo",
186         },
187     );
188
189 =head1 DESCRIPTION
190
191 =cut
192
193