summaryrefslogtreecommitdiff
path: root/t/card.t
diff options
context:
space:
mode:
Diffstat (limited to 't/card.t')
-rw-r--r--t/card.t184
1 files changed, 184 insertions, 0 deletions
diff --git a/t/card.t b/t/card.t
new file mode 100644
index 0000000..a0da538
--- /dev/null
+++ b/t/card.t
@@ -0,0 +1,184 @@
+#!/usr/bin/perl -w
+
+use Test::More;
+
+my($login, $password, @opts) = ('TESTMERCHANT', '',
+ 'default_Origin' => 'RECURRING' );
+plan tests => 43;
+
+use_ok 'Business::OnlinePayment';
+
+my %content = (
+ type => 'VISA',
+ login => $login,
+ password => $password,
+ action => 'Normal Authorization',
+ description => 'Business::OnlinePayment visa test',
+# card_number => '4007000000027',
+ card_number => '4111111111111111',
+ cvv2 => '123',
+ expiration => expiration_date(),
+ amount => '49.95',
+ name => 'Tofu Beast',
+ email => 'ippay@weasellips.com',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ customer_id => 'tfb',
+);
+
+my $voidable;
+my $voidable_auth;
+my $voidable_amount = 0;
+
+# valid card number test
+{
+ my $tx = Business::OnlinePayment->new("IPPay", @opts);
+ $tx->content(%content);
+ tx_check(
+ $tx,
+ desc => "valid card_number",
+ is_success => 1,
+ result_code => '000',
+ error_message => 'APPROVED',
+ authorization => qr/TEST\d{2}/,
+ avs_code => 'U', # so rather pointless :\
+ cvv2_response => 'P', # ...
+ );
+ $voidable = $tx->order_number if $tx->is_success;
+ $voidable_auth = $tx->authorization if $tx->is_success;
+ $voidable_amount = $content{amount} if $tx->is_success;
+}
+
+# invalid card number test
+{
+ my $tx = Business::OnlinePayment->new("IPPay", @opts);
+ $tx->content(%content, card_number => "4111111111111112" );
+ tx_check(
+ $tx,
+ desc => "invalid card_number",
+ is_success => 0,
+ result_code => '912',
+ error_message => 'INVALID CARD NUMBER',
+ authorization => qr/^$/,
+ avs_code => '', # so rather pointless :\
+ cvv2_response => '', # ...
+ );
+}
+
+# authorization only test
+{
+ my $tx = Business::OnlinePayment->new("IPPay", @opts);
+ $tx->content(%content, action => 'authorization only', amount => '3.00' );
+ tx_check(
+ $tx,
+ desc => "authorization only",
+ is_success => 1,
+ result_code => '000',
+ error_message => 'APPROVED',
+ authorization => qr/TEST\d{2}/,
+ avs_code => 'U', # so rather pointless :\
+ cvv2_response => 'P', # ...
+ );
+ $postable = $tx->order_number if $tx->is_success;
+ $postable_auth = $tx->authorization if $tx->is_success;
+ $postable_amount = $content{amount} if $tx->is_success;
+}
+
+# post authorization test
+SKIP: {
+ my $tx = new Business::OnlinePayment( "IPPay", %opts );
+ $tx->content( %content, 'action' => "post authorization",
+ 'amount' => $postable_amount, # not required
+ 'order_number' => $postable,
+ );
+ tx_check(
+ $tx,
+ desc => "post authorization",
+ is_success => 1,
+ result_code => '000',
+ error_message => 'APPROVED',
+ authorization => qr/^$postable_auth$/,
+ avs_code => '',
+ cvv2_response => '',
+ );
+}
+
+# void test
+SKIP: {
+ my $tx = new Business::OnlinePayment( "IPPay", %opts );
+ $tx->content( %content, 'action' => "Void",
+ 'order_number' => $voidable,
+ 'authorization' => $voidable_auth,
+ );
+ tx_check(
+ $tx,
+ desc => "void",
+ is_success => 1,
+ result_code => '000',
+ error_message => 'VOID PROCESSED',
+ authorization => qr/^$voidable_auth$/,
+ avs_code => '',
+ cvv2_response => '',
+ );
+}
+
+# credit test
+SKIP: {
+ my $tx = new Business::OnlinePayment( "IPPay", %opts );
+ $tx->content( %content, 'action' => "credit");
+ tx_check(
+ $tx,
+ desc => "credit",
+ is_success => 1,
+ result_code => '000',
+ error_message => 'RETURN ACCEPTED',
+ authorization => qr/\d{6}/,
+ avs_code => '',
+ cvv2_response => '',
+ );
+}
+
+
+sub tx_check {
+ my $tx = shift;
+ my %o = @_;
+
+ $tx->test_transaction(1);
+ $tx->submit;
+
+ is( $tx->is_success, $o{is_success}, "$o{desc}: " . tx_info($tx) );
+ is( $tx->result_code, $o{result_code}, "result_code(): RESULT" );
+ is( $tx->error_message, $o{error_message}, "error_message() / RESPMSG" );
+ like( $tx->authorization, $o{authorization}, "authorization() / AUTHCODE" );
+ is( $tx->avs_code, $o{avs_code}, "avs_code() / AVSADDR and AVSZIP" );
+ is( $tx->cvv2_response, $o{cvv2_response}, "cvv2_response() / CVV2MATCH" );
+ like( $tx->order_number, qr/^\w{18}/, "order_number() / PNREF" );
+}
+
+sub tx_info {
+ my $tx = shift;
+
+ no warnings 'uninitialized';
+
+ return (
+ join( "",
+ "is_success(", $tx->is_success, ")",
+ " order_number(", $tx->order_number, ")",
+ " error_message(", $tx->error_message, ")",
+ " result_code(", $tx->result_code, ")",
+ " auth_info(", $tx->authorization, ")",
+ " avs_code(", $tx->avs_code, ")",
+ " cvv2_response(", $tx->cvv2_response, ")",
+ )
+ );
+}
+
+sub expiration_date {
+ my($month, $year) = (localtime)[4,5];
+ $year++; # So we expire next year.
+ $year %= 100; # y2k? What's that?
+
+ return sprintf("%02d/%02d", $month, $year);
+}