File Coverage

blib/lib/WebService/PayPal/PaymentsAdvanced/Mocker/SilentPOST.pm
Criterion Covered Total %
statement 48 48 100.0
branch 6 6 100.0
condition n/a
subroutine 11 11 100.0
pod 4 4 100.0
total 69 69 100.0


line stmt bran cond sub pod time code
1             package WebService::PayPal::PaymentsAdvanced::Mocker::SilentPOST;
2              
3 3     3   304937 use Moo;
  3         34537  
  3         15  
4              
5 3     3   5877 use namespace::autoclean;
  3         39340  
  3         12  
6              
7             our $VERSION = '0.000026';
8              
9 3     3   2100 use Types::Common::String qw( NonEmptyStr );
  3         363328  
  3         37  
10 3     3   1636 use Types::Standard qw( InstanceOf );
  3         7  
  3         19  
11 3     3   3445 use WebService::PayPal::PaymentsAdvanced::Mocker::Helper;
  3         15  
  3         2637  
12              
13             has _helper => (
14             is => 'lazy',
15             isa =>
16             InstanceOf ['WebService::PayPal::PaymentsAdvanced::Mocker::Helper'],
17             default =>
18             sub { WebService::PayPal::PaymentsAdvanced::Mocker::Helper->new },
19             );
20              
21             has _secure_token_id => (
22             is => 'ro',
23             isa => NonEmptyStr,
24             required => 1,
25             init_arg => 'secure_token_id',
26             );
27              
28             sub paypal_success {
29 2     2 1 2535 my $self = shift;
30 2         7 my %args = @_;
31              
32 2         73 return $self->_massage_args(
33             {
34             ADDRESSTOSHIP => '1 Main St',
35             AMT => '50.00',
36             AVSADDR => 'Y',
37             AVSDATA => 'YYY',
38             AVSZIP => 'Y',
39             BAID => 'XXX',
40             BILLTOCOUNTRY => 'US',
41             BILLTOEMAIL => 'paypal_buyer@example.com',
42             BILLTOFIRSTNAME => 'Test',
43             BILLTOLASTNAME => 'Buyer',
44             BILLTONAME => 'Test Buyer',
45             CITYTOSHIP => 'San Jose',
46             CORRELATIONID => 'XXX',
47             COUNTRY => 'US',
48             COUNTRYTOSHIP => 'US',
49             EMAIL => 'paypal_buyer@example.com',
50             FIRSTNAME => 'Test',
51             INVNUM => 61,
52             INVOICE => 61,
53             LASTNAME => 'Buyer',
54             METHOD => 'P',
55             NAME => 'Test Buyer',
56             NAMETOSHIP => 'Test Buyer',
57             PAYERID => 'R8RAGUNASE6VA',
58             PAYMENTTYPE => 'instant',
59             PENDINGREASON => 'authorization',
60             PNREF => 'XXX',
61             PPREF => 'XXX',
62             RESPMSG => 'Approved',
63             RESULT => '0',
64             SECURETOKEN => 'XXX',
65             SHIPTOCITY => 'San Jose',
66             SHIPTOCOUNTRY => 'US',
67             SHIPTOSTATE => 'CA',
68             SHIPTOSTREET => '1 Main St',
69             SHIPTOZIP => 95131,
70             STATETOSHIP => 'CA',
71             TAX => '0.00',
72             TENDER => 'P',
73             TOKEN => 'XXX',
74             TRANSTIME => 'XXX',
75             TRXTYPE => 'A',
76             TYPE => 'A',
77             ZIPTOSHIP => 95131,
78             },
79             \%args,
80             );
81             }
82              
83             sub credit_card_success {
84 14     14 1 3466 my $self = shift;
85 14         37 my %args = @_;
86              
87 14         311 return $self->_massage_args(
88             {
89             ACCT => 4482,
90             AMT => 50.00,
91             AUTHCODE => 111111,
92             AVSADDR => 'Y',
93             AVSDATA => 'YYY',
94             AVSZIP => 'Y',
95             BILLTOCOUNTRY => 'US',
96             CARDTYPE => 3,
97             CORRELATIONID => 'fb36aaa2675e',
98             COUNTRY => 'US',
99             COUNTRYTOSHIP => 'US',
100             CVV2MATCH => 'Y',
101             EMAILTOSHIP => q{},
102             EXPDATE => 1221,
103             IAVS => 'N',
104             INVNUM => 69,
105             INVOICE => 69,
106             LASTNAME => 'NotProvided',
107             METHOD => 'CC',
108             PNREF => 'XXX',
109             PPREF => 'XXX',
110             PROCAVS => 'X',
111             PROCCVV2 => 'M',
112             RESPMSG => 'Approved',
113             RESULT => 0,
114             SECURETOKEN => '9dWh93jXhkkOi4C3INWBAWgxN',
115             SECURETOKENID => 'XXX',
116             SHIPTOCOUNTRY => 'US',
117             TAX => 0.00,
118             TENDER => 'CC',
119             TRANSTIME => '2015-08-27 15:01:42',
120             TRXTYPE => 'A',
121             TYPE => 'A',
122             },
123             \%args
124             );
125             }
126              
127             sub credit_card_duplicate_invoice_id {
128 1     1 1 573 my $self = shift;
129 1         3 my %args = @_;
130              
131 1         17 return $self->_massage_args(
132             {
133             ACCT => 4482,
134             AMT => '50.00',
135             AVSDATA => 'XXN',
136             BILLTOCOUNTRY => 'US',
137             CARDTYPE => 3,
138             COUNTRY => 'US',
139             COUNTRYTOSHIP => 'US',
140             EMAILTOSHIP => q{},
141             EXPDATE => 1221,
142             HOSTCODE => 10536,
143             INVNUM => 64,
144             INVOICE => 64,
145             LASTNAME => 'NotProvided',
146             METHOD => 'CC',
147             PNREF => 'XXX',
148             RESULT => 30,
149             SECURETOKEN => 'XXX',
150             SHIPTOCOUNTRY => 'US',
151             TAX => '0.00',
152             TENDER => 'CC',
153             TRANSTIME => 'XXX',
154             TRXTYPE => 'A',
155             TYPE => 'A',
156             RESPMSG =>
157             'Duplicate trans: 10536-The transaction was refused as a result of a duplicate invoice ID supplied. Attempt with a new invoice ID',
158             },
159             \%args
160             );
161             }
162              
163             sub credit_card_auth_verification_success {
164 1     1 1 2239 my $self = shift;
165 1         4 my %args = @_;
166              
167 1         28 return $self->_massage_args(
168             \%args,
169             {
170             ACCT => 5800,
171             AMT => '0.00',
172             AUTHCODE => 111111,
173             AVSADDR => 'Y',
174             AVSDATA => 'YYY',
175             AVSZIP => 'Y',
176             BILLTOCOUNTRY => 'US',
177             CARDTYPE => 0,
178             CORRELATIONID => 'dad41bc8ed27',
179             COUNTRY => 'US',
180             COUNTRYTOSHIP => 'US',
181             CVV2MATCH => 'Y',
182             EMAILTOSHIP => q{},
183             EXPDATE => 1221,
184             HOSTCODE => 10574,
185             IAVS => 'N',
186             LASTNAME => 'NotProvided',
187             METHOD => 'CC',
188             PNREF => 'XXX',
189             PPREF => 'XXX',
190             PROCAVS => 'X',
191             PROCCVV2 => 'M',
192             RESPMSG =>
193             'Verified => 10574-This card authorization verification is not a payment transaction.',
194             SECURETOKEN => 'XXX',
195             RESULT => 0,
196             SHIPTOCOUNTRY => 'US',
197             TAX => '0.00',
198             TENDER => 'CC',
199             TRANSTIME => 'XXX',
200             TRXTYPE => 'A',
201             TYPE => 'A',
202             },
203             );
204             }
205              
206             sub _massage_args {
207 18     18   46 my $self = shift;
208 18         36 my $default_args = shift;
209 18         36 my $user_args = shift;
210              
211 18         54 $default_args = $self->_set_defaults($default_args);
212              
213 18         39 my $args = { %{$default_args}, %{$user_args} };
  18         125  
  18         212  
214 18 100       98 if ( $self->_secure_token_id eq 'NOPPREF' ) {
215 12         23 delete $args->{PPREF};
216             }
217 18         277 return $args;
218             }
219              
220             sub _set_defaults {
221 18     18   36 my $self = shift;
222 18         42 my $defaults = shift;
223              
224 18         92 my %method_for = (
225             BAID => 'baid',
226             CORRELATIONID => 'correlationid',
227             PNREF => 'pnref',
228             PPREF => 'ppref',
229             TRANSTIME => 'transtime',
230             SECURETOKEN => 'secure_token',
231             TOKEN => 'token',
232             );
233              
234 18         75 for my $key ( keys %method_for ) {
235 126 100       59150 if ( exists $defaults->{$key} ) {
236 87         177 my $method = $method_for{$key};
237 87         1728 $defaults->{$key} = $self->_helper->$method;
238             }
239             }
240              
241 18         1708 $defaults->{SECURETOKENID} = $self->_secure_token_id;
242 18 100       70 if ( $self->_secure_token_id eq 'NOPPREF' ) {
243 12         30 delete $defaults->{PPREF};
244             }
245 18         66 return $defaults;
246             }
247              
248             1;
249              
250             =pod
251              
252             =head1 NAME
253              
254             WebService::PayPal::PaymentsAdvanced::Mocker::SilentPOST - Easily mock Silent POST transactions
255              
256             =head1 VERSION
257              
258             version 0.000026
259              
260             =head1 SYNOPSIS
261              
262             use LWP::UserAgent;
263             use WebService::PayPal::PaymentsAdvanced::Mocker::SilentPOST;
264              
265             my $mocker
266             = WebService::PayPal::PaymentsAdvanced::Mocker::SilentPOST->new();
267              
268             my $ua = LWP::UserAgent->new(...);
269             $ua->post(
270             '/silent-post-url',
271             $mocker->paypal_success,
272             'X-Forwarded-For' => '173.0.81.65'
273             );
274              
275             =head2 paypal_success
276              
277             Returns a C<HashRef> of POST params which can be used to mock a successful
278             PayPal authorization.
279              
280             =head2 credit_card_success
281              
282             Returns a C<HashRef> of POST params which can be used to mock a successful
283             credit card authorization.
284              
285             =head2 credit_card_auth_verification_success
286              
287             Returns a C<HashRef> of POST params which can be used to mock a successful zero
288             dollar credit card authorization.
289              
290             =head2 credit_card_duplicate_invoice_id
291              
292             Returns a C<HashRef> of POST params which can be used to mock a unsuccessful
293             credit card payment. In this case you've sent an invoice ID which is already
294             attached to a previously successful transaction.
295              
296             =head1 DESCRIPTION
297              
298             Use these methods to get a HashRef of params which you can POST to your
299             application's silent POST endpoint. Keep in mind that if you have IP
300             validation enabled you'll either need to spoof the originating IP of the
301             request or disable the IP validation in test mode. I'd encourage you to do
302             the former, if at all possible.
303              
304             =head1 AUTHOR
305              
306             Olaf Alders <olaf@wundercounter.com>
307              
308             =head1 COPYRIGHT AND LICENSE
309              
310             This software is copyright (c) 2020 by MaxMind, Inc.
311              
312             This is free software; you can redistribute it and/or modify it under
313             the same terms as the Perl 5 programming language system itself.
314              
315             =cut
316              
317             __END__
318              
319             # ABSTRACT: Easily mock Silent POST transactions
320