7 use Catalyst::Request::REST::ForBrowsers;
8 use Catalyst::TraitFor::Request::REST::ForBrowsers;
9 use Moose::Meta::Class;
13 my $anon_class = Moose::Meta::Class->create_anon_class(
14 superclasses => ['Catalyst::Request'],
15 roles => ['Catalyst::TraitFor::Request::REST::ForBrowsers'],
19 # We run the tests twice to make sure Catalyst::Request::REST::ForBrowsers is
20 # 100% back-compatible.
21 for my $class ( $anon_class, 'Catalyst::Request::REST::ForBrowsers' ) {
23 for my $method (qw( GET POST PUT DELETE )) {
24 my $req = $class->new(
25 _log => Catalyst::Log->new,
27 $req->method($method);
28 $req->{_context} = 'MockContext';
29 $req->parameters( {} );
32 $req->method(), $method,
33 "$method - not tunneled"
39 for my $method (qw( PUT DELETE )) {
40 my $req = $class->new();
42 $req->{_context} = 'MockContext';
43 $req->parameters( { 'x-tunneled-method' => $method } );
46 $req->method(), $method,
47 "$method - tunneled with x-tunneled-method param"
53 for my $method (qw( PUT DELETE )) {
54 my $req = $class->new();
56 $req->{_context} = 'MockContext';
57 $req->header( 'x-http-method-override' => $method );
60 $req->method(), $method,
61 "$method - tunneled with x-http-method-override header"
67 for my $method (qw( PUT DELETE )) {
68 my $req = $class->new();
70 $req->{_context} = 'MockContext';
71 $req->parameters( { 'x-tunneled-method' => $method } );
74 $req->method(), 'GET',
75 'x-tunneled-method is ignore with a GET'
81 my $req = $class->new();
82 $req->{_context} = 'MockContext';
84 $req->parameters( {} );
85 $req->headers( HTTP::Headers->new() );
88 $req->looks_like_browser(),
89 'default is a browser'
94 for my $with (qw( HTTP.Request XMLHttpRequest )) {
95 my $req = $class->new();
96 $req->{_context} = 'MockContext';
98 HTTP::Headers->new( 'X-Requested-With' => $with ) );
101 !$req->looks_like_browser(),
102 "not a browser - X-Request-With = $with"
108 my $req = $class->new();
109 $req->{_context} = 'MockContext';
111 $req->parameters( { 'content-type' => 'text/json' } );
112 $req->headers( HTTP::Headers->new() );
115 !$req->looks_like_browser(),
116 'forced non-HTML content-type is not a browser'
121 my $req = $class->new();
122 $req->{_context} = 'MockContext';
124 $req->parameters( { 'content-type' => 'text/html' } );
125 $req->headers( HTTP::Headers->new() );
128 $req->looks_like_browser(),
129 'forced HTML content-type is not a browser'
134 my $req = $class->new();
135 $req->{_context} = 'MockContext';
137 $req->parameters( {} );
139 HTTP::Headers->new( 'Accept' => 'text/xml; q=0.4, */*; q=0.2' ) );
142 $req->looks_like_browser(),
143 'if it accepts */* it is a browser'
148 my $req = $class->new();
149 $req->{_context} = 'MockContext';
151 $req->parameters( {} );
154 'Accept' => 'text/html; q=0.4, text/xml; q=0.2'
159 $req->looks_like_browser(),
160 'if it accepts text/html it is a browser'
165 my $req = $class->new();
166 $req->{_context} = 'MockContext';
168 $req->parameters( {} );
171 'Accept' => 'application/xhtml+xml; q=0.4, text/xml; q=0.2'
176 $req->looks_like_browser(),
177 'if it accepts application/xhtml+xml it is a browser'
182 my $req = $class->new();
183 $req->{_context} = 'MockContext';
185 $req->parameters( {} );
188 'Accept' => 'text/json; q=0.4, text/xml; q=0.2'
193 !$req->looks_like_browser(),
194 'provided an Accept header but does not accept html, is not a browser'