File Coverage

inc/Mock/LWP/UserAgent.pm
Criterion Covered Total %
statement 92 96 95.8
branch 9 14 64.2
condition 1 3 33.3
subroutine 23 25 92.0
pod n/a
total 125 138 90.5


line stmt bran cond sub pod time code
1             package Mock::LWP::UserAgent;
2              
3 2     2   2497 use 5.006002;
  2         9  
4              
5 2     2   10 use strict;
  2         5  
  2         46  
6 2     2   10 use warnings;
  2         2  
  2         50  
7              
8 2     2   8 use Carp;
  2         4  
  2         124  
9 2     2   13 use Digest::MD5 ();
  2         4  
  2         31  
10 2     2   9 use File::Spec;
  2         4  
  2         53  
11 2     2   10 use HTTP::Request;
  2         3  
  2         56  
12 2     2   20 use HTTP::Response;
  2         3  
  2         53  
13 2     2   25 use LWP::UserAgent;
  2         4  
  2         55  
14 2     2   10 use JSON;
  2         3  
  2         21  
15              
16             our $VERSION = '0.161_01';
17              
18             our $CANNED_RESPONSE_DIR = File::Spec->catdir(
19             qw{ t data Mock-LWP-UserAgent } );
20              
21             our $LOG_FILE_NAME = $ENV{MOCK_LWP_USERAGENT_LOG_FILE_NAME};
22              
23 2     2   396 use constant HASH_REF => ref {};
  2         4  
  2         279  
24              
25             $LOG_FILE_NAME
26             and eval {
27             require Test::More;
28             1;
29             } or $LOG_FILE_NAME = undef;
30              
31             ## my %original = map { $_ => LWP::UserAgent->can( $_ ) } qw{
32             ## new cookie_jar env_proxy get head post put request
33             ## };
34              
35             sub import {
36              
37 2     2   12 $Astro::SpaceTrack::SPACETRACK_DELAY_SECONDS = 0;
38              
39 2     2   12 no warnings qw{ redefine };
  2         6  
  2         2819  
40              
41             *LWP::UserAgent::new = sub {
42 3     3   8 my ( $class ) = @_;
43 3   33     80 return bless {
44             json => JSON->new()->utf8()->pretty()->canonical(),
45             }, ref $class || $class;
46 2         160 };
47              
48             *LWP::UserAgent::cookie_jar = sub {
49 55     55   95 my ( $self, $data ) = @_;
50 55         85 my $old = $self->{cookie_jar};
51 55 100       113 if ( $data ) {
52 2 50       16 if ( HASH_REF eq ref $data ) {
53 2         1004 require HTTP::Cookies;
54 2         14285 $data = HTTP::Cookies->new( %{ $data } );
  2         10  
55             }
56 2         61 $self->{cookie_jar} = $data;
57             }
58 55         155 return $old;
59 2         75 };
60              
61             *LWP::UserAgent::env_proxy = sub {
62 2     2   5 return;
63 2         63 };
64              
65             *LWP::UserAgent::get = sub {
66 48     48   80 my ( $self, $url ) = @_;
67 48         107 return _fetch( $self, GET => $url );
68 2         26 };
69              
70             *LWP::UserAgent::head = sub {
71 0     0   0 my ( $self, $url ) = @_;
72 0         0 return _fetch( $self, HEAD => $url );
73 2         20 };
74              
75             *LWP::UserAgent::post = sub {
76 2     2   6 my ( $self, $url ) = @_;
77 2         8 return _fetch( $self, POST => $url );
78 2         24 };
79              
80             *LWP::UserAgent::put = sub {
81 0     0   0 my ( $self, $url ) = @_;
82 0         0 return _fetch( $self, PUT => $url );
83 2         23 };
84              
85             *LWP::UserAgent::request = sub {
86 50     50   84 my ( $self, $rqst ) = @_;
87 50         89 my $method = $rqst->method();
88 50         505 my $url = $rqst->url();
89 50         337 my $path = __file_name_for( $method, $url );
90 50 50       1004 $LOG_FILE_NAME
91             and Test::More::diag( "Reading $path\n for $method $url" );
92 50 100       1085 -f $path
93             or return _fail( $rqst, 404, "File $path not found" );
94 49         280 local $/ = undef;
95 2 50   2   15 open my $fh, '<:encoding(utf-8)', $path
  2         4  
  2         14  
  49         1899  
96             or return _fail( $rqst, 500, "Failed to open $path: $!" );
97 49         35997 my $input = <$fh>;
98 49         2082 close $fh;
99 49         105 my @data;
100 49 50       72 eval {
101 49         60 @data = @{ $self->{json}->decode( $input ) };
  49         1131  
102 49         174 1;
103             } or return _fail( $rqst, 500, "Failed to decode content of $path: $@" );
104 49         294 my $resp = HTTP::Response->new( @data[ 0 .. 3 ] );
105 49         8185 $resp->request( $rqst );
106 49 50       484 if ( my $jar = $self->cookie_jar() ) {
107 49         130 $jar->extract_cookies( $resp );
108             }
109 49         18307 return $resp;
110 2         102 };
111              
112             }
113              
114             sub _fail {
115 1     1   5 my ( $rqst, $code, $msg ) = @_;
116 1         4 my $resp = HTTP::Response->new( $code, $msg );
117 1         52 $resp->request( $rqst );
118 1         14 return $resp;
119             }
120              
121             sub _fetch {
122 50     50   102 my ( $self, $method, $url ) = @_;
123 50         243 my $rqst = HTTP::Request->new( $method, $url );
124 50         11038 return $self->request( $rqst );
125             }
126              
127             sub __file_name_for {
128 50     50   83 my ( $method, $url ) = @_;
129 50         391 return File::Spec->catfile(
130             $CANNED_RESPONSE_DIR,
131             Digest::MD5::md5_hex( "$method-$url" ) . '.json',
132             );
133             }
134              
135             1;
136              
137             __END__