use Test::More tests => 12; use lib 't/MyApp/lib'; use Catalyst::Test 'MyApp'; use HTTP::Request::Common; use Data::Dump qw( dump ); use Config::General; use Apache::AuthTkt; use HTTP::Request::AsCGI; my $class = 'MyApp'; # based on Catalyst::Test local_request() but # hack in session cookie support. sub my_request { my $uri = shift or die "uri required"; my $cookie = shift || ''; $ENV{COOKIE} = $cookie; my $request = Catalyst::Utils::request($uri); my $cgi = HTTP::Request::AsCGI->new( $request, %ENV )->setup; $class->handle_request; my $response = $cgi->restore->response; $response->{_request} = $request; return $response; } # I'm told sleep() won't work under win32 sub mock_sleep { my $len = shift || 0; #diag("mock sleep for $len secs"); my $end = time() + $len; while ( time() <= $end ) { #diag( "mock sleep: " . localtime() ); } } ok( my $conf = Config::General->new("t/MyApp/myapp.conf"), "get config via file" ); ok( my %config = $conf->getall, "parse config file" ); #dump \%config; my $store = $config{authentication}->{realms}->{authtkt}->{store}; my $secret = $store->{secret}; my $cookie_name = $store->{cookie_name}; my $res; ok( $res = my_request('/'), "get /" ); is( $res->headers->{status}, 302, "req redirects without auth tkt" ); is( $res->headers->{location}, $config{authentication}->{auth_url}, "auth url" ); #diag( dump $res ); # keep initial session alive to test user persistence my $session_cookie = $res->headers->{'set-cookie'}; #mock_sleep(1); ok( my $AAT = Apache::AuthTkt->new( secret => $secret, ), "new AAT" ); ok( my $auth_ticket = $AAT->ticket( uid => 'catalyst-tester', ip_addr => '127.0.0.1', tokens => 'group1,group2', data => 'foo bar baz' ), "new auth_tkt" ); ok( $res = my_request( "/?$cookie_name=$auth_ticket", $session_cookie ), "get / with auth_tkt" ); is( $res->content, 'Logged in as user catalyst-tester with roles ("group1", "group2")', "logged in" ); #mock_sleep(1); # request again with no cookie or tkt set # to test session persistence ok( $res = my_request( '/', $session_cookie ), "get / with no auth_tkt" ); is( $res->headers->{status}, 302, "req redirects without auth tkt" ); is( $res->headers->{location}, $config{authentication}->{auth_url}, "auth url" ); #dump $res;