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   2641 use 5.006002;
  2         11  
4              
5 2     2   10 use strict;
  2         6  
  2         59  
6 2     2   9 use warnings;
  2         2  
  2         59  
7              
8 2     2   13 use Carp;
  2         4  
  2         114  
9 2     2   13 use Digest::MD5 ();
  2         11  
  2         40  
10 2     2   10 use File::Spec;
  2         12  
  2         62  
11 2     2   12 use HTTP::Request;
  2         8  
  2         63  
12 2     2   10 use HTTP::Response;
  2         7  
  2         55  
13 2     2   25 use LWP::UserAgent;
  2         4  
  2         83  
14 2     2   11 use JSON;
  2         4  
  2         21  
15              
16             our $VERSION = '0.162';
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   434 use constant HASH_REF => ref {};
  2         5  
  2         286  
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   24 no warnings qw{ redefine };
  2         4  
  2         3171  
40              
41             *LWP::UserAgent::new = sub {
42 3     3   9 my ( $class ) = @_;
43 3   33     69 return bless {
44             json => JSON->new()->utf8()->pretty()->canonical(),
45             }, ref $class || $class;
46 2         174 };
47              
48             *LWP::UserAgent::cookie_jar = sub {
49 55     55   102 my ( $self, $data ) = @_;
50 55         92 my $old = $self->{cookie_jar};
51 55 100       108 if ( $data ) {
52 2 50       9 if ( HASH_REF eq ref $data ) {
53 2         1037 require HTTP::Cookies;
54 2         14056 $data = HTTP::Cookies->new( %{ $data } );
  2         12  
55             }
56 2         46 $self->{cookie_jar} = $data;
57             }
58 55         163 return $old;
59 2         131 };
60              
61             *LWP::UserAgent::env_proxy = sub {
62 2     2   6 return;
63 2         73 };
64              
65             *LWP::UserAgent::get = sub {
66 48     48   86 my ( $self, $url ) = @_;
67 48         101 return _fetch( $self, GET => $url );
68 2         28 };
69              
70             *LWP::UserAgent::head = sub {
71 0     0   0 my ( $self, $url ) = @_;
72 0         0 return _fetch( $self, HEAD => $url );
73 2         31 };
74              
75             *LWP::UserAgent::post = sub {
76 2     2   8 my ( $self, $url ) = @_;
77 2         7 return _fetch( $self, POST => $url );
78 2         22 };
79              
80             *LWP::UserAgent::put = sub {
81 0     0   0 my ( $self, $url ) = @_;
82 0         0 return _fetch( $self, PUT => $url );
83 2         39 };
84              
85             *LWP::UserAgent::request = sub {
86 50     50   82 my ( $self, $rqst ) = @_;
87 50         89 my $method = $rqst->method();
88 50         503 my $url = $rqst->url();
89 50         350 my $path = __file_name_for( $method, $url );
90 50 50       992 $LOG_FILE_NAME
91             and Test::More::diag( "Reading $path\n for $method $url" );
92 50 100       1149 -f $path
93             or return _fail( $rqst, 404, "File $path not found" );
94 49         266 local $/ = undef;
95 2 50   2   12 open my $fh, '<:encoding(utf-8)', $path
  2         4  
  2         12  
  49         1933  
96             or return _fail( $rqst, 500, "Failed to open $path: $!" );
97 49         36761 my $input = <$fh>;
98 49         2101 close $fh;
99 49         99 my @data;
100 49 50       82 eval {
101 49         60 @data = @{ $self->{json}->decode( $input ) };
  49         1055  
102 49         175 1;
103             } or return _fail( $rqst, 500, "Failed to decode content of $path: $@" );
104 49         341 my $resp = HTTP::Response->new( @data[ 0 .. 3 ] );
105 49         8475 $resp->request( $rqst );
106 49 50       556 if ( my $jar = $self->cookie_jar() ) {
107 49         125 $jar->extract_cookies( $resp );
108             }
109 49         18674 return $resp;
110 2         58 };
111              
112             }
113              
114             sub _fail {
115 1     1   5 my ( $rqst, $code, $msg ) = @_;
116 1         5 my $resp = HTTP::Response->new( $code, $msg );
117 1         46 $resp->request( $rqst );
118 1         11 return $resp;
119             }
120              
121             sub _fetch {
122 50     50   114 my ( $self, $method, $url ) = @_;
123 50         246 my $rqst = HTTP::Request->new( $method, $url );
124 50         11517 return $self->request( $rqst );
125             }
126              
127             sub __file_name_for {
128 50     50   74 my ( $method, $url ) = @_;
129 50         367 return File::Spec->catfile(
130             $CANNED_RESPONSE_DIR,
131             Digest::MD5::md5_hex( "$method-$url" ) . '.json',
132             );
133             }
134              
135             1;
136              
137             __END__