File Coverage

blib/lib/Plack/Test/Agent.pm
Criterion Covered Total %
statement 81 84 96.4
branch 15 18 83.3
condition 1 2 50.0
subroutine 20 21 95.2
pod 7 7 100.0
total 124 132 93.9


line stmt bran cond sub pod time code
1             package Plack::Test::Agent;
2             # git description: 1.20111011-17-ge352a6a
3             $Plack::Test::Agent::VERSION = '1.3';
4             # ABSTRACT: OO interface for testing low-level Plack/PSGI apps
5              
6 8     8   197136 use strict;
  8         15  
  8         286  
7 8     8   31 use warnings;
  8         10  
  8         202  
8              
9 8     8   3758 use Test::TCP;
  8         442947  
  8         464  
10 8     8   3519 use Plack::Loader;
  8         39642  
  8         224  
11 8     8   4246 use HTTP::Response;
  8         140925  
  8         304  
12 8     8   4060 use HTTP::Message::PSGI;
  8         12061  
  8         449  
13 8     8   4263 use HTTP::Request::Common;
  8         25957  
  8         687  
14 8     8   5277 use Test::WWW::Mechanize;
  8         910865  
  8         370  
15              
16 8     8   4662 use Plack::Util::Accessor qw( app host port server ua );
  8         1926  
  8         57  
17              
18             sub new
19             {
20 10     10 1 8930 my ($class, %args) = @_;
21              
22 10         35 my $self = bless {}, $class;
23              
24 10         86 $self->app( delete $args{app} );
25 10         150 $self->ua( delete $args{ua} );
26 10   50     120 $self->host( delete $args{host} || 'localhost' );
27 10         74 $self->port( delete $args{port} );
28              
29 10 100       78 $self->start_server( delete $args{server} ) if $args{server};
30              
31 10         159 return $self;
32             }
33              
34             sub start_server
35             {
36 6     6 1 16 my ($self, $server_class) = @_;
37              
38 6         20 my $app = $self->app;
39 6         42 my $host = $self->host;
40              
41             my $server = Test::TCP->new(
42             code => sub
43             {
44 0     0   0 my $port = shift;
45 0         0 my %args = ( host => $host, port => $port );
46 0 0       0 return $server_class
47             ? Plack::Loader->load( $server_class, %args )->run( $app )
48             : Plack::Loader->auto( %args )->run( $app );
49             },
50 6         96 );
51              
52 6         162787 $self->port( $server->port );
53 6 50       188 $self->ua( $self->get_mech ) unless $self->ua;
54 6         64 $self->server( $server );
55             }
56              
57             sub execute_request
58             {
59 14     14 1 27 my ($self, $req) = @_;
60              
61 14 100       48 my $res = $self->server
62             ? $self->ua->request( $req )
63             : HTTP::Response->from_psgi( $self->app->( $req->to_psgi ) );
64              
65 14         153303 $res->request( $req );
66 14         279 return $res;
67             }
68              
69             sub get {
70 12     12 1 16630 my ( $self, $uri, @args ) = @_;
71 12         46 my $req = GET $self->normalize_uri($uri), @args;
72 12         1448 return $self->execute_request($req);
73             }
74              
75             sub post
76             {
77 2     2 1 10238 my ($self, $uri, @args) = @_;
78 2         9 my $req = POST $self->normalize_uri($uri), @args;
79 2         703 return $self->execute_request( $req );
80             }
81              
82             sub normalize_uri
83             {
84 22     22 1 71 my ($self, $uri) = @_;
85 22         316 my $normalized = URI->new( $uri );
86 22         42439 my $port = $self->port;
87              
88 22 100       267 $normalized->scheme( 'http' ) unless $normalized->scheme;
89 22 100       26073 $normalized->host( 'localhost' ) unless $normalized->host;
90 22 100       2161 $normalized->port( $port ) if $port;
91              
92 22         873 return $normalized;
93             }
94              
95             sub get_mech
96             {
97 8     8 1 3012 my $self = shift;
98 8         52 return Test::WWW::Mechanize::Bound->new(
99             bound_uri => $self->normalize_uri( '/' )
100             );
101             }
102              
103             package
104             Test::WWW::Mechanize::Bound;
105              
106 8     8   4183 use parent 'Test::WWW::Mechanize';
  8         13  
  8         57  
107              
108             sub new
109             {
110 8     8   51 my ($class, %args) = @_;
111 8         26 my $bound_uri = delete $args{bound_uri};
112 8         175 my $self = $class->SUPER::new( %args );
113 8         74643 $self->bound_uri( $bound_uri );
114 8         80 return $self;
115             }
116              
117             sub bound_uri
118             {
119 19     19   158 my ($self, $base_uri) = @_;
120 19 100       116 $self->_elem( bound_uri => $base_uri ) if @_ == 2;
121 19         104 return $self->_elem( 'bound_uri' );
122             }
123              
124             sub prepare_request
125             {
126 11     11   59295 my $self = shift;
127 11         22 my ($req) = @_;
128 11         35 my $uri = $req->uri;
129 11         70 my $base = $self->bound_uri;
130              
131 11 100       88 unless ($uri->scheme)
132             {
133 2         28 $uri->scheme( $base->scheme );
134 2         116 $uri->host( $base->host );
135 2         155 $uri->port( $base->port );
136             }
137 11         333 return $self->SUPER::prepare_request( @_ );
138             }
139              
140             1;
141              
142             __END__