X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FTest%2FWWW%2FMechanize%2FCatalyst.pm;h=8910c44c83cf2c4ff60997b58af6c01b93937524;hb=affa35d5063fbeb1ca9ccc5bff2372b583c8575f;hp=4248f49c460802a3f34ca315ded30b55c03c6d72;hpb=cfd812d6df038fa098c69af4e8a80e0342e7b1ce;p=catagits%2FTest-WWW-Mechanize-Catalyst.git diff --git a/lib/Test/WWW/Mechanize/Catalyst.pm b/lib/Test/WWW/Mechanize/Catalyst.pm index 4248f49..8910c44 100644 --- a/lib/Test/WWW/Mechanize/Catalyst.pm +++ b/lib/Test/WWW/Mechanize/Catalyst.pm @@ -10,9 +10,9 @@ use Test::WWW::Mechanize; extends 'Test::WWW::Mechanize', 'Moose::Object'; -use namespace::clean -execept => 'meta'; +#use namespace::clean -execept => 'meta'; -our $VERSION = '0.50_2'; +our $VERSION = '0.50'; our $APP_CLASS; my $Test = Test::Builder->new(); @@ -37,21 +37,38 @@ has host => ( sub new { my $class = shift; - my $obj = $class->SUPER::new(@_); + my $args = ref $_[0] ? $_[0] : { @_ }; + + # Dont let LWP complain about options for our attributes + my %attr_options = map { + my $n = $_->init_arg; + defined $n && exists $args->{$n} + ? ( $n => delete $args->{$n} ) + : ( ); + } $class->meta->get_all_attributes; + + my $obj = $class->SUPER::new(%$args); my $self = $class->meta->new_object( __INSTANCE__ => $obj, ($APP_CLASS ? (catalyst_app => $APP_CLASS) : () ), - @_ + %attr_options ); + $self->BUILDALL; + + + return $self; +} + +sub BUILD { + my ($self) = @_; + unless ($ENV{CATALYST_SERVER}) { croak "catalyst_app attribute is required unless CATALYST_SERVER env variable is set" unless $self->has_catalyst_app; Class::MOP::load_class($self->catalyst_app) unless (Class::MOP::is_class_loaded($self->catalyst_app)); } - - return $self; } sub _make_request { @@ -82,6 +99,7 @@ sub _make_request { # check if that was a redirect if ( $response->header('Location') + && $response->is_redirect && $self->redirect_ok( $request, $response ) ) { @@ -114,19 +132,17 @@ sub _make_request { sub _do_catalyst_request { my ($self, $request) = @_; + my $uri = $request->uri; + $uri->scheme('http') unless defined $uri->scheme; + $uri->host('localhost') unless defined $uri->host; + + $request = $self->prepare_request($request); $self->cookie_jar->add_cookie_header($request) if $self->cookie_jar; # Woe betide anyone who unsets CATALYST_SERVER return Catalyst::Test::remote_request($request) if $ENV{CATALYST_SERVER}; - my $uri = $request->uri; - if ($uri->as_string =~ m{^/}) { - $uri->scheme('http'); - $uri->host('localhost'); - } - - # If there's no Host header, set one. unless ($request->header('Host')) { my $host = $self->has_host @@ -191,16 +207,16 @@ Test::WWW::Mechanize::Catalyst - Test::WWW::Mechanize for Catalyst =head1 DESCRIPTION -L is an elegant MVC Web Application -Framework. L is a subclass of L that -incorporates features for web application testing. The -L module meshes the two to allow easy -testing of L applications without starting up a web server. +L is an elegant MVC Web Application Framework. +L is a subclass of L that incorporates +features for web application testing. The L +module meshes the two to allow easy testing of L applications without +needing to starting up a web server. Testing web applications has always been a bit tricky, normally -starting a web server for your application and making real HTTP +requiring starting a web server for your application and making real HTTP requests to it. This module allows you to test L web -applications but does not start a server or issue HTTP +applications but does not require a server or issue HTTP requests. Instead, it passes the HTTP request object directly to L. Thus you do not need to use a real hostname: "http://localhost/" will do. However, this is optional. The following @@ -213,16 +229,23 @@ Links which do not begin with / or are not for localhost can be handled as normal Web requests - this is handy if you have an external single sign-on system. You must set allow_external to true for this: - $m->allow_external(1); + $mech->allow_external(1); You can also test a remote server by setting the environment variable -CATALYST_SERVER, for example: +CATALYST_SERVER; for example: $ CATALYST_SERVER=http://example.com/myapp prove -l t will run the same tests on the application running at http://example.com/myapp regardless of whether or not you specify http:://localhost for Test::WWW::Mechanize::Catalyst. + +Furthermore, if you set CATALYST_SERVER, the server will be regarded +as a remote server even if your links point to localhost. Thus, you +can use Test::WWW::Mechanize::Catalyst to test your live webserver +running on your local machine, if you need to test aspects of your +deployment environment (for example, configuration options in an +http.conf file) instead of just the Catalyst request handling. This makes testing fast and easy. L provides functions for common web testing scenarios. For example: @@ -242,7 +265,7 @@ screen. By default this module will treat responses which are the debug screen as failures. If you actually want to test debug screens, please use: - $m->{catalyst_debug} = 1; + $mmech->{catalyst_debug} = 1; An alternative to this module is L. @@ -250,7 +273,7 @@ An alternative to this module is L. =head2 new -Behaves like, and calls, L's C method. Any parms +Behaves like, and calls, L's C method. Any params passed in get passed to WWW::Mechanize's constructor. Note that we need to pass the name of the Catalyst application to the "use": @@ -305,7 +328,7 @@ Tells if the title of the page matches the given regex. =head2 $mech->title_unlike( $regex [, $desc ] ) -Tells if the title of the page matches the given regex. +Tells if the title of the page does NOT match the given regex. $mech->title_unlike( qr/Invoices for (.+)/ @@ -415,8 +438,8 @@ Makes a C call and executes tests on the results. The link must be found, and then followed successfully. Otherwise, this test fails. -I<%parms> is a hashref containing the parms to pass to C. -Note that the parms to C are a hash whereas the parms to +I<%parms> is a hashref containing the params to pass to C. +Note that the params to C are a hash whereas the parms to this function are a hashref. You have to call this function like: $agent->follow_like_ok( {n=>3}, "looking for 3rd link" ); @@ -428,6 +451,21 @@ Returns true value if the specified link was found and followed successfully. The HTTP::Response object returned by follow_link() is not available. +=head1 CAVEATS + +=head2 External Redirects and allow_external + +If you use non-fully qualified urls in your test scripts (i.e. anything without +a host, such as C<< ->get_ok( "/foo") >> ) and your app redirects to an +external URL, expect to be bitten once you come back to your application's urls +(it will try to request them on the remote server.) This is due to a limitation +in WWW::Mechanize. + +One workaround for this is that if you are expecting to redirect to an external +site, clone the TWMC obeject and use the cloned object for the external +redirect. + + =head1 SEE ALSO Related modules which may be of interest: L,