Fixed C::P::Session::State::Cookie expires behavior
[catagits/Catalyst-Plugin-Session-State-Cookie.git] / t / basic.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 15;
7 use Test::MockObject;
8 use Test::MockObject::Extends;
9
10 my $m;
11 BEGIN { use_ok( $m = "Catalyst::Plugin::Session::State::Cookie" ) }
12
13 my $cookie = Test::MockObject->new;
14 $cookie->set_always( value => "the session id" );
15
16 my $req = Test::MockObject->new;
17 my %req_cookies;
18 $req->set_always( cookies => \%req_cookies );
19
20 my $res = Test::MockObject->new;
21 my %res_cookies;
22 $res->set_always( cookies => \%res_cookies );
23
24 my $cxt =
25   Test::MockObject::Extends->new("Catalyst::Plugin::Session::State::Cookie");
26
27 $cxt->set_always( config   => {} );
28 $cxt->set_always( request  => $req );
29 $cxt->set_always( response => $res );
30 $cxt->set_always( session  => { } );
31 $cxt->set_always( session_expires => 123 );
32 $cxt->set_false("debug");
33 my $sessionid;
34 $cxt->mock( sessionid => sub { shift; $sessionid = shift if @_; $sessionid } );
35
36 can_ok( $m, "setup_session" );
37
38 $cxt->setup_session;
39
40 like( $cxt->config->{session}{cookie_name},
41     qr/_session$/, "default cookie name is set" );
42
43 $cxt->config->{session}{cookie_name} = "session";
44
45 can_ok( $m, "prepare_cookies" );
46
47 $cxt->prepare_cookies;
48 ok( !$cxt->called("sessionid"),
49     "didn't try setting session ID when there was nothing to set it by" );
50
51 $cxt->clear;
52
53 %req_cookies = ( session => $cookie );
54
55 ok( !$cxt->sessionid, "no session ID yet" );
56 $cxt->prepare_cookies;
57 is( $cxt->sessionid, "the session id", "session ID was restored from cookie" );
58
59 $cxt->clear;
60 $res->clear;
61
62 can_ok( $m, "finalize_cookies" );
63 $cxt->finalize_cookies;
64 {
65     local $TODO =
66       "This check is a pain to write, should be done by catalyst itself";
67     ok( !$res->called("cookies"),
68         "response cookie was not set since res cookie is already there" );
69 }
70
71 $cxt->clear;
72 $sessionid = undef;
73 $res->clear;
74
75 $cxt->finalize_cookies;
76 ok( !$res->called("cookies"),
77 "response cookie was not set when sessionid was deleted, even if req cookie is still there"
78 );
79
80 $sessionid = "some other ID";
81 $cxt->clear;
82 $res->clear;
83
84 $cxt->finalize_cookies;
85 $res->called_ok( "cookies", "response cookie was set when sessionid changed" );
86 is_deeply(
87     \%res_cookies,
88     { session => { value => $sessionid, expires => 123 } },
89     "cookie was set correctly"
90 );
91
92 $cxt->clear;
93 $res->clear;
94 %req_cookies = ();
95 %res_cookies = ();
96 $sessionid   = undef;
97
98 $cxt->finalize_cookies;
99 ok( !$res->called("cookies"),
100     "response cookie was not set when there is no sessionid or request cookie"
101 );
102
103 $cxt->clear;
104 $sessionid   = "123";
105 %res_cookies = ();
106 $res->clear;
107
108 $cxt->finalize_cookies;
109
110 $res->called_ok( "cookies",
111     "response cookie was set when session was created" );
112 is_deeply(
113     \%res_cookies,
114     { session => { value => $sessionid, expires => 123 } },
115     "cookie was set correctly"
116 );
117