X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FTest.pm;h=db79ba678c2411c644958660769ec1f53c8a0d40;hb=f2e13bbd72d59b71fe8916aa802d2631217bd51d;hp=82a43c13c5949f384bd717a5f3c8889a7add0711;hpb=890e8d185c593f64f2c11a5d01fd110382cbd2a9;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Test.pm b/lib/Catalyst/Test.pm index 82a43c1..db79ba6 100644 --- a/lib/Catalyst/Test.pm +++ b/lib/Catalyst/Test.pm @@ -18,8 +18,15 @@ Catalyst::Test - Test Catalyst Applications # Tests use Catalyst::Test 'TestApp'; - request('index.html'); - get('index.html'); + my $content = get('index.html'); # Content as string + my $response = request('index.html'); # HTTP::Response object + my($res, $c) = ctx_request('index.html'); # HTTP::Response & context object + + use HTTP::Request::Common; + my $response = request POST '/foo', [ + bar => 'baz', + something => 'else' + ]; # Run tests against a remote server CATALYST_SERVER='http://localhost:3000/' prove -r -l lib/ t/ @@ -45,11 +52,17 @@ Catalyst::Test - Test Catalyst Applications =head1 DESCRIPTION -Test Catalyst Applications. +This module allows you to make requests to a Catalyst application either without +a server, by simulating the environment of an HTTP request using +L or remotely if you define the CATALYST_SERVER +environment variable. + +The and functions take either a URI or an L +object. =head2 METHODS -=head2 get +=head2 $content = get( ... ) Returns the content. @@ -66,12 +79,19 @@ method and the L method below: is ( $uri->path , '/y'); my $content = get($uri->path); -=head2 request +=head2 $res = request( ... ); Returns a C object. my $res = request('foo/bar?test=1'); +=head1 FUNCTIONS + +=head2 ($res, $c) = ctx_request( ... ); + +Works exactly like C, except it also returns the +catalyst context object, C<$c>. Note that this only works for local requests. + =cut sub import { @@ -98,11 +118,42 @@ sub import { no strict 'refs'; my $caller = caller(0); - *{"$caller\::request"} = $request; - *{"$caller\::get"} = $get; + + *{"$caller\::request"} = $request; + *{"$caller\::get"} = $get; + *{"$caller\::ctx_request"} = sub { + my $me = ref $self || $self; + + ### throw an exception if ctx_request is being used against a remote + ### server + Catalyst::Exception->throw("$me only works with local requests, not remote") + if $ENV{CATALYST_SERVER}; + + ### place holder for $c after the request finishes; reset every time + ### requests are done. + my $c; + + ### hook into 'dispatch' -- the function gets called after all plugins + ### have done their work, and it's an easy place to capture $c. + no warnings 'redefine'; + my $dispatch = Catalyst->can('dispatch'); + local *Catalyst::dispatch = sub { + $c = shift; + $dispatch->( $c, @_ ); + }; + + ### do the request; C::T::request will know about the class name, and + ### we've already stopped it from doing remote requests above. + my $res = $request->( @_ ); + + ### return both values + return ( $res, $c ); + }; } -=head2 local_request +=head2 $res = Catalyst::Test::local_request( $AppClass, $url ); + +Simulate a request using L. =cut @@ -121,7 +172,7 @@ sub local_request { my $agent; -=head2 remote_request +=head2 $res = Catalyst::Test::remote_request( $url ); Do an actual remote request using LWP. @@ -173,6 +224,10 @@ sub remote_request { keep_alive => 1, max_redirect => 0, timeout => 60, + + # work around newer LWP max_redirect 0 bug + # http://rt.cpan.org/Ticket/Display.html?id=40260 + requests_redirectable => [], ); $agent->env_proxy; @@ -183,11 +238,12 @@ sub remote_request { =head1 SEE ALSO -L. +L, L, +L, L, L -=head1 AUTHOR +=head1 AUTHORS -Sebastian Riedel, C +Catalyst Contributors, see Catalyst.pm =head1 COPYRIGHT