X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FTest.pm;h=d6f80c56ecc737b8ac0a01d84ff8771cd01d1510;hp=f3d4de32c725214d47ee8263235b6c5edd61ea97;hb=26dd6d9f6575fe782e78d6845fff3447e5ba5744;hpb=2eb2c42f2faef472cecd3788573d4872943334b6 diff --git a/lib/Catalyst/Test.pm b/lib/Catalyst/Test.pm index f3d4de3..d6f80c5 100644 --- a/lib/Catalyst/Test.pm +++ b/lib/Catalyst/Test.pm @@ -18,8 +18,9 @@ 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) = crequest('index.html'); # HTTP::Response & context object use HTTP::Request::Common; my $response = request POST '/foo', [ @@ -61,7 +62,7 @@ object. =head2 METHODS -=head2 get +=head2 $content = get( ... ) Returns the content. @@ -78,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) = crequest( ... ); + +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 { @@ -110,11 +118,40 @@ sub import { no strict 'refs'; my $caller = caller(0); - *{"$caller\::request"} = $request; - *{"$caller\::get"} = $get; + + *{"$caller\::request"} = $request; + *{"$caller\::get"} = $get; + *{"$caller\::crequest"} = sub { + my $me = ref $self || $self; + + ### throw an exception if crequest 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. @@ -135,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.