use Catalyst::Utils;
use Class::MOP;
use Sub::Exporter;
-use Carp;
+use Carp 'croak', 'carp';
-my $build_exports = sub {
- my ($self, $meth, $args, $defaults) = @_;
+sub _build_request_export {
+ my ($self, $args) = @_;
+
+ return sub { _remote_request(@_) }
+ if $args->{remote};
- my $request;
my $class = $args->{class};
- if ( $ENV{CATALYST_SERVER} ) {
- $request = sub { remote_request(@_) };
- } elsif (!$class) {
- $request = sub { croak "Must specify a test app: use Catalyst::Test 'TestApp'"; }
- } else {
- unless (Class::MOP::is_class_loaded($class)) {
- Class::MOP::load_class($class);
- }
- $class->import;
+ # Here we should be failing right away, but for some stupid backcompat thing
+ # I don't quite remember we fail lazily here. Needs a proper deprecation and
+ # then removal.
+ return sub { croak "Must specify a test app: use Catalyst::Test 'TestApp'" }
+ unless $class;
- $request = sub { local_request( $class, @_ ) };
- }
+ Class::MOP::load_class($class) unless Class::MOP::is_class_loaded($class);
+ $class->import;
+
+ return sub { _local_request( $class, @_ ) };
+}
- my $get = sub { $request->(@_)->content };
+sub _build_get_export {
+ my ($self, $args) = @_;
+ my $request = $args->{request};
+
+ return sub { $request->(@_)->content };
+}
+sub _build_ctx_request_export {
+ my ($self, $args) = @_;
+ my ($class, $request) = @{ $args }{qw(class request)};
- my $ctx_request = sub {
+ return sub {
my $me = ref $self || $self;
- ### throw an exception if ctx_request is being used against a remote
- ### server
+ # fail 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};
- ### check explicitly for the class here, or the Cat->meta call will blow
- ### up in our face
+ # check explicitly for the class here, or the Cat->meta call will blow
+ # up in our face
Catalyst::Exception->throw("Must specify a test app: use Catalyst::Test 'TestApp'") unless $class;
- ### place holder for $c after the request finishes; reset every time
- ### requests are done.
+ # place holder for $c after the request finishes; reset every time
+ # requests are done.
my $ctx_closed_over;
- ### hook into 'dispatch' -- the function gets called after all plugins
- ### have done their work, and it's an easy place to capture $c.
-
+ # hook into 'dispatch' -- the function gets called after all plugins
+ # have done their work, and it's an easy place to capture $c.
my $meta = Class::MOP::get_metaclass_by_name($class);
$meta->make_mutable;
$meta->add_after_method_modifier( "dispatch", sub {
});
$meta->make_immutable( replace_constructor => 1 );
Class::C3::reinitialize(); # Fixes RT#46459, I've failed to write a test for how/why, but it does.
- ### 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->( @_ );
+
+ # 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 = $args->{request}->( @_ );
# Make sure not to leave a reference $ctx hanging around.
# This means that the context will go out of scope as soon as the
my $ctx = $ctx_closed_over;
undef $ctx_closed_over;
- ### return both values
return ( $res, $ctx );
};
+}
+
+my $build_exports = sub {
+ my ($self, $meth, $args, $defaults) = @_;
+ my $class = $args->{class};
+
+ my $request = $self->_build_request_export({
+ class => $class,
+ remote => $ENV{CATALYST_SERVER},
+ });
+
+ my $get = $self->_build_get_export({ request => $request });
+
+ my $ctx_request = $self->_build_ctx_request_export({
+ class => $class,
+ request => $request,
+ });
return {
request => $request,
my $res = request('foo/bar?test=1');
my $virtual_res = request('foo/bar?test=1', {host => 'virtualhost.com'});
-=head1 FUNCTIONS
-
=head2 ($res, $c) = ctx_request( ... );
Works exactly like L<request|/"$res = request( ... );">, except it also returns the Catalyst context object,
C<$c>. Note that this only works for local requests.
-=head2 $res = Catalyst::Test::local_request( $AppClass, $url );
-
-Simulate a request using L<HTTP::Request::AsCGI>.
-
=cut
-sub local_request {
+sub _local_request {
my $class = shift;
my $app = ref($class) eq "CODE" ? $class : $class->_finalized_psgi_app;
my $agent;
-=head2 $res = Catalyst::Test::remote_request( $url );
-
-Do an actual remote request using LWP.
-
-=cut
-
-sub remote_request {
-
+sub _remote_request {
require LWP::UserAgent;
my $request = Catalyst::Utils::request( shift(@_) );
return $agent->request($request);
}
+for my $name (qw(local_request remote_request)) {
+ my $fun = sub {
+ carp <<"EOW";
+Calling Catalyst::Test::${name}() directly is deprecated.
+
+Please import Catalyst::Test into your namespace and use the provided request()
+function instead.
+EOW
+ return __PACKAGE__->can("_${name}")->(@_);
+ };
+
+ no strict 'refs';
+ *$name = $fun;
+}
+
sub _customize_request {
my $request = shift;
my $extra_env = shift;
This library is free software. You can redistribute it and/or modify it under
the same terms as Perl itself.
+=begin Pod::Coverage
+
+local_request
+
+remote_request
+
+=end Pod::Coverage
+
=cut
1;