5 use POSIX qw(strftime);
8 use Business::OnlinePayment;
11 "to test set environment variables:"
12 . " (required) PNP_ACCOUNT, PNP_PASSWORD, PNP_CARD,"
13 . " PNP_CVV2, PNP_EXP, PNP_CARD_NAME, PNP_CARD_ADDRESS,"
14 . " PNP_CARD_CITY, PNP_CARD_STATE, PNP_CARD_ZIP, and PNP_DO_LIVE ";
17 ( $ENV{"PNP_ACCOUNT"} && $ENV{"PNP_PASSWORD"} &&
18 $ENV{"PNP_CARD"} && $ENV{"PNP_CVV2"} &&
19 $ENV{"PNP_EXP"} && $ENV{"PNP_CARD_NAME"} &&
20 $ENV{"PNP_CARD_ADDRESS"} && $ENV{"PNP_CARD_CITY"} &&
21 $ENV{"PNP_CARD_STATE"} && $ENV{"PNP_CARD_ZIP"} &&
25 : ( skip_all => $runinfo )
33 login => $ENV{"PNP_ACCOUNT"},
34 password => $ENV{"PNP_PASSWORD"},
35 action => "Normal Authorization",
37 description => "Business::OnlinePayment::PlugnPay live test",
38 card_number => $ENV{"PNP_CARD"},
39 cvv2 => $ENV{"PNP_CVV2"},
40 expiration => $ENV{"PNP_EXP"},
42 invoice_number => "LiveTest",
43 name => $ENV{"PNP_CARD_NAME"},
44 address => $ENV{"PNP_CARD_ADDRESS"},
45 city => $ENV{"PNP_CARD_CITY"},
46 state => $ENV{"PNP_CARD_STATE"},
47 zip => $ENV{"PNP_CARD_ZIP"},
51 my $voidable_amount = 0;
52 my $credit_amount = 0;
54 { # valid card number test
55 my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
56 $tx->content(%content);
59 desc => "valid card_number",
61 result_code => "A", # wtf?
62 authorization => qr/^\w{6}$/,
65 order_number => qr/^([0-9]{19})$/,
67 $voidable = $tx->order_number if $tx->is_success;
68 $voidable_amount = $content{amount} if $tx->is_success;
71 { # invalid card number test
73 my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
74 $tx->content( %content, card_number => "4111111111111112" );
77 desc => "invalid card_number",
80 authorization => qr/^$/,
82 cvv2_response => undef,
83 order_number => qr/^([0-9]{19})$/,
88 { # avs_code() / AVSZIP and AVSADDR tests
90 my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
92 $tx->content( %content, "address" => "500 Any street" );
95 desc => "AVSADDR=N,AVSZIP=Y",
98 authorization => qr/^\w{6}$/,
100 cvv2_response => "M",
101 order_number => qr/^([0-9]{19})$/,
103 $credit_amount += $content{amount} if $tx->is_success;
105 $tx = new Business::OnlinePayment( "PlugnPay", %opts );
106 $tx->content( %content, "zip" => "99999" );
109 desc => "AVSADDR=Y,AVSZIP=N",
112 authorization => qr/^\w{6}$/,
114 cvv2_response => "M",
115 order_number => qr/^([0-9]{19})$/,
117 $credit_amount += $content{amount} if $tx->is_success;
119 $tx = new Business::OnlinePayment( "PlugnPay", %opts );
120 $tx->content( %content, "address" => "500 Any street", "zip" => "99999" );
123 desc => "AVSADDR=N,AVSZIP=N",
126 authorization => qr/^\w{6}$/,
128 cvv2_response => "M",
129 order_number => qr/^([0-9]{19})$/,
131 $credit_amount += $content{amount} if $tx->is_success;
134 { # cvv2_response() / CVV2MATCH
136 my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
138 $tx->content( %content, "cvv2" => $content{cvv2}+1 );
141 desc => "wrong cvv2",
143 result_code => "P02", # configurable?
144 authorization => qr/^\w{6}$/,
146 cvv2_response => "N",
147 order_number => qr/^([0-9]{19})$/,
149 #$credit_amount += $content{amount} if $tx->is_success;
155 #skip "Void tests require account with void capability", 6;
157 my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
158 $tx->content( %content, 'action' => "Void",
159 'order_number' => $voidable,
165 result_code => undef,
166 authorization => qr/^$/,
168 cvv2_response => undef,
169 order_number => qr/^([0-9]{19})$/,
171 $credit_amount += $voidable_amount unless $tx->is_success;
174 SKIP: { # refund test
176 #skip "Refund tests require account with refund capability", 6;
178 my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
179 $tx->content( %content, 'action' => "Credit",
180 'amount' => sprintf("%.2f", $credit_amount),
184 desc => "refund/credit",
186 result_code => undef,
187 authorization => qr/^$/,
189 cvv2_response => undef,
190 order_number => qr/^([0-9]{19})$/,
200 is( $tx->is_success, $o{is_success}, "$o{desc}: " . tx_info($tx) );
201 is( $tx->result_code, $o{result_code}, "result_code(): RESULT" );
202 like( $tx->authorization, $o{authorization}, "authorization() / AUTHCODE" );
203 is( $tx->avs_code, $o{avs_code}, "avs_code() / AVSADDR and AVSZIP" );
204 is( $tx->cvv2_response, $o{cvv2_response}, "cvv2_response() / CVV2MATCH" );
205 like( $tx->order_number, $o{order_number}, "order_number() / PNREF" );
211 no warnings 'uninitialized';
215 "is_success(", $tx->is_success, ")",
216 " order_number(", $tx->order_number, ")",
217 " result_code(", $tx->result_code, ")",
218 " auth_info(", $tx->authorization, ")",
219 " avs_code(", $tx->avs_code, ")",
220 " cvv2_response(", $tx->cvv2_response, ")",