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 { }