1use strict;
2use warnings;
3use Dancer::ModuleLoader;
4use Test::More import => ['!pass'];
5
6plan tests => 16;
7
8{
9
10    package Webservice;
11    use Dancer;
12    use Dancer::Plugin::REST;
13
14    resource user => 'get' => \&on_get_user,
15      'create'    => \&on_create_user,
16      'delete'    => \&on_delete_user,
17      'update'    => \&on_update_user;
18
19    my $users   = {};
20    my $last_id = 0;
21
22    sub on_get_user {
23        my $id = params->{'id'};
24        return status_bad_request('id is missing') if !defined $users->{$id};
25        status_ok( { user => $users->{$id} } );
26    }
27
28    sub on_create_user {
29        my $id   = ++$last_id;
30        my $user = params('body');
31        $user->{id} = $id;
32        $users->{$id} = $user;
33
34        status_created( { user => $users->{$id} } );
35    }
36
37    sub on_delete_user {
38        my $id      = params->{'id'};
39        my $deleted = $users->{$id};
40        delete $users->{$id};
41        status_accepted( { user => $deleted } );
42    }
43
44    sub on_update_user {
45        my $id   = params->{'id'};
46        my $user = $users->{$id};
47        return status_not_found("user undef") unless defined $user;
48
49        $users->{$id} = { %$user, %{ params('body') } };
50        status_accepted { user => $users->{$id} };
51    }
52
53}
54
55use Dancer::Test;
56
57my $r = dancer_response( GET => '/user/1' );
58is $r->{status}, 400, 'HTTP code is 400';
59is $r->{content}->{error}, 'id is missing', 'Valid content';
60
61$r = dancer_response( POST => '/user', { body => { name => 'Alexis' } } );
62is $r->{status}, 201, 'HTTP code is 201';
63is_deeply $r->{content}, { user => { id => 1, name => "Alexis" } },
64  "create user works";
65
66$r = dancer_response( GET => '/user/1' );
67is $r->{status}, 200, 'HTTP code is 200';
68is_deeply $r->{content}, { user => { id => 1, name => 'Alexis' } },
69  "user 1 is defined";
70
71$r = dancer_response(
72    PUT => '/user/1',
73    {   body => {
74            nick => 'sukria',
75            name => 'Alexis Sukrieh'
76        }
77    }
78);
79is $r->{status}, 202, 'HTTP code is 202';
80is_deeply $r->{content},
81  { user => { id => 1, name => 'Alexis Sukrieh', nick => 'sukria' } },
82  "user 1 is updated";
83
84$r = dancer_response(
85    PUT => '/user/23',
86    {   body => {
87            nick => 'john doe',
88            name => 'John Doe'
89        }
90    }
91);
92is $r->{status}, 404, 'HTTP code is 404';
93is_deeply $r->{content}->{error}, 'user undef', 'valid content';
94
95$r = dancer_response( DELETE => '/user/1' );
96is_deeply $r->{content},
97  { user => { id => 1, name => 'Alexis Sukrieh', nick => 'sukria' } },
98  "user 1 is deleted";
99is $r->{status}, 202, 'HTTP code is 202';
100
101
102$r = dancer_response( GET => '/user/1' );
103is $r->{status}, 400, 'HTTP code is 400';
104is_deeply $r->{content}->{error}, 'id is missing', 'valid response';
105
106$r = dancer_response( POST => '/user', { body => { name => 'Franck Cuny' } } );
107is_deeply $r->{content}, { user => { id => 2, name => "Franck Cuny" } },
108  "id is correctly increased";
109is $r->{status}, 201, 'HTTP code is 201';
110
111