Beginnings of tests for subscription payments.

These tests verify a TransactionSearch for ProfileID, and also serve as
an example of the method to find subscriptions using that method.

I've also added to the test a creation of an HTML form that can be used
to create a transaction that will allow the test to pass.  This is a
hack, not unlike the hacks existing in the tests now that ask for
pasting of a transaction ID.  Long term, if someone wants to do the
work, using WWW:Mechanize or some other method for full automation of
these tests might be useful, but I think the generated HTML file is a
step forward from the cut-and-paste solution currently in use.
This commit is contained in:
Bradley M. Kuhn 2015-01-01 17:06:49 -05:00
parent 7198b854b9
commit c5f62dbdb1
2 changed files with 108 additions and 0 deletions

1
.gitignore vendored
View file

@ -4,3 +4,4 @@ auth.txt
blib blib
perltidy.LOG perltidy.LOG
pm_to_blib pm_to_blib
subscription-payment.html

107
t/SubscriptionPayments.t Normal file
View file

@ -0,0 +1,107 @@
# -*- mode: cperl -*-
use Test::More;
use strict;
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 => 5;
}
use_ok( 'Business::PayPal::API::TransactionSearch' );
#########################
require 't/API.pl';
my %args = do_args();
=pod
The following four tests shows the methodology to use TransactionSearch to
find transactions that are part of the same ProfileID. This method was
discovered by trial-and-error. Specifically, it's somewhat odd that
TransactionSearch is used with the parameter of 'ProfileID' with the value
set to a specific TransactionID to find the ProfileID via the "Created"
transaction. Then, in turn, that ProfileID can find the subscription payments
related to the original transaction.
This works, and seems to be correct, albeit odd.
=cut
open(SUBSCRIPTION_PAY_HTML, ">", "subscription-payment.html")
or die "unable to open subscription-payment.html: $!";
print SUBSCRIPTION_PAY_HTML <<_SUBSCRIPTION_PAYMENT_DATA_
<html>
<body>
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="business" value="$args{SellerEmail}" />
<input type="hidden" name="item_name" value="Monthly Payment" />
<input type="hidden" name="cmd" value="_xclick-subscriptions">
<input id="no_shipping" type="hidden" name="no_shipping" value="0" />
<input type="hidden" name="lc" value="US">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="t3" value="M" />
<input type="hidden" name="p3" value="1" />
<input type="hidden" name="src" value="1" />
<input type="hidden" name="srt" value="0" />
<input id="no_shipping" type="hidden" name="no_shipping" value="0" />
<input type="hidden" name="no_note" value="1">
<input id="amount" type="text" name="a3" size="5" minimum="10" value="10" />
<input type="image" border="0" name="submit" alt="Make test monthly payment now">
</form>
</body>
</html>
_SUBSCRIPTION_PAYMENT_DATA_
;
close(SUBSCRIPTION_PAY_HTML); die "unable to write subscription-payment.html: $!" if ($? != 0);
use Cwd; my $cwd = getcwd;
print STDERR <<"_PROFILEID_";
Please note the next series of tests will not succeeed unless there is at
least one transaction that is part of a subscription payments in your business
account.
if you haven't made one yet, you can visit:
file:///$cwd/subscription-payment.html
and use the sandbox buyer account to make the payment.
_PROFILEID_
my $startdate = '1998-01-01T01:45:10.00Z';
my $ts = new Business::PayPal::API::TransactionSearch( %args );
my $resp = $ts->TransactionSearch(StartDate => $startdate);
use Data::Dumper;
ok(scalar @{$resp} > 0, "Some transactions found");
my($profileID, %possibleTransactionIDs);
foreach my $record (@{$resp}) {
if ($record->{Type} =~ /Recurring/) {
if ($record->{Status} =~ /Completed/) {
$possibleTransactionIDs{$record->{TransactionID}} = $record;
} elsif ($record->{Status} =~ /Created/) {
$profileID = $record->{TransactionID};
}
}
}
ok(defined $profileID, "Subscription Payment Creation Record and ProfileID Found");
ok(scalar(keys %possibleTransactionIDs) > 0, "Subscription Payment Transactions Found");
$resp = $ts->TransactionSearch(StartDate => $startdate,
ProfileID => $profileID);
my $foundAtLeastOne = 0;
foreach my $record (@{$resp}) {
# One of these will need to be in the possibleTransactionID list (i.e.,
# we're assuming that at least one payment has occured in this repeating).
if (defined $possibleTransactionIDs{$record->{TransactionID}}) {
$foundAtLeastOne = 1; last;
}
}
ok($foundAtLeastOne, "Found one payment transaction under the given Profile ID");