rewrite live app test to avoid Test::WWW::Mechanize::Catalyst
[catagits/Catalyst-Plugin-Session-State-Cookie.git] / t / live_app.t
index 633a36f..706c1e6 100644 (file)
@@ -1,87 +1,97 @@
-#!/usr/bin/perl
-
 use strict;
 use warnings;
 
-use Test::More;
-
-BEGIN {
-    eval { require Test::WWW::Mechanize::Catalyst };
-    plan skip_all =>
-      "This test requires Test::WWW::Mechanize::Catalyst in order to run"
-      if $@;
-    plan skip_all => 'Test::WWW::Mechanize::Catalyst >= 0.40 required' if $Test::WWW::Mechanize::Catalyst::VERSION < 0.40;
-    plan 'no_plan';
-}
-
-{
-
-    package CookieTestApp;
-    use Catalyst qw/
-      Session
-      Session::Store::Dummy
-      Session::State::Cookie
-      /;
-
-    sub page : Local {
-        my ( $self, $c ) = @_;
-        $c->res->body( "Hi! hit number " . ++$c->session->{counter} );
-    }
+use FindBin qw/$Bin/;
+use lib "$Bin/lib";
 
-    sub stream : Local {
-        my ( $self, $c ) = @_;
-        my $count = ++$c->session->{counter};
-        $c->res->write("hit number ");
-        $c->res->write($count);
-    }
-
-    sub deleteme : Local {
-        my ( $self, $c ) = @_;
-        my $id = $c->get_session_id;
-        $c->delete_session;
-        my $id2 = $c->get_session_id;
-        $c->res->body( $id ne ( $id2 || '' ) );
-    }
-
-    __PACKAGE__->setup;
-}
-
-use Test::WWW::Mechanize::Catalyst qw/CookieTestApp/;
+use Test::More;
 
-my $m = Test::WWW::Mechanize::Catalyst->new;
+use HTTP::Cookies;
+use Catalyst::Utils ();
+
+use Catalyst::Test qw(CookieTestApp);
+
+my $jar = HTTP::Cookies->new;
+my %cookie;
+my $get = sub {
+    my $url = shift;
+    my $req = Catalyst::Utils::request($url);
+    $jar->add_cookie_header($req);
+    my $res = request($req);
+    $jar->extract_cookies($res);
+
+    $jar->scan( sub {
+        if ($_[1] eq 'cookietestapp_session') {
+            @cookie{qw(
+                version
+                key
+                val
+                path
+                domain
+                port
+                path_spec
+                secure
+                expires
+                discard
+                hash
+            )} = @_;
+        }
+    } );
+
+    return $res;
+};
+
+my $res;
+
+$res = $get->('/stream');
+ok $res->is_success, 'get page';
+like $res->content, qr/hit number 1/, 'session data created';
+
+my $expired = $cookie{expires};
+
+$res = $get->('/page');
+ok $res->is_success, 'get page';
+like $res->content, qr/hit number 2/, 'session data restored';
+
+$res = $get->('/page');
+ok $res->is_success, 'get page';
+like $res->content, qr/hit number 3/, 'session data restored';
 
-$m->get_ok( "http://localhost/stream", "get page" );
-$m->content_contains( "hit number 1", "session data created" );
+sleep 1;
 
-my $expired;
-$m->cookie_jar->scan( sub { $expired = $_[8]; } );
+$res = $get->('/page');
+ok $res->is_success, 'get page';
+like $res->content, qr/hit number 4/, 'session data restored';
 
-$m->get_ok( "http://localhost/page", "get page" );
-$m->content_contains( "hit number 2", "session data restored" );
+cmp_ok $expired, '<', $cookie{expires}, 'cookie expiration was extended';
+$expired = $cookie{expires};
 
-$m->get_ok( "http://localhost/stream", "get stream" );
-$m->content_contains( "hit number 3", "session data restored" );
+$res = $get->('/page');
+ok $res->is_success, 'get page';
+like $res->content, qr/hit number 5/, 'session data restored';
 
 sleep 1;
 
-$m->get_ok( "http://localhost/stream", "get page" );
-$m->content_contains( "hit number 4", "session data restored" );
+$res = $get->('/stream');
+ok $res->is_success, 'get stream';
+like $res->content, qr/hit number 6/, 'session data restored';
 
-my $updated_expired;
-$m->cookie_jar->scan( sub { $updated_expired = $_[8]; } );
-cmp_ok( $expired, "<", $updated_expired, "cookie expiration was extended" );
+cmp_ok $expired, '<', $cookie{expires}, 'streaming also extends cookie';
 
-$expired = $m->cookie_jar->scan( sub { $expired = $_[8] } );
-$m->get_ok( "http://localhost/page", "get page again");
-$m->content_contains( "hit number 5", "session data restored (blah)" );
+$res = $get->('/deleteme');
+ok $res->is_success, 'get page';
+is $res->content, '1', 'session id changed';
 
-sleep 1;
+$res = $get->('https://localhost/page');
+ok $res->is_success, 'get page over HTTPS - init session';
+like $res->content, qr/hit number 1/, 'first hit';
 
-$m->get_ok( "http://localhost/stream", "get stream" );
-$m->content_contains( "hit number 6", "session data restored" );
+$res = $get->('http://localhost/page');
+ok $res->is_success, 'get page again over HTTP';
+like $res->content, qr/hit number 1/, 'first hit again - cookie not sent';
 
-$m->cookie_jar->scan( sub { $updated_expired = $_[8]; } );
-cmp_ok( $expired, "<", $updated_expired, "streaming also extends cookie" );
+$res = $get->('https://localhost/page');
+ok $res->is_success, 'get page over HTTPS';
+like $res->content, qr/hit number 2/, 'second hit';
 
-$m->get_ok( "http://localhost/deleteme", "get page" );
-$m->content_is( 1, 'session id changed' );
+done_testing;