File Coverage

blib/lib/Eixo/Rest/ApiFakeServer.pm
Criterion Covered Total %
statement 38 59 64.4
branch 4 14 28.5
condition 0 3 0.0
subroutine 7 16 43.7
pod 0 3 0.0
total 49 95 51.5


line stmt bran cond sub pod time code
1             package Eixo::Rest::ApiFakeServer;
2              
3 2     2   73340 use strict;
  2         3  
  2         72  
4 2     2   1677 use Eixo::Base::Clase;
  2         36740  
  2         28  
5              
6             has(
7              
8             listeners=>{},
9              
10             cgi=>undef,
11              
12             );
13              
14             sub initialize{
15 2     2 0 1122 my ($self, %args) = @_;
16              
17 2         6 $self->{cgi} = $args{cgi};
18 2         4 $self->{listeners} = $args{listeners};
19            
20             # we treat special routes, ie. with placeholders...
21              
22 2         6 my $routes = [];
23              
24 2         4 foreach my $r (keys(%{$args{listeners}})){
  2         11  
25              
26 6 100       22 if($r =~ /\:/){
27              
28 1         2 my $n = $r;
29              
30 1         12 while($r =~ /\:(\w+)/g){
31              
32 1         25 $n =~ s/\:$1/\[\^\/\]\+/;
33             }
34              
35 1         3 $n .= '$';
36              
37 1         17 $n = qr/$n/;
38              
39             push @$routes, {
40              
41             tester=>sub {
42            
43 0     0   0 $_[0] =~ /$n/;
44            
45             },
46              
47 1         11 route=>$r
48             }
49              
50             }
51             else{
52             unshift @$routes, {
53              
54             tester=>sub {
55              
56 0     0   0 $_[0] eq $r;
57             },
58              
59 5         35 route=>$r
60             }
61             }
62              
63             }
64              
65 2         8 $self->{routes} = $routes;
66              
67 2         5 foreach(values(%{$self->{listeners}})){
  2         9  
68              
69 6 100       21 $_->{type} = "GET" unless($_->{type});
70             }
71              
72 2         8 $self;
73             }
74              
75             sub start{
76 2     2 0 14 my ($self, $port) = @_;
77              
78 2         8 return Eixo::Rest::ApiFakeServerProcess::start_server(
79              
80             $port,
81              
82             $self
83             );
84              
85             }
86              
87             sub process{
88 0     0 0 0 my ($self, $cgi) = @_;
89              
90 0         0 $self->cgi($cgi);
91              
92 0   0     0 my $listener = $self->__getListener($cgi) || $self->__defaultListener;
93              
94 0         0 $self->__send(
95              
96             $listener
97             );
98              
99             }
100              
101             sub __getListener{
102 0     0   0 my ($self, $cgi) = @_;
103              
104 0         0 foreach my $r (@{$self->{routes}}){
  0         0  
105              
106 0 0       0 if($r->{tester}->($cgi->path_info)){
107              
108 0         0 my $method = $self->{listeners}->{$r->{route}};
109              
110 0 0       0 return $method if($method->{type} eq '*');
111              
112 0 0       0 return $method if(lc($method->{type}) eq lc($cgi->request_method));
113             }
114             }
115              
116             }
117              
118             sub __defaultListener{
119             {}
120 0     0   0 }
121              
122             sub __send{
123 0     0   0 my ($self, $response) = @_;
124              
125 0 0       0 ($response->{header}) ? $response->{header}->($self) : $self->__header;
126              
127 0 0       0 ($response->{body}) ? $response->{body}->($self) : $self->__body;
128              
129             }
130              
131             sub __header{
132              
133 0     0   0 print "HTTP/1.0 200 OK\r\n";
134 0         0 print $_[0]->cgi->header(-type => 'text/plain');
135             }
136              
137       0     sub __body{
138              
139             }
140              
141             package Eixo::Rest::ApiFakeServerProcess;
142              
143 2     2   3209 use strict;
  2         3  
  2         66  
144 2     2   1493 use parent qw(HTTP::Server::Simple::CGI);
  2         766  
  2         12  
145              
146             sub start_server{
147 2     2   4 my ($port, $api) = @_;
148              
149 2         38 my $server = __PACKAGE__->new;
150              
151 2         91 $server->{api} = $api;
152              
153 2         6 $server->port($port);
154            
155 2         21 $server->background();
156              
157             }
158              
159             sub handle_request{
160 0     0     my ($self, $cgi) = @_;
161              
162 0           $self->{api}->process($cgi);
163              
164             }
165              
166             1;