0.06: fix january bug in tests
[Business-OnlinePayment-IPPay.git] / t / card.t
1 #!/usr/bin/perl -w
2
3 use Test::More;
4 require "t/lib/test_account.pl";
5
6 my($login, $password, %opt) = test_account_or_skip('card');
7 plan tests => 43;
8   
9 use_ok 'Business::OnlinePayment';
10
11 my %content = (
12     type           => 'VISA',
13     login          => $login,
14     password       => $password,
15     action         => 'Normal Authorization',
16     description    => 'Business::OnlinePayment visa test',
17 #    card_number    => '4007000000027',
18     card_number    => '4111111111111111',
19     cvv2           => '123',
20     expiration     => expiration_date(),
21     amount         => '49.95',
22     name           => 'Tofu Beast',
23     email          => 'ippay@weasellips.com',
24     address        => '123 Anystreet',
25     city           => 'Anywhere',
26     state          => 'UT',
27     zip            => '84058',
28     country        => 'US',      # will be forced to USA
29     customer_id    => 'tfb',
30 );
31
32 my $voidable;
33 my $voidable_auth;
34 my $voidable_amount = 0;
35
36 # valid card number test
37 {
38   my $tx = Business::OnlinePayment->new("IPPay", %opt);
39   $tx->content(%content);
40   tx_check(
41     $tx,
42     desc          => "valid card_number",
43     is_success    => 1,
44     result_code   => '000',
45     error_message => 'APPROVED',
46     authorization => qr/TEST\d{2}/,
47 #    avs_code      => 'U',          # so rather pointless :\
48     avs_code      => 'Y',          # so very pointless :\
49     cvv2_response => 'P',          # ...
50   );
51   $voidable = $tx->order_number if $tx->is_success;
52   $voidable_auth = $tx->authorization if $tx->is_success;
53   $voidable_amount = $content{amount} if $tx->is_success;
54 }
55
56 # invalid card number test
57 {
58   my $tx = Business::OnlinePayment->new("IPPay", %opt);
59   $tx->content(%content, card_number => "4111111111111112" );
60   tx_check(
61     $tx,
62     desc          => "invalid card_number",
63     is_success    => 0,
64     result_code   => '912',
65     error_message => 'INVALID CARD NUMBER',
66     authorization => qr/^$/,
67     avs_code      => '',           # so rather pointless :\
68     cvv2_response => '',           # ...
69   );
70 }
71
72 # authorization only test
73 {
74   my $tx = Business::OnlinePayment->new("IPPay", %opt);
75   $tx->content(%content, action => 'authorization only',  amount => '3.00' );
76   tx_check(
77     $tx,
78     desc          => "authorization only",
79     is_success    => 1,
80     result_code   => '000',
81     error_message => 'APPROVED',
82     authorization => qr/TEST\d{2}/,
83 #    avs_code      => 'U',          # so rather pointless :\
84     avs_code      => 'Y',          # so very pointless :\
85     cvv2_response => 'P',          # ...
86   );
87   $postable = $tx->order_number if $tx->is_success;
88   $postable_auth = $tx->authorization if $tx->is_success;
89   $postable_amount = $content{amount} if $tx->is_success;
90 }
91
92 # post authorization test
93 SKIP: {
94   my $tx = new Business::OnlinePayment( "IPPay", %opt );
95   $tx->content( %content, 'action'       => "post authorization", 
96                           'amount'       => $postable_amount,    # not required
97                           'order_number' => $postable,
98               );
99   tx_check(
100     $tx,
101     desc          => "post authorization",
102     is_success    => 1,
103     result_code   => '000',
104     error_message => 'APPROVED',
105     authorization => qr/^$postable_auth$/,
106     avs_code      => '',
107     cvv2_response => '',
108     );
109 }
110
111 # void test
112 SKIP: {
113   my $tx = new Business::OnlinePayment( "IPPay", %opt );
114   $tx->content( %content, 'action' => "Void",
115                           'order_number' => $voidable,
116                           'authorization' => $voidable_auth,
117               );
118   tx_check(
119     $tx,
120     desc          => "void",
121     is_success    => 1,
122     result_code   => '000',
123     error_message => 'VOID PROCESSED',
124     authorization => qr/^$voidable_auth$/,
125     avs_code      => '',
126     cvv2_response => '',
127     );
128 }
129
130 # credit test
131 SKIP: {
132   my $tx = new Business::OnlinePayment( "IPPay", %opt );
133   $tx->content( %content, 'action' => "credit");
134   tx_check(
135     $tx,
136     desc          => "credit",
137     is_success    => 1,
138     result_code   => '000',
139     error_message => 'RETURN ACCEPTED',
140     authorization => qr/\d{6}/,
141     avs_code      => '',
142     cvv2_response => '',
143     );
144 }
145
146
147 sub tx_check {
148     my $tx = shift;
149     my %o  = @_;
150
151     $tx->test_transaction(1);
152     $tx->submit;
153
154     is( $tx->is_success,    $o{is_success},    "$o{desc}: " . tx_info($tx) );
155     is( $tx->result_code,   $o{result_code},   "result_code(): RESULT" );
156     is( $tx->error_message, $o{error_message}, "error_message() / RESPMSG" );
157     like( $tx->authorization, $o{authorization}, "authorization() / AUTHCODE" );
158     is( $tx->avs_code,  $o{avs_code},  "avs_code() / AVSADDR and AVSZIP" );
159     is( $tx->cvv2_response, $o{cvv2_response}, "cvv2_response() / CVV2MATCH" );
160     like( $tx->order_number, qr/^\w{18}/, "order_number() / PNREF" );
161 }
162
163 sub tx_info {
164     my $tx = shift;
165
166     no warnings 'uninitialized';
167
168     return (
169         join( "",
170             "is_success(",     $tx->is_success,    ")",
171             " order_number(",  $tx->order_number,  ")",
172             " error_message(", $tx->error_message, ")",
173             " result_code(",   $tx->result_code,   ")",
174             " auth_info(",     $tx->authorization, ")",
175             " avs_code(",      $tx->avs_code,      ")",
176             " cvv2_response(", $tx->cvv2_response, ")",
177         )
178     );
179 }
180