Remove MockObject from Makefile.PL
[catagits/Catalyst-Runtime.git] / t / unit_load_catalyst_test.t
1 #!perl
2
3 use strict;
4 use warnings;
5
6 use FindBin;
7 use lib         "$FindBin::Bin/lib";
8 use Test::More  tests => 59;
9 use FindBin qw/$Bin/;
10 use lib "$Bin/lib";
11 use Catalyst::Utils;
12 use HTTP::Request::Common;
13 use Test::Exception;
14
15 my $Class   = 'Catalyst::Test';
16 my $App     = 'TestApp';
17 my $Pkg     = __PACKAGE__;
18 my $Url     = 'http://localhost/';
19 my $Content = "root index";
20
21 my %Meth    = (
22     $Pkg    => [qw|get request ctx_request|],          # exported
23     $Class  => [qw|local_request remote_request|],  # not exported
24 );
25
26 ### make sure we're not trying to connect to a remote host -- these are local tests
27 local $ENV{CATALYST_SERVER};                
28
29 use_ok( $Class );
30
31 ### check available methods
32 {   ### turn of redefine warnings, we'll get new subs exported
33     ### XXX 'no warnings' and 'local $^W' wont work as warnings are turned on in
34     ### test.pm, so trap them for now --kane
35     {   local $SIG{__WARN__} = sub {};
36         ok( $Class->import,     "Argumentless import for methods only" );
37     }
38
39     while( my($class, $meths) = each %Meth ) {
40         for my $meth ( @$meths ) { SKIP: {
41             
42             ### method available?
43             can_ok( $class,     $meth );
44
45             ### only for exported methods
46             skip "Error tests only for exported methods", 2 unless $class eq $Pkg;
47
48             ### check error conditions
49             eval { $class->can($meth)->( $Url ) };
50             ok( $@,             "   $meth without app gives error" );
51             like( $@, qr/$Class/, 
52                                 "       Error filled with expected content for '$meth'" );
53         } }       
54     }
55 }    
56  
57 ### simple tests for exported methods 
58 {   ### turn of redefine warnings, we'll get new subs exported
59     ### XXX 'no warnings' and 'local $^W' wont work as warnings are turned on in
60     ### test.pm, so trap them for now --kane
61     {   local $SIG{__WARN__} = sub {};
62         ok( $Class->import( $App ), 
63                                 "Loading $Class for App $App" );
64     }
65     
66     ### test exported methods again
67     for my $meth ( @{ $Meth{$Pkg} } ) { SKIP: {
68
69         ### do a call, we should get a result and perhaps a $c if it's 'ctx_request';
70         my ($res, $c) = eval { $Pkg->can($meth)->( $Url ) };
71         
72         ok( 1,                  "   Called $Pkg->$meth( $Url )" );
73         ok( !$@,                "       No critical error $@" );
74         ok( $res,               "       Result obtained" );
75         
76         ### get the content as a string, to make sure we got what we expected
77         my $res_as_string = $meth eq 'get' ? $res : $res->content;
78         is( $res_as_string, $Content,
79                                 "           Content as expected: $res_as_string" );    
80         
81         ### some tests for 'ctx_request'
82         skip "Context tests skipped for '$meth'", 6 unless $meth eq 'ctx_request';
83         
84         ok( $c,                 "           Context object returned" );
85         isa_ok( $c, $App,       "               Object" );
86         is( $c->request->uri, $Url,
87                                 "               Url recorded in request" );
88         is( $c->response->body, $Content,
89                                 "               Content recorded in response" );
90         ok( $c->stash,          "               Stash accessible" );
91         ok( $c->action,         "               Action object accessible" );
92     } }
93 }
94
95 ### perl5.8.8 + cat 5.80's Cat::Test->ctx_request didn't return $c the 2nd 
96 ### time it was invoked. Without tracking the bug down all the way, it was
97 ### clearly related to the Moose'ification of Cat::Test and a scoping issue
98 ### with a 'my'd variable. Since the same code works fine in 5.10, a bug in
99 ### either Moose or perl 5.8 is suspected.
100 {   ok( 1,                      "Testing consistency of ctx_request()" );
101     for( 1..2 ) {
102         my($res, $c) = ctx_request( $Url );
103         ok( $c,                 "   Call $_: Context object returned" );
104     }
105 }    
106
107 # FIXME - These vhosts in tests tests should be somewhere else...
108
109 sub customize { Catalyst::Test::_customize_request(@_) }
110
111 {
112     my $req = Catalyst::Utils::request('/dummy');
113     customize( $req );
114     is( $req->header('Host'), undef, 'normal request is unmodified' );
115 }
116
117 {
118     my $req = Catalyst::Utils::request('/dummy');
119     customize( $req, { host => 'customized.com' } );
120     like( $req->header('Host'), qr/customized.com/, 'request is customizable via opts hash' );
121 }
122
123 {
124     my $req = Catalyst::Utils::request('/dummy');
125     local $Catalyst::Test::default_host = 'localized.com';
126     customize( $req );
127     like( $req->header('Host'), qr/localized.com/, 'request is customizable via package var' );
128 }
129
130 {
131     my $req = Catalyst::Utils::request('/dummy');
132     local $Catalyst::Test::default_host = 'localized.com';
133     customize( $req, { host => 'customized.com' } );
134     like( $req->header('Host'), qr/customized.com/, 'opts hash takes precedence over package var' );
135 }
136
137 {
138     my $req = Catalyst::Utils::request('/dummy');
139     local $Catalyst::Test::default_host = 'localized.com';
140     customize( $req, { host => '' } );
141     is( $req->header('Host'), undef, 'default value can be temporarily cleared via opts hash' );
142 }
143
144 # Back compat test, extra args used to be ignored, now a hashref of options.
145 use_ok('Catalyst::Test', 'TestApp', 'foobar');
146
147 # Back compat test, ensure that request ignores anything which isn't a hash.
148 lives_ok {
149     request(GET('/dummy'), 'foo');
150 } 'scalar additional param to request method ignored';
151 lives_ok {
152     request(GET('/dummy'), []);
153 } 'array additional param to request method ignored';
154