File Coverage

blib/lib/Test/JsonAPI/Autodoc.pm
Criterion Covered Total %
statement 75 76 98.6
branch 12 14 85.7
condition 5 6 83.3
subroutine 19 19 100.0
pod 5 5 100.0
total 116 120 96.6


line stmt bran cond sub pod time code
1             package Test::JsonAPI::Autodoc;
2 13     13   2480604 use 5.008005;
  13         52  
  13         539  
3 13     13   74 use strict;
  13         26  
  13         420  
4 13     13   64 use warnings;
  13         28  
  13         465  
5 13     13   12111 use parent qw/Exporter/;
  13         4488  
  13         73  
6 13     13   687 use Carp;
  13         23  
  13         923  
7 13     13   68 use Test::More ();
  13         21  
  13         199  
8 13     13   12359 use Scope::Guard;
  13         7236  
  13         571  
9 13     13   3258 use LWP::UserAgent;
  13         146953  
  13         385  
10 13     13   14750 use Test::JsonAPI::Autodoc::Markdown;
  13         44  
  13         475  
11 13     13   8862 use Test::JsonAPI::Autodoc::Request;
  13         42  
  13         603  
12 13     13   8640 use Test::JsonAPI::Autodoc::Response;
  13         39  
  13         1014  
13              
14             our @EXPORT = qw/
15             describe
16             http_ok
17             plack_ok
18             set_documents_path
19             set_template
20             /;
21              
22             our $VERSION = "0.20";
23              
24             my $in_describe;
25             my $results;
26             my $first_time;
27              
28             my $output_path;
29             my $template;
30              
31             BEGIN {
32 13     13   8776 $first_time = 1;
33             }
34              
35             sub set_documents_path {
36 11     11 1 753299 $output_path = shift;
37             }
38              
39             sub set_template {
40 1     1 1 7 $template = shift;
41             }
42              
43             sub describe {
44 15 50   15 1 24955 if ($in_describe) {
45 0         0 croak '`describe` must not call as nesting';
46             }
47              
48             my $guard = sub {
49             return Scope::Guard->new(sub {
50 15         196 undef $in_describe;
51 15         35 undef $results;
52 15         221 undef $first_time;
53 15     15   194 });
54 15         119 }->();
55              
56 15         230 $in_describe = 1;
57              
58 15         44 my ($description, $coderef) = @_;
59              
60             # change location of test failure to be included Test::More's output
61             # to be more helpful to user.
62 15         43 local $Test::Builder::Level = $Test::Builder::Level + 1;
63              
64 15         91 my $result = Test::More::subtest($description => $coderef);
65              
66 15 100 66     17511 if ($result && $results && $ENV{TEST_JSONAPI_AUTODOC}) {
      100        
67 13         150 my $markdown = Test::JsonAPI::Autodoc::Markdown->new($output_path, $template);
68 13         73 $markdown->generate($description, $results, $first_time);
69             }
70             }
71              
72             sub http_ok {
73 12     12 1 108847 my ($req, $expected_code, $note) = @_;
74 12         66 return _api_ok($req, $expected_code, $note);
75             }
76              
77             sub plack_ok {
78 3     3 1 7147 my ($plack_app, $req, $expected_code, $note) = @_;
79 3         12 return _api_ok($req, $expected_code, $note, $plack_app);
80             }
81              
82             sub _api_ok {
83 15     15   43 my ($req, $expected_code, $note, $plack_app) = @_;
84              
85 15         39 my $description = $note;
86 15         45 my $param_description = {};
87 15 100       186 if (ref $note eq 'HASH') {
88 1         3 $description = $note->{description};
89 1         3 $param_description = $note->{param_description};
90             }
91              
92 15         29 my $res;
93 15         36 my $is_plack_app = 0;
94 15 100       67 if ($plack_app) { # for Plack::Test
95 3 100       18 $res = ref $plack_app eq 'CODE' ? $plack_app->($req) # use `test_psgi`
96             : $plack_app->request($req); # not use `test_psgi`
97 3         7560 $is_plack_app = 1;
98             }
99             else {
100 12         163 $res = LWP::UserAgent->new->request($req);
101             }
102              
103             # change location of test failure to be included Test::More's output
104             # to be more helpful to user.
105 15         42654 local $Test::Builder::Level = $Test::Builder::Level + 2;
106              
107 15         78 my $result = Test::More::is $res->code, $expected_code;
108 15 50       9935 return unless $result;
109 15 100       98 return unless $in_describe;
110              
111 14         174 my $parsed_request = Test::JsonAPI::Autodoc::Request->new->parse($req, $param_description);
112 14         859 my $parsed_response = Test::JsonAPI::Autodoc::Response->new->parse($res);
113              
114 14         171 my $response_body = $parsed_response->{body};
115 14         107 my $response_content_type = $parsed_response->{content_type};
116              
117 14         297 push @$results, {
118             note => $description,
119              
120             path => $parsed_request->{path},
121             server => $parsed_request->{server},
122             method => $parsed_request->{method},
123             query => $parsed_request->{query},
124             request_content_type => $parsed_request->{content_type},
125             request_parameters => $parsed_request->{parameters},
126             is_plack_app => $is_plack_app,
127              
128             status => $expected_code,
129             response_body => $response_body,
130             response_content_type => $response_content_type,
131             };
132              
133             return +{
134 14         255 status => $expected_code,
135             body => $response_body,
136             content_type => $response_content_type,
137             };
138             }
139             1;
140             __END__