perl5.8.8 + cat 5.80's Cat::Test->ctx_request didn't return $c the 2nd
[catagits/Catalyst-Runtime.git] / t / unit_load_catalyst_test.t
CommitLineData
c7ded7aa 1#!perl
2
3use strict;
4use warnings;
5
26dd6d9f 6use FindBin;
7use lib "$FindBin::Bin/lib";
ba151d0d 8use Test::More tests => 59;
d258fcb2 9use FindBin qw/$Bin/;
10use lib "$Bin/lib";
d9d04ded 11use Catalyst::Utils;
4348c28b 12use HTTP::Request::Common;
6f8be318 13use Test::Exception;
c7ded7aa 14
26dd6d9f 15my $Class = 'Catalyst::Test';
16my $App = 'TestApp';
17my $Pkg = __PACKAGE__;
18my $Url = 'http://localhost/';
19my $Content = "root index";
c7ded7aa 20
26dd6d9f 21my %Meth = (
4fbc0e85 22 $Pkg => [qw|get request ctx_request|], # exported
26dd6d9f 23 $Class => [qw|local_request remote_request|], # not exported
24);
c7ded7aa 25
26dd6d9f 26### make sure we're not trying to connect to a remote host -- these are local tests
27local $ENV{CATALYST_SERVER};
c7ded7aa 28
26dd6d9f 29use_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
f2e13bbd 69 ### do a call, we should get a result and perhaps a $c if it's 'ctx_request';
26dd6d9f 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
f2e13bbd 81 ### some tests for 'ctx_request'
82 skip "Context tests skipped for '$meth'", 6 unless $meth eq 'ctx_request';
26dd6d9f 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}
d9d04ded 94
ba151d0d 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
4348c28b 107# FIXME - These vhosts in tests tests should be somewhere else...
108
d9d04ded 109sub 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}
d258fcb2 143
144# Back compat test, extra args used to be ignored, now a hashref of options.
145use_ok('Catalyst::Test', 'TestApp', 'foobar');
4348c28b 146
147# Back compat test, ensure that request ignores anything which isn't a hash.
148lives_ok {
149 request(GET('/dummy'), 'foo');
150} 'scalar additional param to request method ignored';
151lives_ok {
152 request(GET('/dummy'), []);
153} 'array additional param to request method ignored';
269194b4 154