Use Plack::Test::ExternalServer in Catalyst::Test remote requests
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Test.pm
index 9a77112..a2c27f7 100644 (file)
@@ -110,15 +110,21 @@ my $build_exports = sub {
         },
         action_ok => sub {
             my $action = shift;
-            return Test::More->builder->ok($request->($action)->is_success, @_);
+            my $meth = $request->($action)->request->method;
+            my @args = @_ ? @_ : ("$meth $action returns successfully");
+            return Test::More->builder->ok($request->($action)->is_success,@args);
         },
         action_redirect => sub {
             my $action = shift;
-            return Test::More->builder->ok($request->($action)->is_redirect,@_);
+            my $meth = $request->($action)->request->method;
+            my @args = @_ ? @_ : ("$meth $action returns a redirect");
+            return Test::More->builder->ok($request->($action)->is_redirect,@args);
         },
         action_notfound => sub {
             my $action = shift;
-            return Test::More->builder->is_eq($request->($action)->code,404,@_);
+            my $meth = $request->($action)->request->method;
+            my @args = @_ ? @_ : ("$meth $action returns a 404");
+            return Test::More->builder->is_eq($request->($action)->code,404,@args);
         },
         contenttype_is => sub {
             my $action = shift;
@@ -302,6 +308,7 @@ my $agent;
 
 sub _remote_request {
     require LWP::UserAgent;
+    local $Plack::Test::Impl = 'ExternalServer';
 
     my $request = Catalyst::Utils::request( shift(@_) );
     my $server  = URI->new( $ENV{CATALYST_SERVER} );
@@ -319,7 +326,7 @@ sub _remote_request {
     if ($server->path) {
         # If request path is '/', we have to add a trailing slash to the
         # final request URI
-        my $add_trailing = $request->uri->path eq '/';
+        my $add_trailing = ($request->uri->path eq '/' || $request->uri->path eq '') ? 1 : 0;
 
         my @sp = split '/', $server->path;
         my @rp = split '/', $request->uri->path;
@@ -336,13 +343,7 @@ sub _remote_request {
         }
     }
 
-    $request->uri->scheme( $server->scheme );
-    $request->uri->host( $server->host );
-    $request->uri->port( $server->port );
-    $request->uri->path( $server->path . $request->uri->path );
-
     unless ($agent) {
-
         $agent = LWP::UserAgent->new(
             keep_alive   => 1,
             max_redirect => 0,
@@ -356,7 +357,16 @@ sub _remote_request {
         $agent->env_proxy;
     }
 
-    return $agent->request($request);
+    my $ret;
+    test_psgi
+        ua     => $agent,
+        uri    => $server,
+        client => sub {
+            my ($psgi_app) = @_;
+            $ret = $psgi_app->($request);
+        };
+
+    return $ret;
 }
 
 for my $name (qw(local_request remote_request)) {
@@ -388,25 +398,29 @@ sub _customize_request {
     }
 }
 
-=head2 action_ok
+=head2 action_ok($url [, $test_name ])
 
-Fetches the given URL and checks that the request was successful.
+Fetches the given URL and checks that the request was successful. An optional
+second argument can be given to specify the name of the test.
 
-=head2 action_redirect
+=head2 action_redirect($url [, $test_name ])
 
-Fetches the given URL and checks that the request was a redirect.
+Fetches the given URL and checks that the request was a redirect. An optional
+second argument can be given to specify the name of the test.
 
-=head2 action_notfound
+=head2 action_notfound($url [, $test_name ])
 
-Fetches the given URL and checks that the request was not found.
+Fetches the given URL and checks that the request was not found. An optional
+second argument can be given to specify the name of the test.
 
-=head2 content_like( $url, $regexp [, $test_name] )
+=head2 content_like( $url, $regexp [, $test_name ] )
 
-Fetches the given URL and returns whether the content matches the regexp.
+Fetches the given URL and returns whether the content matches the regexp. An
+optional third argument can be given to specify the name of the test.
 
-=head2 contenttype_is
+=head2 contenttype_is($url, $type [, $test_name ])
 
-Check for given MIME type.
+Verify the given URL has a content type of $type and optionally specify a test name.
 
 =head1 SEE ALSO