Fix VERSIOON, eugh
[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         our $VERSION = "123"; # Do not remove
61
62         use strict;
63         use warnings;
64
65         use Test::More;
66
67         sub create_session : Global {
68             my ( $self, $c ) = @_;
69             ok( !$c->session_is_valid, "no session id yet" );
70             ok( $c->session,           "session created" );
71             ok( $c->session_is_valid,  "with a session id" );
72
73             $c->session->{magic} = "møøse";
74         }
75
76         sub recover_session : Global {
77             my ( $self, $c ) = @_;
78             ok( $c->session_is_valid, "session id exists" );
79             is( $c->sessionid, our $session_id,
80                 "and is the one we saved in the last action" );
81             ok( $c->session, "a session exists" );
82             is( $c->session->{magic},
83                 "møøse",
84                 "and it contains what we put in on the last attempt" );
85             $c->delete_session("user logout");
86         }
87
88         sub after_session : Global {
89             my ( $self, $c ) = @_;
90             ok( !$c->session_is_valid,      "no session id" );
91             ok( !$c->session->{magic},      "session data not restored" );
92             ok( !$c->session_delete_reason, "no reason for deletion" );
93         }
94
95         @{ __PACKAGE__->config->{'Plugin::Session'} }{ keys %$cfg } = values %$cfg;
96
97         { __PACKAGE__->setup; }; # Extra block here is an INSANE HACK to get inlined constructor
98                                  # (i.e. to make B::Hooks::EndOfScope fire)
99     }
100
101     {
102
103         package # Hide from PAUSE
104             SessionStoreTest2;
105         use Catalyst qw/Session SessionStateTest/;
106         push our (@ISA), $m;
107
108         our $VERSION = "123";
109
110         use Test::More;
111
112         sub create_session : Global {
113             my ( $self, $c ) = @_;
114
115             $c->session->{magic} = "møøse";
116         }
117
118         sub recover_session : Global {
119             my ( $self, $c ) = @_;
120
121             ok( !$c->session_is_valid, "session is gone" );
122
123             is(
124                 $c->session_delete_reason,
125                 "session expired",
126                 "reason is that the session expired"
127             );
128
129             ok( !$c->session->{magic}, "no saved data" );
130         }
131
132         __PACKAGE__->config->{'Plugin::Session'}{expires} = 0;
133
134         @{ __PACKAGE__->config->{'Plugin::Session'} }{ keys %$cfg } = values %$cfg;
135
136         { __PACKAGE__->setup; }; # INSANE HACK (the block - as above)
137     }
138
139     use Test::More;
140
141     can_ok( $m, "get_session_data" );
142     can_ok( $m, "store_session_data" );
143     can_ok( $m, "delete_session_data" );
144     can_ok( $m, "delete_expired_sessions" );
145
146     {
147
148         package # Hide from PAUSE
149             t1;
150         use Catalyst::Test "SessionStoreTest";
151
152         # idiotic void context warning workaround
153         
154         my $x = get("/create_session");
155         $x = get("/recover_session");
156         $x = get("/after_session");
157     }
158
159     {
160
161         package # Hide fram PAUSE
162             t2;
163         use Catalyst::Test "SessionStoreTest2";
164
165         my $x = get("/create_session");
166         sleep 1;    # let the session expire
167         $x = get("/recover_session");
168     }
169 }
170
171 __PACKAGE__;
172
173 __END__
174
175 =pod
176
177 =head1 NAME
178
179 Catalyst::Plugin::Session::Test::Store - Reusable sanity for session storage
180 engines.
181
182 =head1 SYNOPSIS
183
184     #!/usr/bin/perl
185
186     use Catalyst::Plugin::Session::Test::Store (
187         backend => "FastMmap",
188         config => {
189             storage => "/tmp/foo",
190         },
191     );
192
193 =head1 DESCRIPTION
194
195 =cut
196
197