Initial import
[Business-OnlinePayment-PlugnPay.git] / t / live_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) 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 ";
15
16 plan(
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"} &&
22         $ENV{"PNP_DO_LIVE"}
23       )
24     ? ( tests => 48 )
25     : ( skip_all => $runinfo )
26 );
27
28 my %opts = (
29     "debug"                      => 0,
30 );
31
32 my %content = (
33     login          => $ENV{"PNP_ACCOUNT"},
34     password       => $ENV{"PNP_PASSWORD"},
35     action         => "Normal Authorization",
36     type           => "CC",
37     description    => "Business::OnlinePayment::PlugnPay live test",
38     card_number    => $ENV{"PNP_CARD"},
39     cvv2           => $ENV{"PNP_CVV2"},
40     expiration     => $ENV{"PNP_EXP"},
41     amount         => "0.01",
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"},
48 );
49
50 my $voidable;
51 my $voidable_amount = 0;
52 my $credit_amount = 0;
53
54 {    # valid card number test
55     my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
56     $tx->content(%content);
57     tx_check(
58         $tx,
59         desc          => "valid card_number",
60         is_success    => 1,
61         result_code   => "A",              # wtf?
62         authorization => qr/^\w{6}$/,
63         avs_code      => "Y",
64         cvv2_response => "M",
65         order_number  => qr/^([0-9]{19})$/,
66     );
67    $voidable = $tx->order_number if $tx->is_success;
68    $voidable_amount = $content{amount} if $tx->is_success;
69 }
70
71 {    # invalid card number test
72
73     my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
74     $tx->content( %content, card_number => "4111111111111112" );
75     tx_check(
76         $tx,
77         desc          => "invalid card_number",
78         is_success    => 0,
79         result_code   => "P66",
80         authorization => qr/^$/,
81         avs_code      => undef,
82         cvv2_response => undef,
83         order_number  => qr/^([0-9]{19})$/,
84     );
85 }
86
87
88 {    # avs_code() / AVSZIP and AVSADDR tests
89
90     my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
91
92     $tx->content( %content, "address" => "500 Any street" );
93     tx_check(
94         $tx,
95         desc          => "AVSADDR=N,AVSZIP=Y",
96         is_success    => 1,
97         result_code   => "A",
98         authorization => qr/^\w{6}$/,
99         avs_code      => "Z",
100         cvv2_response => "M",
101         order_number  => qr/^([0-9]{19})$/,
102     );
103     $credit_amount += $content{amount} if $tx->is_success;
104
105     $tx = new Business::OnlinePayment( "PlugnPay", %opts );
106     $tx->content( %content, "zip" => "99999" );
107     tx_check(
108         $tx,
109         desc          => "AVSADDR=Y,AVSZIP=N",
110         is_success    => 1,
111         result_code   => "A",
112         authorization => qr/^\w{6}$/,
113         avs_code      => "A",
114         cvv2_response => "M",
115         order_number  => qr/^([0-9]{19})$/,
116     );
117     $credit_amount += $content{amount} if $tx->is_success;
118
119     $tx = new Business::OnlinePayment( "PlugnPay", %opts );
120     $tx->content( %content, "address" => "500 Any street", "zip" => "99999" );
121     tx_check(
122         $tx,
123         desc          => "AVSADDR=N,AVSZIP=N",
124         is_success    => 1,
125         result_code   => "A",
126         authorization => qr/^\w{6}$/,
127         avs_code      => "N",
128         cvv2_response => "M",
129         order_number  => qr/^([0-9]{19})$/,
130     );
131     $credit_amount += $content{amount} if $tx->is_success;
132 }
133
134 {    # cvv2_response() / CVV2MATCH
135
136     my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
137
138     $tx->content( %content, "cvv2" => $content{cvv2}+1 );
139     tx_check(
140         $tx,
141         desc          => "wrong cvv2",
142         is_success    => 0,
143         result_code   => "P02",               # configurable?
144         authorization => qr/^\w{6}$/,
145         avs_code      => "Y",
146         cvv2_response => "N",
147         order_number  => qr/^([0-9]{19})$/,
148     );
149     #$credit_amount += $content{amount} if $tx->is_success;
150
151 }
152
153 SKIP: {    # void test
154
155     #skip "Void tests require account with void capability", 6;
156
157     my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
158     $tx->content( %content, 'action' => "Void",
159                             'order_number' => $voidable,
160                 );
161     tx_check(
162         $tx,
163         desc          => "void",
164         is_success    => 1,
165         result_code   => undef,
166         authorization => qr/^$/,
167         avs_code      => undef,
168         cvv2_response => undef,
169         order_number  => qr/^([0-9]{19})$/,
170     );
171     $credit_amount += $voidable_amount unless $tx->is_success;
172 }
173
174 SKIP: {    # refund test
175
176     #skip "Refund tests require account with refund capability", 6;
177
178     my $tx = new Business::OnlinePayment( "PlugnPay", %opts );
179     $tx->content( %content, 'action' => "Credit",
180                             'amount' => sprintf("%.2f", $credit_amount),
181                 );
182     tx_check(
183         $tx,
184         desc          => "refund/credit",
185         is_success    => 1,
186         result_code   => undef,
187         authorization => qr/^$/,
188         avs_code      => undef,
189         cvv2_response => undef,
190         order_number  => qr/^([0-9]{19})$/,
191     );
192 }
193
194 sub tx_check {
195     my $tx = shift;
196     my %o  = @_;
197
198     $tx->submit;
199
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" );
206 }
207
208 sub tx_info {
209     my $tx = shift;
210
211     no warnings 'uninitialized';
212
213     return (
214         join( "",
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, ")",
221         )
222     );
223 }