--- /dev/null
+use strictures 1;
+use Test::More;
+
+{
+ package t::Web::Simple::HTTPMethods;
+
+ use Web::Simple;
+ use Web::Dispatch::HTTPMethods;
+
+ sub as_text {
+ [200, ['Content-Type' => 'text/plain'],
+ [$_[0]->{REQUEST_METHOD}, $_[0]->{REQUEST_URI}] ]
+ }
+
+ sub dispatch_request {
+ sub (/get) {
+ GET { as_text(pop) }
+ },
+ sub (/get-head-options) {
+ GET { as_text(pop) }
+ HEAD { [204,[],[]] }
+ OPTIONS { [204,[],[]] },
+ },
+ sub (/get-post-put) {
+ GET { as_text(pop) }
+ POST { as_text(pop) }
+ PUT { as_text(pop) }
+ },
+ }
+}
+
+ok my $app = t::Web::Simple::HTTPMethods->new,
+ 'made app';
+
+for my $uri ('http://localhost/get-post-put') {
+
+ ## Check allowed methods and responses
+ for(ok my $res = $app->run_test_request(GET => $uri)) {
+ is $res->content, 'GET/get-post-put';
+ }
+
+ for(ok my $res = $app->run_test_request(POST => $uri)) {
+ is $res->content, 'POST/get-post-put';
+ }
+
+ for(ok my $res = $app->run_test_request(PUT => $uri)) {
+ is $res->content, 'PUT/get-post-put';
+ }
+
+ ## Since GET is allowed, check for implict HEAD
+ for(ok my $head = $app->run_test_request(HEAD => $uri)) {
+ is $head->code, 200;
+ is $head->content, '';
+ }
+
+ ## Check the implicit support for OPTIONS
+ for(ok my $options = $app->run_test_request(OPTIONS => $uri)) {
+ is $options->code, 200;
+ is $options->content, '';
+ is $options->header('Allow'), 'GET,HEAD,POST,PUT,OPTIONS';
+ }
+
+ ## Check implicitly added not allowed
+ for(ok my $not_allowed = $app->run_test_request(DELETE => $uri)) {
+ is $not_allowed->code, 405;
+ is $not_allowed->content, 'Method Not Allowed';
+ is $not_allowed->header('Allow'), 'GET,HEAD,POST,PUT,OPTIONS';
+ }
+
+}
+
+for my $uri ('http://localhost/get-head-options') {
+
+ ## Check allowed methods and responses
+ for(ok my $res = $app->run_test_request(GET => $uri)) {
+ is $res->content, 'GET/get-head-options';
+ }
+
+ for(ok my $head = $app->run_test_request(HEAD => $uri)) {
+ is $head->code, 204;
+ is $head->content, '';
+ }
+
+ for(ok my $options = $app->run_test_request(OPTIONS => $uri)) {
+ is $options->code, 204;
+ is $options->content, '';
+ }
+
+ ## Check implicitly added not allowed
+ for(ok my $not_allowed = $app->run_test_request(PUT => $uri)) {
+ is $not_allowed->code, 405;
+ is $not_allowed->content, 'Method Not Allowed';
+ is $not_allowed->header('Allow'), 'GET,HEAD,OPTIONS';
+ }
+
+}
+
+for my $uri ('http://localhost/get') {
+
+ ## Check allowed methods and responses
+ for(ok my $res = $app->run_test_request(GET => $uri)) {
+ is $res->content, 'GET/get';
+ }
+
+ ## Check implicitly added not allowed
+ for(ok my $not_allowed = $app->run_test_request(PUT => $uri)) {
+ is $not_allowed->code, 405;
+ is $not_allowed->content, 'Method Not Allowed';
+ is $not_allowed->header('Allow'), 'GET,HEAD,OPTIONS';
+ }
+
+ ## Since GET is allowed, check for implict HEAD
+ for(ok my $head = $app->run_test_request(HEAD => $uri)) {
+ is $head->code, 200;
+ is $head->content, '';
+ }
+
+}
+
+done_testing;