fixed forwarding to class method pairs and did some cleaning
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Test.pm
1 package Catalyst::Test;
2
3 use strict;
4 use UNIVERSAL::require;
5
6 $ENV{CATALYST_ENGINE} = 'Test';
7
8 =head1 NAME
9
10 Catalyst::Test - Test Catalyst applications
11
12 =head1 SYNOPSIS
13
14     # Helper
15     script/test.pl
16
17     # Tests
18     use Catalyst::Test 'TestApp';
19     request('index.html');
20     get('index.html');
21
22     # Run tests against a remote server
23     CATALYST_REMOTE='http://localhost:3000/' prove -l lib/ t/
24
25     # Tests with inline apps need to use Catalyst::Engine::Test
26     package TestApp;
27
28     use Catalyst qw[-Engine=Test];
29
30     __PACKAGE__->action(
31         foo => sub {
32             my ( $self, $c ) = @_;
33             $c->res->output('bar');
34         }
35     );
36
37     package main;
38
39     use Test::More tests => 1;
40     use Catalyst::Test 'TestApp';
41
42     ok( get('/foo') =~ /bar/ );
43
44 =head1 DESCRIPTION
45
46 Test Catalyst applications.
47
48 =head2 METHODS
49
50 =head3 get
51
52 Returns the content.
53
54     my $content = get('foo/bar?test=1');
55
56 =head3 request
57
58 Returns a C<HTTP::Response> object.
59
60     my $res =request('foo/bar?test=1');
61
62 =cut
63
64 sub import {
65     my $self  = shift;
66     my $class = shift;
67
68     my ( $get, $request );
69
70     if ( $ENV{CATALYST_REMOTE} ) {
71         $request = sub { remote_request(@_) };
72         $get     = sub { remote_request(@_)->content };
73     }
74
75     else {
76         $class->require;
77         unless ( $INC{'Test/Builder.pm'} ) {
78             die qq/Couldn't load "$class", "$@"/ if $@;
79         }
80
81         $request = sub { $class->run(@_) };
82         $get     = sub { $class->run(@_)->content };
83     }
84
85     no strict 'refs';
86     my $caller = caller(0);
87     *{"$caller\::request"} = $request;
88     *{"$caller\::get"}     = $get;
89 }
90
91 sub remote_request {
92     my $request = shift;
93
94     require LWP::UserAgent;
95
96     my $remote = URI->new( $ENV{CATALYST_REMOTE} );
97
98     unless ( ref $request ) {
99
100         my $uri =
101           ( $request =~ m/http/i )
102           ? URI->new($request)
103           : URI->new( 'http://localhost' . $request );
104
105         $request = $uri->canonical;
106     }
107
108     $request->scheme( $remote->scheme );
109     $request->host( $remote->host );
110     $request->port( $remote->port );
111
112     unless ( ref $request eq 'HTTP::Request' ) {
113         $request = HTTP::Request->new( 'GET', $request );
114     }
115
116     my $agent = LWP::UserAgent->new;
117
118     return $agent->request($request);
119 }
120
121 =head1 SEE ALSO
122
123 L<Catalyst>.
124
125 =head1 AUTHOR
126
127 Sebastian Riedel, C<sri@cpan.org>
128
129 =head1 COPYRIGHT
130
131 This program is free software, you can redistribute it and/or modify it under
132 the same terms as Perl itself.
133
134 =cut
135
136 1;