ripped out a bunch of hastily-conceived ->param BS more appropriate for implementatio...
[Business-OnlinePayment-PayflowPro.git] / t / credit_card.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use POSIX qw(strftime);
6 use Test::More;
7
8 use Business::OnlinePayment;
9
10 my $runinfo =
11     "to test set environment variables:"
12   . " (required) PFPRO_VENDOR PFPRO_USER PFPRO_PWD and CLIENTCERTID (for X-VPS-VIT-CLIENT-CERTIFICATION-ID); "
13   . " (optional) PFPRO_PARTNER PFPRO_CERT_PATH";
14
15 plan(
16       ( $ENV{"PFPRO_USER"} && $ENV{"PFPRO_VENDOR"} && $ENV{"PFPRO_PWD"} )
17     ? ( tests => 56 )
18     : ( skip_all => $runinfo )
19 );
20
21 my %opts = (
22     "debug"   => 0,
23     "vendor"  => $ENV{PFPRO_VENDOR},
24     "partner" => $ENV{PFPRO_PARTNER} || "verisign",
25     "client_certification_id" => $ENV{CLIENTCERTID},
26 );
27
28 my %content = (
29     login       => $ENV{"PFPRO_USER"},
30     password    => $ENV{"PFPRO_PWD"},
31     action      => "Normal Authorization",
32     type        => "VISA",
33     description => "Business::OnlinePayment::PayflowPro test",
34     card_number => "4111111111111111",
35     cvv2        => "123",
36     expiration  => "12/" . strftime( "%y", localtime ),
37     amount      => "0.01",
38     first_name  => "Tofu",
39     last_name   => "Beast",
40     email       => 'ivan-payflowpro@420.am',
41     address     => "123 Anystreet",
42     city        => "Anywhere",
43     state       => "GA",
44     zip         => "30004",
45     country     => "US",
46 );
47
48 {    # valid card number test
49     my $tx = new Business::OnlinePayment( "PayflowPro", %opts );
50     $tx->content(%content);
51     tx_check(
52         $tx,
53         desc          => "valid card_number",
54         is_success    => 1,
55         result_code   => 0,
56         error_message => "Approved",
57         authorization => "010101",
58         avs_code      => "Y",
59         cvv2_response => "Y",
60     );
61 }
62
63 {    # invalid card number test
64
65     my $tx = new Business::OnlinePayment( "PayflowPro", %opts );
66     $tx->content( %content, card_number => "4111111111111112" );
67     tx_check(
68         $tx,
69         desc          => "invalid card_number",
70         is_success    => 0,
71         result_code   => 23,
72         error_message => "Invalid account number",
73         authorization => undef,
74         avs_code      => undef,
75         cvv2_response => undef,
76     );
77 }
78
79
80 SKIP: {    # avs_code() / AVSZIP and AVSADDR tests
81
82     skip "AVS tests broken", 28;
83
84     my $tx = new Business::OnlinePayment( "PayflowPro", %opts );
85
86     # IF first 3 chars of STREET <= 334 and >= 666 THEN AVSADDR == "N"
87     $tx->content( %content, "address" => "500 Any street" );
88     tx_check(
89         $tx,
90         desc          => "AVSADDR=N,AVSZIP=Y",
91         is_success    => 0,
92         result_code   => 126,
93         error_message => "Under review by Fraud Service",
94         authorization => "010101",
95         avs_code      => "Z",
96         cvv2_response => "Y",
97     );
98
99     # IF first 3 chars of STREET >= 667 THEN AVSADDR == "X" (and AVSZIP="X")
100     $tx = new Business::OnlinePayment( "PayflowPro", %opts );
101     $tx->content( %content, "address" => "700 Any street" );
102     tx_check(
103         $tx,
104         desc          => "AVSADDR=X,AVSZIP=X",
105         is_success    => 1,
106         result_code   => 0,
107         error_message => "Approved",
108         authorization => "010101",
109         avs_code      => "",
110         cvv2_response => "Y",
111     );
112
113 #    # IF ZIP <= 50001 and >= 99999 THEN AVSZIP == "N"
114     $tx = new Business::OnlinePayment( "PayflowPro", %opts );
115     $tx->content( %content, "zip" => "99999" );
116     tx_check(
117         $tx,
118         desc          => "AVSADDR=Y,AVSZIP=N",
119         is_success    => 0,
120         result_code   => 126,
121         error_message => "Under review by Fraud Service",
122         authorization => "010101",
123         avs_code      => "A",
124         cvv2_response => "Y",
125     );
126
127     # Both AVSADDR and AVSZIP == "N"
128     $tx = new Business::OnlinePayment( "PayflowPro", %opts );
129     $tx->content( %content, "address" => "500 Any street", "zip" => "99999" );
130     tx_check(
131         $tx,
132         desc          => "AVSADDR=N,AVSZIP=N",
133         is_success    => 0,
134         result_code   => 126,
135         error_message => "Under review by Fraud Service",
136         authorization => "010101",
137         avs_code      => "N",
138         cvv2_response => "Y",
139     );
140 }
141
142 SKIP: {    # cvv2_response() / CVV2MATCH
143
144     skip "CVV2 tests broken", 14;
145
146     my $tx = new Business::OnlinePayment( "PayflowPro", %opts );
147
148     # IF CVV2 >= 301 and <= 600 THEN CVV2MATCH == "N"
149     $tx->content( %content, "cvv2" => "301" );
150     tx_check(
151         $tx,
152         desc          => "cvv2(301)",
153         is_success    => 0,
154         result_code   => 126,
155         error_message => "Under review by Fraud Service",
156         authorization => "010101",
157         avs_code      => "Y",
158         cvv2_response => "N",
159     );
160
161     # IF CVV2 >= 601 THEN CVV2MATCH == "X"
162     $tx = new Business::OnlinePayment( "PayflowPro", %opts );
163     $tx->content( %content, "cvv2" => "601" );
164     tx_check(
165         $tx,
166         desc          => "cvv2(601)",
167         is_success    => 0,
168         result_code   => 126,
169         error_message => "Under review by Fraud Service",
170         authorization => "010101",
171         avs_code      => "Y",
172         cvv2_response => "X",
173     );
174 }
175
176 sub tx_check {
177     my $tx = shift;
178     my %o  = @_;
179
180     $tx->test_transaction(1);
181     $tx->submit;
182
183     is( $tx->is_success,    $o{is_success},    "$o{desc}: " . tx_info($tx) );
184     is( $tx->result_code,   $o{result_code},   "result_code(): RESULT" );
185     is( $tx->error_message, $o{error_message}, "error_message() / RESPMSG" );
186     is( $tx->authorization, $o{authorization}, "authorization() / AUTHCODE" );
187     is( $tx->avs_code,  $o{avs_code},  "avs_code() / AVSADDR and AVSZIP" );
188     is( $tx->cvv2_response, $o{cvv2_response}, "cvv2_response() / CVV2MATCH" );
189     like( $tx->order_number, qr/^\w{12}/, "order_number() / PNREF" );
190 }
191
192 sub tx_info {
193     my $tx = shift;
194
195     no warnings 'uninitialized';
196
197     return (
198         join( "",
199             "is_success(",     $tx->is_success,    ")",
200             " order_number(",  $tx->order_number,  ")",
201             " error_message(", $tx->error_message, ")",
202             " result_code(",   $tx->result_code,   ")",
203             " auth_info(",     $tx->authorization, ")",
204             " avs_code(",      $tx->avs_code,      ")",
205             " cvv2_response(", $tx->cvv2_response, ")",
206         )
207     );
208 }