[libdancer-plugin-rest-perl] 32/63: add some helpers funcions to modify the HTTP status
Jonas Smedegaard
dr at jones.dk
Wed Jul 2 11:44:52 UTC 2014
This is an automated email from the git hooks/post-receive script.
js pushed a commit to annotated tag 0.07
in repository libdancer-plugin-rest-perl.
commit 9b9073ac0d0941616fe440f4d95c3333aeecee55
Author: franck cuny <franck at lumberjaph.net>
Date: Mon Sep 6 20:59:42 2010 +0200
add some helpers funcions to modify the HTTP status
---
lib/Dancer/Plugin/REST.pm | 63 ++++++++++++++++++++++++++++++
t/04_helpers.t | 97 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 160 insertions(+)
diff --git a/lib/Dancer/Plugin/REST.pm b/lib/Dancer/Plugin/REST.pm
index 8ecf2b3..1c31a48 100644
--- a/lib/Dancer/Plugin/REST.pm
+++ b/lib/Dancer/Plugin/REST.pm
@@ -58,6 +58,35 @@ sub {
del "/${resource}/:id" => $triggers{delete};
};
+register send_entity => sub {
+ my ($entity, $http_code) = @_;
+
+ $http_code ||= 200;
+
+ status($http_code);
+ $entity;
+};
+
+register status_ok => sub {
+ send_entity($_[0]);
+};
+
+register status_created => sub {
+ send_entity($_[0], 201);
+};
+
+register status_accepted => sub {
+ send_entity($_[0], 202);
+};
+
+register status_bad_request => sub {
+ send_entity({error => $_[0]}, 400);
+};
+
+register status_not_found => sub {
+ send_entity({error => $_[0]}, 404);
+};
+
register_plugin;
1;
@@ -127,6 +156,40 @@ This keyword lets you declare a resource your application will handle.
# PUT /user/:id
# PUT /user/:id.:format
+=head2 helpers
+
+Some helpers are available. This helper will set an appropriate HTTP status for you.
+
+=head3 status_ok
+
+ status_ok({users => {...}});
+
+Set the HTTP status to 200
+
+=head3 status_created
+
+ status_created({users => {...}});
+
+Set the HTTP status to 201
+
+=head3 status_accepted
+
+ status_accepted({users => {...}});
+
+Set the HTTP status to 202
+
+=head3 status_bad_request
+
+ status_bad_request("user foo can't be found");
+
+Set the HTTP status to 400. This function as for argument a scalar that will be used under the key B<error>.
+
+=head3 status_not_found
+
+ status_not_found("users doesn't exists");
+
+Set the HTTP status to 404. This function as for argument a scalar that will be used under the key B<error>.
+
=head1 LICENCE
This module is released under the same terms as Perl itself.
diff --git a/t/04_helpers.t b/t/04_helpers.t
new file mode 100644
index 0000000..0fb2901
--- /dev/null
+++ b/t/04_helpers.t
@@ -0,0 +1,97 @@
+use strict;
+use warnings;
+use Dancer::ModuleLoader;
+use Test::More import => ['!pass'];
+
+plan tests => 16;
+
+{
+ package Webservice;
+ use Dancer;
+ use Dancer::Plugin::REST;
+
+ resource user =>
+ 'get' => \&on_get_user,
+ 'create' => \&on_create_user,
+ 'delete' => \&on_delete_user,
+ 'update' => \&on_update_user;
+
+ my $users = {};
+ my $last_id = 0;
+
+ sub on_get_user {
+ my $id = params->{'id'};
+ return status_bad_request('id is missing') if !defined $users->{$id};
+ status_ok( { user => $users->{$id} } );
+ }
+
+ sub on_create_user {
+ my $id = ++$last_id;
+ my $user = params('body');
+ $user->{id} = $id;
+ $users->{$id} = $user;
+
+ status_created( { user => $users->{$id} } );
+ }
+
+ sub on_delete_user {
+ my $id = params->{'id'};
+ my $deleted = $users->{$id};
+ delete $users->{$id};
+ status_accepted({ user => $deleted });
+ }
+
+ sub on_update_user {
+ my $id = params->{'id'};
+ my $user = $users->{$id};
+ return status_not_found("user undef") unless defined $user;
+
+ $users->{$id} = { %$user, %{ params('body') } };
+ status_accepted { user => $users->{$id} };
+ }
+
+}
+
+use lib 't';
+use TestUtils;
+
+my $r = get_response_for_request(GET => '/user/1');
+is $r->{status}, 400, 'HTTP code is 400';
+is $r->{content}->{error}, 'id is missing', 'Valid content';
+
+$r = get_response_for_request(POST => '/user', { name => 'Alexis' });
+is $r->{status}, 201, 'HTTP code is 201';
+is_deeply $r->{content}, { user => { id => 1, name => "Alexis" } },
+ "create user works";
+
+$r = get_response_for_request(GET => '/user/1');
+is $r->{status}, 200, 'HTTP code is 200';
+is_deeply $r->{content}, {user => { id => 1, name => 'Alexis'}},
+ "user 1 is defined";
+
+$r = get_response_for_request(PUT => '/user/1', { nick => 'sukria', name =>
+'Alexis Sukrieh' });
+is $r->{status}, 202, 'HTTP code is 202';
+is_deeply $r->{content}, {user => { id => 1, name => 'Alexis Sukrieh', nick => 'sukria'}},
+ "user 1 is updated";
+
+$r = get_response_for_request(PUT => '/user/23', { nick => 'john doe', name =>
+'John Doe' });
+is $r->{status}, 404, 'HTTP code is 404';
+is_deeply $r->{content}->{error}, 'user undef', 'valid content';
+
+$r = get_response_for_request(DELETE => '/user/1');
+is_deeply $r->{content}, {user => { id => 1, name => 'Alexis Sukrieh', nick => 'sukria'}},
+ "user 1 is deleted";
+is $r->{status}, 202, 'HTTP code is 202';
+
+
+$r = get_response_for_request(GET => '/user/1');
+is $r->{status}, 400, 'HTTP code is 400';
+is_deeply $r->{content}->{error}, 'id is missing', 'valid response';
+
+$r = get_response_for_request(POST => '/user', { name => 'Franck Cuny' });
+is_deeply $r->{content}, { user => { id => 2, name => "Franck Cuny" } },
+ "id is correctly increased";
+is $r->{status}, 201, 'HTTP code is 201';
+
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libdancer-plugin-rest-perl.git
More information about the Pkg-perl-cvs-commits
mailing list