X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FTest.pm;h=9791b24a70189b9df2dcbe37af883d560f4b8e1b;hb=d11e0c1d9eccf6f0fe7f1c2bd0313d5cf742b772;hp=44e85faa19f6847b75350db6c6be6b507e8b0fa1;hpb=7dd4f037dd4bcf9b56e4e84050ab2bce19aebd4a;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Test.pm b/lib/Catalyst/Test.pm index 44e85fa..9791b24 100644 --- a/lib/Catalyst/Test.pm +++ b/lib/Catalyst/Test.pm @@ -1,5 +1,7 @@ package Catalyst::Test; +use strict; +use warnings; use Test::More; use Catalyst::Exception; @@ -7,18 +9,6 @@ use Catalyst::Utils; use Class::MOP; use Sub::Exporter; -{ - my $import = Sub::Exporter::build_exporter({ - groups => [ all => \&build_exports ], - into_level => 1, - }); - - sub import { - my ($self, $class) = @_; - $import->($self, '-all' => { class => $class }); - } -} - sub build_exports { my ($self, $meth, $args, $defaults) = @_; @@ -67,6 +57,24 @@ sub build_exports { }; } +use namespace::clean; +our $default_host; + +{ + my $import = Sub::Exporter::build_exporter({ + groups => [ all => \&build_exports ], + into_level => 1, + }); + + + sub import { + my ($self, $class, $opts) = @_; + $import->($self, '-all' => { class => $class }); + $opts ||= {}; + $default_host = $opts->{default_host} if exists $opts->{default_host}; + } +} + =head1 NAME Catalyst::Test - Test Catalyst Applications @@ -109,6 +117,15 @@ Catalyst::Test - Test Catalyst Applications ok( get('/foo') =~ /bar/ ); + # mock virtual hosts + use Catalyst::Test 'MyApp', { default_host => 'myapp.com' }; + like( get('/whichhost'), qr/served by myapp.com/ ); + like( get( '/whichhost', { host => 'yourapp.com' } ), qr/served by yourapp.com/ ); + { + local $Catalyst::Test::default_host = 'otherapp.com'; + like( get('/whichhost'), qr/served by otherapp.com/ ); + } + =head1 DESCRIPTION This module allows you to make requests to a Catalyst application either without @@ -141,9 +158,11 @@ method and the L method below: =head2 request -Returns a C object. +Returns a C object. Accepts an optional hashref for request +header configuration; currently only supports setting 'host' value. my $res = request('foo/bar?test=1'); + my $virtual_res = request('foo/bar?test=1', {host => 'virtualhost.com'}); =head2 local_request @@ -157,6 +176,7 @@ sub local_request { require HTTP::Request::AsCGI; my $request = Catalyst::Utils::request( shift(@_) ); + _customize_request($request, @_); my $cgi = HTTP::Request::AsCGI->new( $request, %ENV )->setup; $class->handle_request; @@ -179,6 +199,8 @@ sub remote_request { my $request = Catalyst::Utils::request( shift(@_) ); my $server = URI->new( $ENV{CATALYST_SERVER} ); + _customize_request($request, @_); + if ( $server->path =~ m|^(.+)?/$| ) { my $path = $1; $server->path("$path") if $path; # need to be quoted @@ -218,6 +240,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; @@ -226,6 +252,14 @@ sub remote_request { return $agent->request($request); } +sub _customize_request { + my $request = shift; + my $opts = pop(@_) || {}; + if ( my $host = exists $opts->{host} ? $opts->{host} : $default_host ) { + $request->header( 'Host' => $host ); + } +} + =head2 action_ok Fetches the given url and check that the request was successful