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