The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;
use POSIX qw(strftime);
use Test::More;

use Business::OnlinePayment;

my $runinfo =
    "to test set environment variables:"
  . " (required) ELINK_ACH_ACCOUNT, ELINK_ACH_PASSWORD"
  . " ELINK_ROUTING_CODE, ELINK_BANK_ACCOUNT, ELINK_ACH_NAME"
  . " ELINK_ACH_ADDRESS, ELINK_ACH_CITY, ELINK_ACH_STATE"
  . " ELINK_ACH_ZIP, ELINK_ACH_PHONE, ELINK_DO_LIVE";

plan(
      ( $ENV{"ELINK_ACH_ACCOUNT"} && $ENV{"ELINK_ACH_PASSWORD"} &&
        $ENV{"ELINK_ROUTING_CODE"} && $ENV{"ELINK_BANK_ACCOUNT"} &&
        $ENV{"ELINK_ACH_NAME"} && $ENV{"ELINK_ACH_ADDRESS"} &&
        $ENV{"ELINK_ACH_CITY"} && $ENV{"ELINK_ACH_STATE"} &&
        $ENV{"ELINK_ACH_ZIP"} && $ENV{"ELINK_ACH_PHONE"} &&
        $ENV{"ELINK_DO_LIVE"}
      )
    ? ( tests => 12 )
    : ( skip_all => $runinfo )
);

my %opts = (
    "debug"    => 0,
    "merchantcustservnum" => "8005551212",
);

my %content = (
    login          => $ENV{"ELINK_ACH_ACCOUNT"},
    password       => $ENV{"ELINK_ACH_PASSWORD"},
    action         => "Normal Authorization",
    type           => "CHECK",
    description    => "Business::OnlinePayment::TransFirsteLink live test",
    routing_code   => $ENV{"ELINK_ROUTING_CODE"},
    account_number => $ENV{"ELINK_BANK_ACCOUNT"},
    check_number   => "99",
    amount         => "1.01",
    invoice_number => "LiveTest",
    customer_id    => "LiveTestCust",
    account_name   => $ENV{"ELINK_ACH_NAME"},
    address        => $ENV{"ELINK_ACH_ADDRESS"},
    city           => $ENV{"ELINK_ACH_CITY"},
    state          => $ENV{"ELINK_ACH_STATE"},
    zip            => $ENV{"ELINK_ACH_ZIP"},
    phone          => $ENV{"ELINK_ACH_PHONE"},
);

{    # valid account test
    my $tx = new Business::OnlinePayment( "TransFirsteLink", %opts );
    $tx->content(%content);
    tx_check(
        $tx,
        desc          => "valid account",
        is_success    => 1,
        result_code   => "P00",
    );
}

SKIP: {    # invalid account test

    skip "invalid account tests broken", 4;

    my $tx = new Business::OnlinePayment( "TransFirsteLink", %opts );
    $tx->content( %content, routing_code   => "052000113",
                            account_number => "000000000001",
                );

    tx_check(
        $tx,
        desc          => "invalid account",
        is_success    => 0,
        result_code   => 214,
    );
}

{    # credit/refund test

    my $tx = new Business::OnlinePayment( "TransFirsteLink", %opts );
    $tx->content( %content, action => "Credit");

    tx_check(
        $tx,
        desc          => "credit/refund",
        is_success    => 1,
        result_code   => "ACCEPTED",
    );
}

sub tx_check {
    my $tx = shift;
    my %o  = @_;

    $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( scalar(@{$tx->junk}), 0, "junk() / JUNK " );
    like( $tx->order_number, qr/^(\d{9}|)$/, "order_number() / PNREF" );
}

sub tx_info {
    my $tx = shift;

    no warnings 'uninitialized';

    return (
        join( "",
            "is_success(",     $tx->is_success,    ")",
            " order_number(",  $tx->order_number,  ")",
            " result_code(",   $tx->result_code,   ")",
            $tx->junk ? " junk(". join('|', @{$tx->junk}). ")" : '',
        )
    );
}