Commit | Line | Data |
9e447f9d |
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 | |
45c0711b |
10 | my $m; |
11 | BEGIN { use_ok( $m = "Catalyst::Plugin::Session" ) } |
9e447f9d |
12 | |
13 | my %config; |
45c0711b |
14 | my $log = Test::MockObject->new; |
15 | my $req = Test::MockObject->new; |
9e447f9d |
16 | my @mock_isa = (); |
17 | my %session; |
18 | |
19 | $log->set_true(qw/fatal warn/); |
20 | |
45c0711b |
21 | $req->set_always( address => "127.0.0.1" ); |
9e447f9d |
22 | |
23 | { |
45c0711b |
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 { } |
9e447f9d |
36 | } |
37 | |
38 | { |
45c0711b |
39 | my $c = MockCxt->new; |
40 | $c->setup; |
9e447f9d |
41 | |
45c0711b |
42 | $c->prepare_action; |
43 | ok( !$c->{session}, "without a session ID prepare doesn't load a session" ); |
9e447f9d |
44 | } |
45 | |
46 | { |
45c0711b |
47 | %config = ( session => { expires => 100 } ); |
9e447f9d |
48 | |
45c0711b |
49 | %session = ( |
50 | __expires => time() + 1000, |
51 | __created => time(), |
52 | __updated => time(), |
53 | __address => "127.0.0.1", |
54 | ); |
9e447f9d |
55 | |
45c0711b |
56 | my $c = MockCxt->new; |
57 | $c->setup; |
9e447f9d |
58 | |
45c0711b |
59 | $c->sessionid("the_session"); |
60 | $c->prepare_action; |
9e447f9d |
61 | |
45c0711b |
62 | ok( $c->{session}, 'session "restored" with session id' ); |
9e447f9d |
63 | } |
64 | |
65 | { |
45c0711b |
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" ); |
9e447f9d |
82 | } |
83 | |
84 | { |
45c0711b |
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" ); |
9e447f9d |
101 | } |
102 | |
103 | { |
45c0711b |
104 | %session = ( |
105 | __expires => time() + 1000, |
106 | __created => time(), |
107 | __updated => time(), |
108 | __address => "unlocalhost", |
109 | ); |
9e447f9d |
110 | |
45c0711b |
111 | $config{session}{verify_address} = 0; |
9e447f9d |
112 | |
45c0711b |
113 | my $c = MockCxt->new; |
114 | $c->setup; |
9e447f9d |
115 | |
45c0711b |
116 | $c->sessionid("the_session"); |
117 | $c->prepare_action; |
9e447f9d |
118 | |
45c0711b |
119 | ok( $c->{session}, "address mismatch is OK if verify_address is disabled" ); |
9e447f9d |
120 | } |
121 | |
122 | { |
45c0711b |
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 | ); |
9e447f9d |
151 | } |
152 | |
9e447f9d |
153 | { |
45c0711b |
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; |
9e447f9d |
162 | |
45c0711b |
163 | my $c = MockCxt->new; |
164 | $c->setup; |
9e447f9d |
165 | |
45c0711b |
166 | my $now = time(); |
9e447f9d |
167 | |
45c0711b |
168 | $c->sessionid("the_session"); |
169 | $c->prepare_action; |
170 | $c->finalize; |
9e447f9d |
171 | |
45c0711b |
172 | ok( $c->{session}, |
173 | "session is still alive after 1/2 expired and finalized" ); |
9e447f9d |
174 | |
45c0711b |
175 | cmp_ok( |
176 | $c->session->{__expires}, |
177 | ">=", |
178 | $now + 2000, |
179 | "session expires time extended" |
180 | ); |
9e447f9d |
181 | } |
182 | |