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   177079 use 5.006002;
  2         6  
4              
5 2     2   7 use strict;
  2         2  
  2         39  
6 2     2   6 use warnings;
  2         8  
  2         120  
7              
8 2     2   16 use Carp;
  2         3  
  2         195  
9 2     2   361 use Errno qw{ ENOENT };
  2         1167  
  2         234  
10 2     2   13 use File::Spec;
  2         3  
  2         60  
11 2     2   7 use HTTP::Request;
  2         5  
  2         40  
12 2     2   6 use HTTP::Response;
  2         3  
  2         31  
13 2     2   31 use LWP::UserAgent;
  2         5  
  2         77  
14 2     2   8 use JSON;
  2         7  
  2         16  
15              
16             our $VERSION = '0.180_03';
17              
18             our $CANNED_RESPONSE_FILE;
19              
20 2     2   290 use constant REF_HASH => ref {};
  2         2  
  2         170  
21              
22             sub install_mock {
23              
24 2     2 1 167739 $Astro::SpaceTrack::SPACETRACK_DELAY_SECONDS = 0;
25              
26 2     2   28 no warnings qw{ redefine };
  2         3  
  2         1707  
27              
28             *LWP::UserAgent::new = sub {
29 2     2   5 my ( $class, @arg ) = @_;
30             ### my $self = $class->SUPER::new( @arg );
31 2         4 my $self = bless {}, $class;
32 2         6 $self->{ +__PACKAGE__ } = __load_data();
33 2         10 return $self;
34 2         170 };
35              
36             *LWP::UserAgent::cookie_jar = sub {
37 54     54   84 my ( $self, $data ) = @_;
38 54         53 my $old = $self->{cookie_jar};
39 54 100       91 if ( $data ) {
40 2 50       8 if ( REF_HASH eq ref $data ) {
41 2         897 require HTTP::Cookies;
42 2         13859 $data = HTTP::Cookies->new( %{ $data } );
  2         10  
43             }
44 2         39 $self->{cookie_jar} = $data;
45             }
46 54         114 return $old;
47 2         76 };
48              
49             *LWP::UserAgent::env_proxy = sub {
50 2     2   4 return;
51 2         71 };
52              
53             *LWP::UserAgent::get = sub {
54 46     46   60 my ( $self, $url ) = @_;
55 46         186 return $self->request( HTTP::Request->new( GET => $url ) );
56 2         37 };
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         73 };
62              
63             *LWP::UserAgent::post = sub {
64 2     2   5 my ( $self, $url ) = @_;
65 2         18 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         19 };
72              
73             *LWP::UserAgent::request = sub {
74 48     48   12186 my ( $self, $rqst ) = @_;
75 48         68 my $method = $rqst->method();
76 48         431 my $url = $rqst->url();
77              
78 48 50       379 my $data = $self->{ +__PACKAGE__ }{data}{$url}{$method}
79             or return _fail( $rqst, 404, "$method $url not found" );
80 48         297 my $resp = HTTP::Response->new( @{ $data } );
  48         179  
81              
82 48         6319 $resp->request( $rqst );
83 48 50       336 if ( my $jar = $self->cookie_jar() ) {
84 48         117 $jar->extract_cookies( $resp );
85             }
86 48         13560 return $resp;
87 2         10 };
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   2 my ( %arg ) = @_;
99 2 50       40 my $path = defined $CANNED_RESPONSE_FILE ?
100             $CANNED_RESPONSE_FILE :
101             File::Spec->catfile( qw{ t data Mock-LWP-UserAgent resp.json } );
102 2         21 my $json = JSON->new();
103 2         7 my $data;
104 2 50 0 2   1324 if ( open my $fh, '<:encoding(utf-8)', $path ) {
  2 0       27  
  2         29  
  2         119  
105 2         2406 local $/ = undef; # Slurp mode
106 2         141 $data = $json->decode( scalar <$fh> );
107 2         2677 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         36 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__