Initial import
[Business-OnlinePayment-viaKLIX.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) VIAKLIX_ACCOUNT, VIAKLIX_PASSWORD, VIAKLIX_CARD,"
13   . " VIAKLIX_CVV2, VIAKLIX_EXP, VIAKLIX_CARD_NAME, VIAKLIX_CARD_ADDRESS,"
14   . " VIAKLIX_CARD_CITY, VIAKLIX_CARD_STATE, VIAKLIX_CARD_ZIP, and VIAKLIX_DO_LIVE ";
15
16 plan(
17       ( $ENV{"VIAKLIX_ACCOUNT"} && $ENV{"VIAKLIX_PASSWORD"} &&
18         $ENV{"VIAKLIX_CARD"} && $ENV{"VIAKLIX_CVV2"} &&
19         $ENV{"VIAKLIX_EXP"} && $ENV{"VIAKLIX_CARD_NAME"} &&
20         $ENV{"VIAKLIX_CARD_ADDRESS"} && $ENV{"VIAKLIX_CARD_CITY"} &&
21         $ENV{"VIAKLIX_CARD_STATE"} && $ENV{"VIAKLIX_CARD_ZIP"} &&
22         $ENV{"VIAKLIX_DO_LIVE"}
23       )
24     ? ( tests => 42 )
25     : ( skip_all => $runinfo )
26 );
27
28 my %opts = (
29     "debug"                      => 2,
30     "default_ssl_user_id"        => $ENV{"VIAKLIX_USERID"},
31     "default_ssl_salestax"       => "0.00",
32     "default_ssl_customer_code"  => "LIVETESTCUSTOMER",
33 );
34
35 my %content = (
36     login          => $ENV{"VIAKLIX_ACCOUNT"},
37     password       => $ENV{"VIAKLIX_PASSWORD"},
38     action         => "Normal Authorization",
39     type           => "CC",
40     description    => "Business::OnlinePayment::viaKLIX live test",
41     card_number    => $ENV{"VIAKLIX_CARD"},
42     cvv2           => $ENV{"VIAKLIX_CVV2"},
43     expiration     => $ENV{"VIAKLIX_EXP"},
44     amount         => "0.01",
45     invoice_number => "LiveTest",
46     name           => $ENV{"VIAKLIX_CARD_NAME"},
47     address        => $ENV{"VIAKLIX_CARD_ADDRESS"},
48     city           => $ENV{"VIAKLIX_CARD_CITY"},
49     state          => $ENV{"VIAKLIX_CARD_STATE"},
50     zip            => $ENV{"VIAKLIX_CARD_ZIP"},
51 );
52
53 my $credit_amount = 0;
54
55 {    # valid card number test
56     my $tx = new Business::OnlinePayment( "viaKLIX", %opts );
57     $tx->content(%content);
58     tx_check(
59         $tx,
60         desc          => "valid card_number",
61         is_success    => 1,
62         result_code   => "0",
63         authorization => qr/^\w{6}$/,
64         avs_code      => "Y",
65         cvv2_response => "M",
66         order_number  => qr/^([0-9A-F]{8}-([0-9A-F]{4}-){3}[0-9A-F]{12})$/,
67     );
68    $credit_amount += $content{amount} if $tx->is_success;
69 }
70
71 {    # invalid card number test
72
73     my $tx = new Business::OnlinePayment( "viaKLIX", %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   => 4000,
80         authorization => qr/^$/,
81         avs_code      => undef,
82         cvv2_response => undef,
83         order_number  => qr/^$/,
84     );
85 }
86
87
88 {    # avs_code() / AVSZIP and AVSADDR tests
89
90     my $tx = new Business::OnlinePayment( "viaKLIX", %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   => "0",
98         authorization => qr/^\w{6}$/,
99         avs_code      => "Z",
100         cvv2_response => "M",
101         order_number  => qr/^([0-9A-F]{8}-([0-9A-F]{4}-){3}[0-9A-F]{12})$/,
102     );
103     $credit_amount += $content{amount} if $tx->is_success;
104
105     $tx = new Business::OnlinePayment( "viaKLIX", %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   => "0",
112         authorization => qr/^\w{6}$/,
113         avs_code      => "A",
114         cvv2_response => "M",
115         order_number  => qr/^([0-9A-F]{8}-([0-9A-F]{4}-){3}[0-9A-F]{12})$/,
116     );
117     $credit_amount += $content{amount} if $tx->is_success;
118
119     $tx = new Business::OnlinePayment( "viaKLIX", %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   => "0",
126         authorization => qr/^\w{6}$/,
127         avs_code      => "N",
128         cvv2_response => "M",
129         order_number  => qr/^([0-9A-F]{8}-([0-9A-F]{4}-){3}[0-9A-F]{12})$/,
130     );
131     $credit_amount += $content{amount} if $tx->is_success;
132 }
133
134 {    # cvv2_response() / CVV2MATCH
135
136     my $tx = new Business::OnlinePayment( "viaKLIX", %opts );
137
138     $tx->content( %content, "cvv2" => $content{cvv2}+1 );
139     tx_check(
140         $tx,
141         desc          => "wrong cvv2",
142         is_success    => 1,
143         result_code   => "0",
144         authorization => qr/^\w{6}$/,
145         avs_code      => "Y",
146         cvv2_response => "N",
147         order_number  => qr/^([0-9A-F]{8}-([0-9A-F]{4}-){3}[0-9A-F]{12})$/,
148     );
149     $credit_amount += $content{amount} if $tx->is_success;
150
151 }
152
153 SKIP: {    # refund test
154
155     skip "Refund tests require account with refund capability", 6;
156
157     my $tx = new Business::OnlinePayment( "viaKLIX", %opts );
158     $tx->content( %content, 'action' => "Credit",
159                             'amount' => sprintf("%.2f", $credit_amount),
160                 );
161     tx_check(
162         $tx,
163         desc          => "refund/credit",
164         is_success    => 1,
165         result_code   => "0",
166         authorization => qr/^$/,
167         avs_code      => undef,
168         cvv2_response => undef,
169         order_number  => qr/^$/,
170     );
171 }
172
173 sub tx_check {
174     my $tx = shift;
175     my %o  = @_;
176
177     $tx->submit;
178
179     is( $tx->is_success,    $o{is_success},    "$o{desc}: " . tx_info($tx) );
180     is( $tx->result_code,   $o{result_code},   "result_code(): RESULT" );
181     like( $tx->authorization, $o{authorization}, "authorization() / AUTHCODE" );
182     is( $tx->avs_code,  $o{avs_code},  "avs_code() / AVSADDR and AVSZIP" );
183     is( $tx->cvv2_response, $o{cvv2_response}, "cvv2_response() / CVV2MATCH" );
184     like( $tx->order_number, $o{order_number}, "order_number() / PNREF" );
185 }
186
187 sub tx_info {
188     my $tx = shift;
189
190     no warnings 'uninitialized';
191
192     return (
193         join( "",
194             "is_success(",     $tx->is_success,    ")",
195             " order_number(",  $tx->order_number,  ")",
196             " result_code(",   $tx->result_code,   ")",
197             " auth_info(",     $tx->authorization, ")",
198             " avs_code(",      $tx->avs_code,      ")",
199             " cvv2_response(", $tx->cvv2_response, ")",
200         )
201     );
202 }