X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FTest.pm;h=36d23edbbb0d7cbf40e56d81a741bb9a4f1d8be9;hb=8f076801b5c41543fdc20859452ed2cea1e1f82f;hp=d0977a3769406cbc91bf62b150cde3faa798ea71;hpb=7f891e1e543fbe6c383fe51a6917126c159534f5;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Test.pm b/lib/Catalyst/Test.pm index d0977a3..36d23ed 100644 --- a/lib/Catalyst/Test.pm +++ b/lib/Catalyst/Test.pm @@ -4,10 +4,12 @@ use strict; use warnings; use Test::More (); +use Plack::Test; use Catalyst::Exception; use Catalyst::Utils; use Class::MOP; use Sub::Exporter; +use Carp; my $build_exports = sub { my ($self, $meth, $args, $defaults) = @_; @@ -17,8 +19,8 @@ my $build_exports = sub { if ( $ENV{CATALYST_SERVER} ) { $request = sub { remote_request(@_) }; - } elsif (! $class) { - $request = sub { Catalyst::Exception->throw("Must specify a test app: use Catalyst::Test 'TestApp'") }; + } elsif (!$class) { + $request = sub { croak "Must specify a test app: use Catalyst::Test 'TestApp'"; } } else { unless (Class::MOP::is_class_loaded($class)) { Class::MOP::load_class($class); @@ -239,32 +241,43 @@ Simulate a request using L. sub local_request { my $class = shift; - require HTTP::Request::AsCGI; + my $app = ref($class) eq "CODE" ? $class : $class->_finalized_psgi_app; - my $request = Catalyst::Utils::request( shift(@_) ); - _customize_request($request, @_); - my $cgi = HTTP::Request::AsCGI->new( $request, %ENV )->setup; + my $request = Catalyst::Utils::request(shift); + my %extra_env; + _customize_request($request, \%extra_env, @_); - $class->handle_request( env => \%ENV ); + my $ret; + test_psgi + app => sub { $app->({ %{ $_[0] }, %extra_env }) }, + client => sub { + my $psgi_app = shift; - my $response = $cgi->restore->response; - $response->request( $request ); + my $resp = $psgi_app->($request); - # HTML head parsing based on LWP::UserAgent + # HTML head parsing based on LWP::UserAgent + # + # This is not just horrible and possibly broken, but also really + # doesn't belong here. Whoever wants this should be working on + # getting it into Plack::Test, or make a middleware out of it, or + # whatever. Seriously - horrible. - require HTML::HeadParser; + require HTML::HeadParser; - my $parser = HTML::HeadParser->new(); - $parser->xml_mode(1) if $response->content_is_xhtml; - $parser->utf8_mode(1) if $] >= 5.008 && $HTML::Parser::VERSION >= 3.40; + my $parser = HTML::HeadParser->new(); + $parser->xml_mode(1) if $resp->content_is_xhtml; + $parser->utf8_mode(1) if $] >= 5.008 && $HTML::Parser::VERSION >= 3.40; - $parser->parse( $response->content ); - my $h = $parser->header; - for my $f ( $h->header_field_names ) { - $response->init_header( $f, [ $h->header($f) ] ); - } + $parser->parse( $resp->content ); + my $h = $parser->header; + for my $f ( $h->header_field_names ) { + $resp->init_header( $f, [ $h->header($f) ] ); + } - return $response; + $ret = $resp; + }; + + return $ret; } my $agent; @@ -337,11 +350,16 @@ sub remote_request { sub _customize_request { my $request = shift; + my $extra_env = shift; my $opts = pop(@_) || {}; $opts = {} unless ref($opts) eq 'HASH'; if ( my $host = exists $opts->{host} ? $opts->{host} : $default_host ) { $request->header( 'Host' => $host ); } + + if (my $extra = $opts->{extra_env}) { + @{ $extra_env }{keys %{ $extra }} = values %{ $extra }; + } } =head2 action_ok