023b8e51c1f7ec58b0f97131ead9c5687e68862a
[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         $class->import;
83
84         $request = sub { $class->run(@_) };
85         $get     = sub { $class->run(@_)->content };
86     }
87
88     no strict 'refs';
89     my $caller = caller(0);
90     *{"$caller\::request"} = $request;
91     *{"$caller\::get"}     = $get;
92 }
93
94 my $agent;
95
96 =item remote_request
97
98 Do an actual remote request using LWP.
99
100 =cut
101
102 sub remote_request {
103
104     require LWP::UserAgent;
105
106     my $request = Catalyst::Utils::request( shift(@_) );
107
108     my $server = URI->new( $ENV{CATALYST_SERVER} );
109
110     if ( $server->path =~ m|^(.+)?/$| ) {
111         $server->path("$1");    # need to be quoted
112     }
113
114     $request->uri->scheme( $server->scheme );
115     $request->uri->host( $server->host );
116     $request->uri->port( $server->port );
117     $request->uri->path( $server->path . $request->uri->path );
118
119     unless ($agent) {
120
121         $agent = LWP::UserAgent->new(
122             keep_alive   => 1,
123             max_redirect => 0,
124             timeout      => 60,
125         );
126
127         $agent->env_proxy;
128     }
129
130     return $agent->request($request);
131 }
132
133 =back 
134
135 =head1 SEE ALSO
136
137 L<Catalyst>.
138
139 =head1 AUTHOR
140
141 Sebastian Riedel, C<sri@cpan.org>
142
143 =head1 COPYRIGHT
144
145 This program is free software, you can redistribute it and/or modify it under
146 the same terms as Perl itself.
147
148 =cut
149
150 1;