Perltidy + pod tests for all session plugins
[catagits/Catalyst-Plugin-Session.git] / t / 02_session_data.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 19;
7 use Test::MockObject;
8 use Test::Deep;
9
10 my $m;
11 BEGIN { use_ok( $m = "Catalyst::Plugin::Session" ) }
12
13 my %config;
14 my $log      = Test::MockObject->new;
15 my $req      = Test::MockObject->new;
16 my @mock_isa = ();
17 my %session;
18
19 $log->set_true(qw/fatal warn/);
20
21 $req->set_always( address => "127.0.0.1" );
22
23 {
24
25     package MockCxt;
26     use base $m;
27     sub new { bless {}, $_[0] }
28     sub config  { \%config }
29     sub log     { $log }
30     sub request { $req }
31     sub debug   { 0 }
32     sub isa     { 1 }          # subvert the plugin tests, we're faking them
33     sub get_session_data    { \%session }
34     sub store_session_data  { }
35     sub delete_session_data { }
36 }
37
38 {
39     my $c = MockCxt->new;
40     $c->setup;
41
42     $c->prepare_action;
43     ok( !$c->{session}, "without a session ID prepare doesn't load a session" );
44 }
45
46 {
47     %config = ( session => { expires => 100 } );
48
49     %session = (
50         __expires => time() + 1000,
51         __created => time(),
52         __updated => time(),
53         __address => "127.0.0.1",
54     );
55
56     my $c = MockCxt->new;
57     $c->setup;
58
59     $c->sessionid("the_session");
60     $c->prepare_action;
61
62     ok( $c->{session}, 'session "restored" with session id' );
63 }
64
65 {
66     %session = (
67         __expires => time() - 100,    # a while ago
68         __created => time() - 1000,
69         __udpated => time() - 1000,
70         __address => "127.0.0.1",
71     );
72
73     my $c = MockCxt->new;
74     $c->setup;
75
76     $c->sessionid("the_session");
77     $c->prepare_action;
78
79     ok( !$c->{session}, "expired sessions are deleted" );
80     like( $c->session_delete_reason, qr/expire/i, "with appropriate reason" );
81     ok( !$c->sessionid, "sessionid is also cleared" );
82 }
83
84 {
85     %session = (
86         __expires => time() + 1000,
87         __created => time(),
88         __updated => time(),
89         __address => "unlocalhost",
90     );
91
92     my $c = MockCxt->new;
93     $c->setup;
94
95     $c->sessionid("the_session");
96     $c->prepare_action;
97
98     ok( !$c->{session}, "hijacked sessions are deleted" );
99     like( $c->session_delete_reason, qr/mismatch/, "with appropriate reason" );
100     ok( !$c->sessionid, "sessionid is also cleared" );
101 }
102
103 {
104     %session = (
105         __expires => time() + 1000,
106         __created => time(),
107         __updated => time(),
108         __address => "unlocalhost",
109     );
110
111     $config{session}{verify_address} = 0;
112
113     my $c = MockCxt->new;
114     $c->setup;
115
116     $c->sessionid("the_session");
117     $c->prepare_action;
118
119     ok( $c->{session}, "address mismatch is OK if verify_address is disabled" );
120 }
121
122 {
123     %session = ();
124     %config  = ();
125
126     my $now = time;
127
128     my $c = MockCxt->new;
129     $c->setup;
130     $c->prepare_action;
131
132     ok( $c->session,   "creating a session works" );
133     ok( $c->sessionid, "session id generated" );
134
135     cmp_ok( $c->session->{__created}, ">=", $now, "__created time is logical" );
136     cmp_ok( $c->session->{__updated}, ">=", $now, "__updated time is logical" );
137     cmp_ok(
138         $c->session->{__expires},
139         ">=",
140         ( $now + $config{session}{expires} ),
141         "__expires time is logical"
142     );
143     is( $c->session->{__address},
144         $c->request->address, "address is also correct" );
145
146     cmp_deeply(
147         [ keys %{ $c->{session} } ],
148         bag(qw/__expires __created __updated __address/),
149         "initial keys in session are all there",
150     );
151 }
152
153 {
154     %session = (
155         __expires => time() + 1000,
156         __created => time(),
157         __updated => time(),
158         __address => "127.0.0.1",
159     );
160
161     $config{session}{expires} = 2000;
162
163     my $c = MockCxt->new;
164     $c->setup;
165
166     my $now = time();
167
168     $c->sessionid("the_session");
169     $c->prepare_action;
170     $c->finalize;
171
172     ok( $c->{session},
173         "session is still alive after 1/2 expired and finalized" );
174
175     cmp_ok(
176         $c->session->{__expires},
177         ">=",
178         $now + 2000,
179         "session expires time extended"
180     );
181 }
182