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 | |
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 } |
9a9252c2 |
32 | sub store_session_data { } |
9e447f9d |
33 | sub delete_session_data { } |
34 | } |
35 | |
36 | { |
37 | my $c = MockCxt->new; |
38 | $c->setup; |
39 | |
9a9252c2 |
40 | $c->prepare_action; |
9e447f9d |
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"); |
9a9252c2 |
58 | $c->prepare_action; |
9e447f9d |
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"); |
9a9252c2 |
75 | $c->prepare_action; |
9e447f9d |
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"); |
9a9252c2 |
94 | $c->prepare_action; |
9e447f9d |
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"); |
9a9252c2 |
115 | $c->prepare_action; |
9e447f9d |
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; |
9a9252c2 |
128 | $c->prepare_action; |
9e447f9d |
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"); |
9a9252c2 |
135 | cmp_ok($c->session->{__expires}, ">=", ($now + $config{session}{expires}), "__expires time is logical"); |
9e447f9d |
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 | |
9a9252c2 |
155 | $config{session}{expires} = 2000; |
9e447f9d |
156 | |
157 | my $c = MockCxt->new; |
158 | $c->setup; |
159 | |
160 | my $now = time(); |
161 | |
162 | $c->sessionid("the_session"); |
9a9252c2 |
163 | $c->prepare_action; |
9e447f9d |
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 | |