File Coverage

inc/Mock/LWP/UserAgent.pm
Criterion Covered Total %
statement 84 103 81.5
branch 7 16 43.7
condition 0 3 0.0
subroutine 21 25 84.0
pod 1 1 100.0
total 113 148 76.3


line stmt bran cond sub pod time code
1             package Mock::LWP::UserAgent;
2              
3 2     2   248939 use 5.006002;
  2         9  
4              
5 2     2   9 use strict;
  2         3  
  2         45  
6 2     2   7 use warnings;
  2         3  
  2         128  
7              
8 2     2   10 use Carp;
  2         3  
  2         194  
9 2     2   570 use Errno qw{ ENOENT };
  2         2054  
  2         240  
10 2     2   14 use File::Spec;
  2         3  
  2         54  
11 2     2   8 use HTTP::Request;
  2         5  
  2         64  
12 2     2   10 use HTTP::Response;
  2         3  
  2         46  
13 2     2   28 use LWP::UserAgent;
  2         3  
  2         44  
14 2     2   7 use JSON;
  2         3  
  2         17  
15              
16             our $VERSION = '0.180';
17              
18             our $CANNED_RESPONSE_FILE;
19              
20 2     2   499 use constant REF_HASH => ref {};
  2         5  
  2         266  
21              
22             sub install_mock {
23              
24 2     2 1 311297 $Astro::SpaceTrack::SPACETRACK_DELAY_SECONDS = 0;
25              
26 2     2   13 no warnings qw{ redefine };
  2         3  
  2         2043  
27              
28             *LWP::UserAgent::new = sub {
29 2     2   6 my ( $class, @arg ) = @_;
30             ### my $self = $class->SUPER::new( @arg );
31 2         5 my $self = bless {}, $class;
32 2         7 $self->{ +__PACKAGE__ } = __load_data();
33 2         17 return $self;
34 2         275 };
35              
36             *LWP::UserAgent::cookie_jar = sub {
37 54     54   129 my ( $self, $data ) = @_;
38 54         99 my $old = $self->{cookie_jar};
39 54 100       170 if ( $data ) {
40 2 50       9 if ( REF_HASH eq ref $data ) {
41 2         1086 require HTTP::Cookies;
42 2         17669 $data = HTTP::Cookies->new( %{ $data } );
  2         13  
43             }
44 2         50 $self->{cookie_jar} = $data;
45             }
46 54         195 return $old;
47 2         117 };
48              
49             *LWP::UserAgent::env_proxy = sub {
50 2     2   4 return;
51 2         81 };
52              
53             *LWP::UserAgent::get = sub {
54 46     46   95 my ( $self, $url ) = @_;
55 46         264 return $self->request( HTTP::Request->new( GET => $url ) );
56 2         32 };
57              
58             *LWP::UserAgent::head = sub {
59 0     0   0 my ( $self, $url ) = @_;
60 0         0 return $self->request( HTTP::Request->new( HEAD => $url ) );
61 2         22 };
62              
63             *LWP::UserAgent::post = sub {
64 2     2   6 my ( $self, $url ) = @_;
65 2         19 return $self->request( HTTP::Request->new( POST => $url ) );
66 2         27 };
67              
68             *LWP::UserAgent::put = sub {
69 0     0   0 my ( $self, $url ) = @_;
70 0         0 return $self->request( HTTP::Request->new( PUT => $url ) );
71 2         23 };
72              
73             *LWP::UserAgent::request = sub {
74 48     48   12168 my ( $self, $rqst ) = @_;
75 48         129 my $method = $rqst->method();
76 48         680 my $url = $rqst->url();
77              
78 48 50       643 my $data = $self->{ +__PACKAGE__ }{data}{$url}{$method}
79             or return _fail( $rqst, 404, "$method $url not found" );
80 48         454 my $resp = HTTP::Response->new( @{ $data } );
  48         230  
81              
82 48         9930 $resp->request( $rqst );
83 48 50       628 if ( my $jar = $self->cookie_jar() ) {
84 48         177 $jar->extract_cookies( $resp );
85             }
86 48         22771 return $resp;
87 2         14 };
88             }
89              
90             sub _fail {
91 0     0   0 my ( $rqst, $code, $msg ) = @_;
92 0         0 my $resp = HTTP::Response->new( $code, $msg );
93 0         0 $resp->request( $rqst );
94 0         0 return $resp;
95             }
96              
97             sub __load_data {
98 2     2   4 my ( %arg ) = @_;
99 2 50       68 my $path = defined $CANNED_RESPONSE_FILE ?
100             $CANNED_RESPONSE_FILE :
101             File::Spec->catfile( qw{ t data Mock-LWP-UserAgent resp.json } );
102 2         38 my $json = JSON->new();
103 2         5 my $data;
104 2 50 0 2   1665 if ( open my $fh, '<:encoding(utf-8)', $path ) {
  2 0       35  
  2         10  
  2         107  
105 2         2705 local $/ = undef; # Slurp mode
106 2         144 $data = $json->decode( scalar <$fh> );
107 2         3721 close $fh;
108             } elsif ( $arg{optional} && $! == ENOENT ) {
109 0         0 $data = {};
110             } else {
111 0         0 croak "Failed to open $path: $!";
112             }
113             return +{
114 2         55 path => $path,
115             data => $data,
116             };
117             }
118              
119             sub __modify_data {
120 0     0     my ( $data, $url, $method, $resp ) = @_;
121 0           $data->{data}{$url}{$method} = $resp;
122 0           my $path = $data->{path};
123 0           my $json = JSON->new()->pretty()->canonical();
124 0 0         open my $fh, '>:encoding(utf-8)', $path
125             or croak "Unable to modify $path: $!";
126 0           print { $fh } $json->encode( $data->{data} );
  0            
127 0           close $fh;
128 0           return;
129             }
130              
131             1;
132              
133             __END__