7 use Catalyst::Request::REST::ForBrowsers;
8 use Catalyst::TraitFor::Request::REST::ForBrowsers;
9 use Moose::Meta::Class;
12 my $anon_class = Moose::Meta::Class->create_anon_class(
13 superclasses => ['Catalyst::Request'],
14 roles => ['Catalyst::TraitFor::Request::REST::ForBrowsers'],
18 # We run the tests twice to make sure Catalyst::Request::REST::ForBrowsers is
19 # 100% back-compatible.
20 for my $class ( $anon_class, 'Catalyst::Request::REST::ForBrowsers' ) {
22 for my $method (qw( GET POST PUT DELETE )) {
23 my $req = $class->new();
24 $req->method($method);
25 $req->{_context} = 'MockContext';
26 $req->parameters( {} );
29 $req->method(), $method,
30 "$method - not tunneled"
36 for my $method (qw( PUT DELETE )) {
37 my $req = $class->new();
39 $req->{_context} = 'MockContext';
40 $req->parameters( { 'x-tunneled-method' => $method } );
43 $req->method(), $method,
44 "$method - tunneled with x-tunneled-method param"
50 for my $method (qw( PUT DELETE )) {
51 my $req = $class->new();
53 $req->{_context} = 'MockContext';
54 $req->header( 'x-http-method-override' => $method );
57 $req->method(), $method,
58 "$method - tunneled with x-http-method-override header"
64 for my $method (qw( PUT DELETE )) {
65 my $req = $class->new();
67 $req->{_context} = 'MockContext';
68 $req->parameters( { 'x-tunneled-method' => $method } );
71 $req->method(), 'GET',
72 'x-tunneled-method is ignore with a GET'
78 my $req = $class->new();
79 $req->{_context} = 'MockContext';
81 $req->parameters( {} );
82 $req->headers( HTTP::Headers->new() );
85 $req->looks_like_browser(),
86 'default is a browser'
91 for my $with (qw( HTTP.Request XMLHttpRequest )) {
92 my $req = $class->new();
93 $req->{_context} = 'MockContext';
95 HTTP::Headers->new( 'X-Requested-With' => $with ) );
98 !$req->looks_like_browser(),
99 "not a browser - X-Request-With = $with"
105 my $req = $class->new();
106 $req->{_context} = 'MockContext';
108 $req->parameters( { 'content-type' => 'text/json' } );
109 $req->headers( HTTP::Headers->new() );
112 !$req->looks_like_browser(),
113 'forced non-HTML content-type is not a browser'
118 my $req = $class->new();
119 $req->{_context} = 'MockContext';
121 $req->parameters( { 'content-type' => 'text/html' } );
122 $req->headers( HTTP::Headers->new() );
125 $req->looks_like_browser(),
126 'forced HTML content-type is not a browser'
131 my $req = $class->new();
132 $req->{_context} = 'MockContext';
134 $req->parameters( {} );
136 HTTP::Headers->new( 'Accept' => 'text/xml; q=0.4, */*; q=0.2' ) );
139 $req->looks_like_browser(),
140 'if it accepts */* it is a browser'
145 my $req = $class->new();
146 $req->{_context} = 'MockContext';
148 $req->parameters( {} );
151 'Accept' => 'text/html; q=0.4, text/xml; q=0.2'
156 $req->looks_like_browser(),
157 'if it accepts text/html it is a browser'
162 my $req = $class->new();
163 $req->{_context} = 'MockContext';
165 $req->parameters( {} );
168 'Accept' => 'application/xhtml+xml; q=0.4, text/xml; q=0.2'
173 $req->looks_like_browser(),
174 'if it accepts application/xhtml+xml it is a browser'
179 my $req = $class->new();
180 $req->{_context} = 'MockContext';
182 $req->parameters( {} );
185 'Accept' => 'text/json; q=0.4, text/xml; q=0.2'
190 !$req->looks_like_browser(),
191 'provided an Accept header but does not accept html, is not a browser'