use strict;
use warnings;
use Plack::Builder;
use Plack::Test;
use Test::Deep;
use Test::More;
my @methods = qw/GET POST PUT HEAD DELETE TRACE CONNECT/;
plan tests => 59;
my $app = sub {
[ 200, [ 'Content-Type' => 'text/plain' ], ['body!'] ];
};
test_psgi
app => builder {
enable 'Options';
$app;
},
client => sub {
my ( $cb ) = @_;
my $req = HTTP::Request->new(OPTIONS => '/');
my $res = $cb->($req);
is $res->code, 200;
my @allowed = split /[,\s]+/, $res->header('Allow');
cmp_bag \@methods, \@allowed;
foreach my $method (@methods) {
$req = HTTP::Request->new($method => '/');
$res = $cb->($req);
is $res->code, 200;
is $res->content, 'body!';
}
};
my @ok = qw/GET HEAD/;
my @not_ok = qw/PUT POST DELETE TRACE CONNECT/;
test_psgi
app => builder {
enable 'Options', allowed => \@ok;
$app;
},
client => sub {
my ( $cb ) = @_;
my $req = HTTP::Request->new(OPTIONS => '/');
my $res = $cb->($req);
is $res->code, 200;
my @allowed = split /[,\s]+/, $res->header('Allow');
cmp_bag \@allowed, \@ok;
foreach my $method (@ok) {
$req = HTTP::Request->new($method => '/');
$res = $cb->($req);
is $res->code, 200;
is $res->content, 'body!';
}
foreach my $method (@not_ok) {
$req = HTTP::Request->new($method => '/');
$res = $cb->($req);
is $res->code, 405;
is $res->content, 'Method not allowed';
@allowed = split /[,\s]+/, $res->header('Allow');
cmp_bag \@allowed, \@ok;
}
};
@ok = qw/GET POST PUT/;
@not_ok = qw/HEAD DELETE TRACE CONNECT/;
test_psgi
app => builder {
enable 'Options', allowed => {
GET => 1,
POST => undef,
PUT => 0,
};
$app;
},
client => sub {
my ( $cb ) = @_;
my $req = HTTP::Request->new(OPTIONS => '/');
my $res = $cb->($req);
is $res->code, 200;
my @allowed = split /[,\s]+/, $res->header('Allow');
cmp_bag \@allowed, \@ok;
foreach my $method (@ok) {
$req = HTTP::Request->new($method => '/');
$res = $cb->($req);
is $res->code, 200;
is $res->content, 'body!';
}
foreach my $method (@not_ok) {
$req = HTTP::Request->new($method => '/');
$res = $cb->($req);
is $res->code, 405;
is $res->content, 'Method not allowed';
@allowed = split /[,\s]+/, $res->header('Allow');
cmp_bag \@allowed, \@ok;
}
SKIP: {
skip "I don't know how to set Request-URI to '*'", 2;
$req = HTTP::Request->new(OPTIONS => '*');
$res = $cb->($req);
is $res->code, 200;
cmp_bag \@allowed, \@methods;
};
};