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