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