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 Test::More;

if( ! $ENV{WPP_TEST} || ! -f $ENV{WPP_TEST} ) {
    plan skip_all => 'No WPP_TEST env var set. Please see README to run tests';
}
else {
    plan tests => '7';
}

use Business::PayPal::API qw( DirectPayments CaptureRequest ReauthorizationRequest VoidRequest RefundTransaction );

my @methlist = qw( DirectPayments CaptureRequest ReauthorizationRequest VoidRequest RefundTransaction);
use_ok('Business::PayPal::API', @methlist);

require 't/API.pl';

my %args = do_args();

my ($transale,$tranvoid,$tranbasic,$tranrefund);
my ($ppsale,$ppvoid,$ppbasic,$pprefund,$pprefund1,$ppcap,$ppcap1);
my (%respsale,%resprefund,%resprefund1,%respbasic,%respcap,%respcap1,%respvoid);

#Test Full Refund on Sale

#$Business::PayPal::API::Debug=1;
$ppsale = new Business::PayPal::API(%args);
%respsale = $ppsale->DoDirectPaymentRequest (
                        PaymentAction    => 'Sale',
                        OrderTotal    => 11.87,
                        TaxTotal       => 0.0,
                        ItemTotal  => 0.0,
                        CreditCardType      => 'Visa',
                        CreditCardNumber        => '4561435600988217',
                        ExpMonth       => '01',
                        ExpYear        => +(localtime)[5]+1901,
                        CVV2       => '123',
                        FirstName      => 'JP',
                        LastName      => 'Morgan',
                        Street1  => '1st Street LaCausa',
                        Street2  => '',
                        CityName      => 'La',
                        StateOrProvince     => 'CA',
                        PostalCode       => '90210',
                        Country   => 'US',
                        Payer    => 'mall@example.org',
                        CurrencyID  => 'USD',
                        IPAddress        => '10.0.0.1',
                        MerchantSessionID      => '10113301',
                        );
#$Business::PayPal::API::Debug=0;
if(like( $respsale{'Ack'}, qr/Success/, 'Direct Payment Sale')) {
            $transale = $respsale{'TransactionID'};
#$Business::PayPal::API::Debug=1;
            $pprefund = new Business::PayPal::API(%args);
            %resprefund = $pprefund->RefundTransaction (
                            TransactionID => $transale,
                            RefundType    => 'Full',
                            Memo          => 'Full direct sale refund',
                            );
#$Business::PayPal::API::Debug=0;
            like( $resprefund{'Ack'}, qr/Success/, 'Full Refund For Sale');
      }

#Basic Authorization and Capture

%args=do_args();
#$Business::PayPal::API::Debug=0;
$ppbasic = new Business::PayPal::API(%args);
%respbasic = $ppbasic->DoDirectPaymentRequest (
                        PaymentAction    => 'Authorization',
                        OrderTotal    => 13.87,
                        TaxTotal       => 0.0,
                        ItemTotal  => 0.0,
                        CreditCardType      => 'Visa',
                        CreditCardNumber        => '4561435600988217',
                        ExpMonth       => '01',
                        ExpYear        => +(localtime)[5]+1901,
                        CVV2       => '123',
                        FirstName      => 'JP',
                        LastName      => 'Morgan',
                        Street1  => '1st Street LaCausa',
                        Street2  => '',
                        CityName      => 'La',
                        StateOrProvince     => 'CA',
                        PostalCode       => '90210',
                        Country   => 'US',
                        Payer    => 'mall@example.org',
                        CurrencyID  => 'USD',
                        IPAddress        => '10.0.0.1',
                        MerchantSessionID      => '10113301',
                        );

#$Business::PayPal::API::Debug=0;
if( like( $respbasic{'Ack'}, qr/Success/, 'Direct Payment Basic Authorization') ) {
    $tranbasic = $respbasic{'TransactionID'};

    #Test Partial Capture
    #$Business::PayPal::API::Debug=1;
    $ppcap = new Business::PayPal::API(%args);

    %respcap = $ppcap->DoCaptureRequest (
					 AuthorizationID => $tranbasic,
					 CompleteType    => 'NotComplete',
					 Amount        => '3.00',
					 Note          => 'Partial Capture',
					);
    #$Business::PayPal::API::Debug=0;
    like( $respcap{'Ack'}, qr/Success/, 'Partial Capture');

    #Test Full Capture
    #$Business::PayPal::API::Debug=1;
    $ppcap1 = new Business::PayPal::API(%args);
    %respcap1 = $ppcap1->DoCaptureRequest (
					   AuthorizationID => $tranbasic,
					   CompleteType    => 'Complete',
					   Amount          => '6.00',
					  );
    #$Business::PayPal::API::Debug=0;
    like( $respcap1{'Ack'}, qr/Success/, 'Full Capture');
}
else { skip( "direct payment auth failed", 2 ) }


#Test Void
$ppbasic = new Business::PayPal::API(%args);
%respbasic = $ppbasic->DoDirectPaymentRequest (
                        PaymentAction    => 'Authorization',
                        OrderTotal    => 17.37,
                        TaxTotal       => 0.0,
                        ItemTotal  => 0.0,
                        CreditCardType      => 'Visa',
                        CreditCardNumber        => '4561435600988217',
                        ExpMonth       => '01',
                        ExpYear        => +(localtime)[5]+1901,
                        CVV2       => '123',
                        FirstName      => 'JP',
                        LastName      => 'Morgan',
                        Street1  => '1st Street LaCausa',
                        Street2  => '',
                        CityName      => 'La',
                        StateOrProvince     => 'CA',
                        PostalCode       => '90210',
                        Country   => 'US',
                        Payer    => 'mall@example.org',
                        CurrencyID  => 'USD',
                        IPAddress        => '10.0.0.1',
                        MerchantSessionID      => '10113301',
                        );

#$Business::PayPal::API::Debug=1;
$ppvoid = new Business::PayPal::API(%args);
%respvoid = $ppvoid->DoVoidRequest ( AuthorizationID => $respbasic{TransactionID},
				     Note            => 'Authorization Void', );
#$Business::PayPal::API::Debug=0;
like( $respvoid{'Ack'}, qr/Success/, 'Authorization Voided');