use strict; use warnings; use Test::More; use Catalyst::Request; use Catalyst::Request::REST::ForBrowsers; use Catalyst::TraitFor::Request::REST::ForBrowsers; use Moose::Meta::Class; use HTTP::Headers; use Catalyst::Log; my $anon_class = Moose::Meta::Class->create_anon_class( superclasses => ['Catalyst::Request'], roles => ['Catalyst::TraitFor::Request::REST::ForBrowsers'], cache => 1, )->name; # We run the tests twice to make sure Catalyst::Request::REST::ForBrowsers is # 100% back-compatible. for my $class ( $anon_class, 'Catalyst::Request::REST::ForBrowsers' ) { { for my $method (qw( GET POST PUT DELETE )) { my $req = $class->new( _log => Catalyst::Log->new, ); $req->method($method); $req->{_context} = 'MockContext'; $req->parameters( {} ); is( $req->method(), $method, "$method - not tunneled" ); } } { for my $method (qw( PUT DELETE )) { my $req = $class->new( _log => Catalyst::Log->new, ); $req->method('POST'); $req->{_context} = 'MockContext'; $req->parameters( { 'x-tunneled-method' => $method } ); is( $req->method(), $method, "$method - tunneled with x-tunneled-method param" ); } } { for my $method (qw( PUT DELETE )) { my $req = $class->new( _log => Catalyst::Log->new, ); $req->method('POST'); $req->{_context} = 'MockContext'; $req->header( 'x-http-method-override' => $method ); is( $req->method(), $method, "$method - tunneled with x-http-method-override header" ); } } { for my $method (qw( PUT DELETE )) { my $req = $class->new( _log => Catalyst::Log->new, ); $req->method('GET'); $req->{_context} = 'MockContext'; $req->parameters( { 'x-tunneled-method' => $method } ); is( $req->method(), 'GET', 'x-tunneled-method is ignore with a GET' ); } } { my $req = $class->new( _log => Catalyst::Log->new, ); $req->{_context} = 'MockContext'; $req->method('GET'); $req->parameters( {} ); $req->headers( HTTP::Headers->new() ); ok( $req->looks_like_browser(), 'default is a browser' ); } { for my $with (qw( HTTP.Request XMLHttpRequest )) { my $req = $class->new( _log => Catalyst::Log->new, ); $req->{_context} = 'MockContext'; $req->headers( HTTP::Headers->new( 'X-Requested-With' => $with ) ); ok( !$req->looks_like_browser(), "not a browser - X-Request-With = $with" ); } } { my $req = $class->new( _log => Catalyst::Log->new, ); $req->{_context} = 'MockContext'; $req->method('GET'); $req->parameters( { 'content-type' => 'text/json' } ); $req->headers( HTTP::Headers->new() ); ok( !$req->looks_like_browser(), 'forced non-HTML content-type is not a browser' ); } { my $req = $class->new( _log => Catalyst::Log->new, ); $req->{_context} = 'MockContext'; $req->method('GET'); $req->parameters( { 'content-type' => 'text/html' } ); $req->headers( HTTP::Headers->new() ); ok( $req->looks_like_browser(), 'forced HTML content-type is not a browser' ); } { my $req = $class->new( _log => Catalyst::Log->new, ); $req->{_context} = 'MockContext'; $req->method('GET'); $req->parameters( {} ); $req->headers( HTTP::Headers->new( 'Accept' => 'text/xml; q=0.4, */*; q=0.2' ) ); ok( $req->looks_like_browser(), 'if it accepts */* it is a browser' ); } { my $req = $class->new( _log => Catalyst::Log->new, ); $req->{_context} = 'MockContext'; $req->method('GET'); $req->parameters( {} ); $req->headers( HTTP::Headers->new( 'Accept' => 'text/html; q=0.4, text/xml; q=0.2' ) ); ok( $req->looks_like_browser(), 'if it accepts text/html it is a browser' ); } { my $req = $class->new( _log => Catalyst::Log->new, ); $req->{_context} = 'MockContext'; $req->method('GET'); $req->parameters( {} ); $req->headers( HTTP::Headers->new( 'Accept' => 'application/xhtml+xml; q=0.4, text/xml; q=0.2' ) ); ok( $req->looks_like_browser(), 'if it accepts application/xhtml+xml it is a browser' ); } { my $req = $class->new( _log => Catalyst::Log->new, ); $req->{_context} = 'MockContext'; $req->method('GET'); $req->parameters( {} ); $req->headers( HTTP::Headers->new( 'Accept' => 'text/json; q=0.4, text/xml; q=0.2' ) ); ok( !$req->looks_like_browser(), 'provided an Accept header but does not accept html, is not a browser' ); } } done_testing; package MockContext; sub prepare_body { }