File: session_engines.t

package info (click to toggle)
libdancer2-perl 0.152000%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 1,820 kB
  • ctags: 536
  • sloc: perl: 8,034; sh: 51; makefile: 2
file content (109 lines) | stat: -rw-r--r-- 3,065 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
use strict;
use warnings;
use Test::More;

use YAML;
use Test::TCP 1.13;
use File::Temp 0.22;
use LWP::UserAgent;
use File::Spec;

my $tempdir = File::Temp::tempdir( CLEANUP => 1, TMPDIR => 1 );

my @clients = qw(one two three);
my @engines = qw(YAML Simple);
my $SESSION_DIR;

if ( $ENV{DANCER_TEST_COOKIE} ) {
    push @engines, "cookie";
    setting( session_cookie_key => "secret/foo*@!" );
}

foreach my $engine (@engines) {


    note "Testing engine $engine";
    Test::TCP::test_tcp(
        client => sub {
            my $port = shift;

            foreach my $client (@clients) {
                my $ua = LWP::UserAgent->new;
                $ua->cookie_jar( { file => "$tempdir/.cookies.txt" } );

                my $res = $ua->get("http://127.0.0.1:$port/read_session");
                like $res->content, qr/name=''/,
                  "empty session for client $client";

                $res = $ua->get("http://127.0.0.1:$port/set_session/$client");
                ok( $res->is_success, "set_session for client $client" );

                $res = $ua->get("http://127.0.0.1:$port/read_session");
                like $res->content, qr/name='$client'/,
                  "session looks good for client $client";

                $res = $ua->get("http://127.0.0.1:$port/clear_session");
                like $res->content, qr/cleared/, "deleted session key";

                $res = $ua->get("http://127.0.0.1:$port/cleanup");
                ok( $res->is_success, "cleanup done for $client" );

                ok( $res->content, "session hook triggered" );

            }

            File::Temp::cleanup();
        },
        server => sub {
            my $port = shift;

            use Dancer2;

            my @to_destroy;

            hook 'engine.session.before_destroy' => sub {
                my $session = shift;
                push @to_destroy, $session;
            };

            get '/set_session/*' => sub {
                my ($name) = splat;
                session name => $name;
            };

            get '/read_session' => sub {
                my $name = session('name') || '';
                "name='$name'";
            };

            get '/clear_session' => sub {
                session name => undef;
                return exists( session->data->{name} ) ? "failed" : "cleared";
            };

            get '/cleanup' => sub {
                app->destroy_session;
                return scalar(@to_destroy);
            };

            setting appdir => $tempdir;
            setting(
                engines => {
                    session => { $engine => { session_dir => 't/sessions' } }
                }
            );
            setting( session => $engine );

            set(show_errors  => 1,
                startup_info => 0,
                environment  => 'production',
                port         => $port
            );

            # we're overiding a RO attribute only for this test!
            Dancer2->runner->{'port'} = $port;
            start;
        },
    );
}
done_testing;