File Coverage

blib/lib/Test/HTTP/MockServer/REST.pm
Criterion Covered Total %
statement 52 68 76.4
branch 8 14 57.1
condition 6 12 50.0
subroutine 10 10 100.0
pod 3 3 100.0
total 79 107 73.8


line stmt bran cond sub pod time code
1             package Test::HTTP::MockServer::REST;
2 3     3   2271 use strict;
  3         3  
  3         75  
3 3     3   9 use warnings;
  3         3  
  3         54  
4 3     3   1647 use JSON::XS;
  3         10740  
  3         1236  
5              
6             sub new {
7 3     3 1 5799 my ($class) = shift;
8 3   33     15 $class = ref $class || $class;
9 3         6 my %dispatch = @_;
10 3         9 return bless { d => \%dispatch }, $class;
11             }
12              
13             sub _wrapped_rest_call {
14 5     5   7 my $self = shift;
15 5         5 my $wrapped = shift;
16             return sub {
17             # this is the coderef invoked by MockServer
18 4     4   7 my ($req, $res) = @_;
19 4         15 my $input_content = $req->content;
20 4         33 my $input_data;
21 4         14 my $input_ct = $req->header("Content-type");
22 4 50 66     141 if ($input_content && $input_ct && $input_ct eq 'application/json') {
      66        
23 2         7 eval {
24 2         14 $input_data = decode_json $req->content;
25             };
26 2 50       54 if ($@) {
27 0         0 $res->code(400);
28 0         0 $res->message('Malformed Request');
29 0         0 $res->content($@);
30 0         0 return;
31             }
32             }
33 4         8 my $selected_key;
34             my @captures;
35 4         11 my $s = join " ", $req->method(), $req->uri()->canonical()->path();
36 4         190 foreach my $key (keys %{$self->{d}}) {
  4         41  
37 6         17 my $rx = $self->{d}{$key};
38 6 100       57 if (@captures = ($s =~ $rx)) {
39 4         6 $selected_key = $key;
40 4         12 last;
41             }
42             }
43 4 50       14 if (!$selected_key) {
44 0         0 $res->code(404);
45 0         0 $res->message('Page not found');
46 0         0 $res->content("$s not found");
47 0         0 return;
48             }
49              
50 4         14 my $return_data = $wrapped->(
51             $selected_key, $req, $res, \@captures, $input_data
52             );
53              
54 4 50       72 if ($return_data) {
55 4         14 my $a = $req->header('Accept');
56 4 50 33     137 if ($a && $a eq 'application/json') {
57 4         7 eval {
58 4         44 my $out = encode_json $return_data;
59 4         10 $res->header('Content-type', 'application/json');
60 4         116 $res->content($out);
61             };
62 4 50       77 if ($@) {
63 0         0 $res->code(500);
64 0         0 $res->message('Internal Server Error');
65 0         0 $res->content($@);
66 0         0 return;
67             }
68             } else {
69 0         0 $res->code(400);
70 0         0 $res->message('Malformed Request');
71 0         0 $res->content("Only support Accept: application/json");
72 0         0 return;
73             }
74             }
75 5         43 };
76             }
77              
78             sub wrap_object {
79 3     3 1 27 my $self = shift;
80 3         6 my $object = shift;
81             return $self->_wrapped_rest_call(
82             sub {
83 2     2   2 my $key = shift;
84 2         25 return $object->$key(@_);
85             }
86 3         9 );
87             }
88              
89             sub wrap_hash {
90 2     2 1 98 my $self = shift;
91 2         4 my $hash = shift;
92             return $self->_wrapped_rest_call(
93             sub {
94 2     2   2 my $key = shift;
95 2         14 return $hash->{$key}->(@_)
96             }
97 2         38 );
98             }
99              
100             1;
101              
102             __END__