The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More;
use Test::Fatal qw( exception );
use WebService::PayPal::PaymentsAdvanced;
use WebService::PayPal::PaymentsAdvanced::Response::FromRedirect;

my $payments = WebService::PayPal::PaymentsAdvanced->new(
    password => 'seekrit',
    user     => 'someuser',
    vendor   => 'PayPal',
);

my $params = {
    ACCT            => 9990,
    AMT             => 1.01,
    AUTHCODE        => 111111,
    AVSADDR         => 'Y',
    AVSDATA         => 'YYY',
    AVSZIP          => 'Y',
    BILLTOCOUNTRY   => 'US',
    BILLTOFIRSTNAME => 'Foo Bar',
    BILLTOLASTNAME  => 'Baz',
    BILLTONAME      => 'Foo Bar Baz',
    CARDTYPE        => 3,
    CORRELATIONID   => 'd064d8ae25107',
    COUNTRY         => 'US',
    COUNTRYTOSHIP   => 'US',
    CVV2MATCH       => 'Y',
    EXPDATE         => 1118,
    FIRSTNAME       => 'Foo Bar Baz',
    IAVS            => 'N',
    LASTNAME        => 'Baz',
    METHOD          => 'CC',
    NAME            => 'Foo Bar Baz',
    PNREF           => 'B73P7D8BB233',
    PPREF           => '75135880JY956953W',
    PROCAVS         => 'X',
    PROCCVV2        => 'M',
    RESPMSG         => 'Approved',
    RESULT          => 0,
    SECURETOKEN     => '8PbL3UE8NaUGOQdAtGzAY8wZf',
    SECURETOKENID   => 'DB034C3E-1914-11E5-9F6E-A581E074F348',
    SHIPTOCOUNTRY   => 'US',
    TAX             => 0.00,
    TENDER          => 'CC',
    TRANSTIME       => '2015-06-22 12:28:52',
    TRXTYPE         => 'S',
    TYPE            => 'S',
};

foreach my $method (
    'get_response_from_redirect',
    'get_response_from_silent_post'
    ) {
    {
        my $res = $payments->$method( { params => $params } );

        is( $res->message, 'Approved', 'response message' );
    }

    {
        my $res = $payments->$method(
            {
                ip_address => '173.0.81.65',
                params     => $params,
            }
        );

        is( $res->message, 'Approved', 'whitelisted IP' );
    }

    next unless $method eq 'get_response_from_silent_post';
    {
        isa_ok(
            exception {
                my $res = $payments->$method(
                    {
                        ip_address => '4.4.4.4',
                        params     => $params,
                    }
                );
            },
            'WebService::PayPal::PaymentsAdvanced::Error::IPVerification',
            'Bad IP exception'
        );

    }
}

done_testing();