efe6a26b7426958fe87b053b3621a6f2dde0c2c6
[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     ( $ENV{PFPRO_CERT_PATH} ? ( "cert_path" => $ENV{PFPRO_CERT_PATH} ) : () ),
26     (
27         $ENV{CLIENTCERTID} ? (
28             headers => {
29                 "X-VPS-VIT-CLIENT-CERTIFICATION-ID" => $ENV{CLIENTCERTID},
30
31                 # "X-VPS-REQUEST-ID" => $self->request_id(),
32                 # "X-VPS-CLIENT-TIMEOUT" => , # default 45 seconds
33                 # "X-VPS-VIT-CLIENT-DURATION" => , # commit request
34             }
35           )
36         : ()
37     ),
38 );
39
40 my %content = (
41     login       => $ENV{"PFPRO_USER"},
42     password    => $ENV{"PFPRO_PWD"},
43     action      => "Normal Authorization",
44     type        => "VISA",
45     description => "Business::OnlinePayment::PayflowPro test",
46     card_number => "4111111111111111",
47     cvv2        => "123",
48     expiration  => "12/" . strftime( "%y", localtime ),
49     amount      => "0.01",
50     first_name  => "Tofu",
51     last_name   => "Beast",
52     email       => 'ivan-payflowpro@420.am',
53     address     => "123 Anystreet",
54     city        => "Anywhere",
55     state       => "GA",
56     zip         => "30004",
57     country     => "US",
58 );
59
60 {    # valid card number test
61     my $tx = new Business::OnlinePayment( "PayflowPro", %opts );
62     $tx->content(%content);
63     tx_check(
64         $tx,
65         desc          => "valid card_number",
66         is_success    => 1,
67         result_code   => 0,
68         error_message => "Approved",
69         authorization => "010101",
70         avs_code      => "Y",
71         cvv2_code     => "Y",
72     );
73 }
74
75 {    # invalid card number test
76     my $tx = new Business::OnlinePayment( "PayflowPro", %opts );
77     $tx->content( %content, card_number => "4111111111111112" );
78     tx_check(
79         $tx,
80         desc          => "invalid card_number",
81         is_success    => 0,
82         result_code   => 23,
83         error_message => "Invalid account number",
84         authorization => undef,
85         avs_code      => undef,
86         cvv2_code     => undef,
87     );
88 }
89
90 {    # avs_code() / AVSZIP and AVSADDR tests
91     my $tx = new Business::OnlinePayment( "PayflowPro", %opts );
92
93     # IF first 3 chars of STREET <= 334 and >= 666 THEN AVSADDR == "N"
94     $tx->content( %content, "address" => "500 Any street" );
95     tx_check(
96         $tx,
97         desc          => "AVSADDR=N,AVSZIP=Y",
98         is_success    => 0,
99         result_code   => 126,
100         error_message => "Under review by Fraud Service",
101         authorization => "010101",
102         avs_code      => "Z",
103         cvv2_code     => "Y",
104     );
105
106     # IF first 3 chars of STREET >= 667 THEN AVSADDR == "X" (and AVSZIP="X")
107     $tx = new Business::OnlinePayment( "PayflowPro", %opts );
108     $tx->content( %content, "address" => "700 Any street" );
109     tx_check(
110         $tx,
111         desc          => "AVSADDR=X,AVSZIP=X",
112         is_success    => 1,
113         result_code   => 0,
114         error_message => "Approved",
115         authorization => "010101",
116         avs_code      => "",
117         cvv2_code     => "Y",
118     );
119
120     # IF ZIP <= 50001 and >= 99999 THEN AVSZIP == "N"
121     $tx = new Business::OnlinePayment( "PayflowPro", %opts );
122     $tx->content( %content, "zip" => "99999" );
123     tx_check(
124         $tx,
125         desc          => "AVSADDR=Y,AVSZIP=N",
126         is_success    => 0,
127         result_code   => 126,
128         error_message => "Under review by Fraud Service",
129         authorization => "010101",
130         avs_code      => "A",
131         cvv2_code     => "Y",
132     );
133
134     # Both AVSADDR and AVSZIP == "N"
135     $tx = new Business::OnlinePayment( "PayflowPro", %opts );
136     $tx->content( %content, "address" => "500 Any street", "zip" => "99999" );
137     tx_check(
138         $tx,
139         desc          => "AVSADDR=N,AVSZIP=N",
140         is_success    => 0,
141         result_code   => 126,
142         error_message => "Under review by Fraud Service",
143         authorization => "010101",
144         avs_code      => "N",
145         cvv2_code     => "Y",
146     );
147 }
148
149 {    # cvv2_code() / CVV2MATCH
150     my $tx = new Business::OnlinePayment( "PayflowPro", %opts );
151
152     # IF CVV2 >= 301 and <= 600 THEN CVV2MATCH == "N"
153     $tx->content( %content, "cvv2" => "301" );
154     tx_check(
155         $tx,
156         desc          => "cvv2(301)",
157         is_success    => 0,
158         result_code   => 126,
159         error_message => "Under review by Fraud Service",
160         authorization => "010101",
161         avs_code      => "Y",
162         cvv2_code     => "N",
163     );
164
165     # IF CVV2 >= 601 THEN CVV2MATCH == "X"
166     $tx = new Business::OnlinePayment( "PayflowPro", %opts );
167     $tx->content( %content, "cvv2" => "601" );
168     tx_check(
169         $tx,
170         desc          => "cvv2(601)",
171         is_success    => 0,
172         result_code   => 126,
173         error_message => "Under review by Fraud Service",
174         authorization => "010101",
175         avs_code      => "Y",
176         cvv2_code     => "X",
177     );
178 }
179
180 sub tx_check {
181     my $tx = shift;
182     my %o  = @_;
183
184     $tx->test_transaction(1);
185     $tx->submit;
186
187     is( $tx->is_success,    $o{is_success},    "$o{desc}: " . tx_info($tx) );
188     is( $tx->result_code,   $o{result_code},   "result_code(): RESULT" );
189     is( $tx->error_message, $o{error_message}, "error_message() / RESPMSG" );
190     is( $tx->authorization, $o{authorization}, "authorization() / AUTHCODE" );
191     is( $tx->avs_code,  $o{avs_code},  "avs_code() / AVSADDR and AVSZIP" );
192     is( $tx->cvv2_code, $o{cvv2_code}, "cvv2_code() / CVV2MATCH" );
193     like( $tx->order_number, qr/^\w{12}/, "order_number() / PNREF" );
194 }
195
196 sub tx_info {
197     my $tx = shift;
198
199     no warnings 'uninitialized';
200
201     return (
202         join( "",
203             "is_success(",     $tx->is_success,    ")",
204             " order_number(",  $tx->order_number,  ")",
205             " error_message(", $tx->error_message, ")",
206             " result_code(",   $tx->result_code,   ")",
207             " auth_info(",     $tx->authorization, ")",
208             " avs_code(",      $tx->avs_code,      ")",
209             " cvv2_code(",     $tx->cvv2_code,     ")",
210         )
211     );
212 }