package com.braintreegateway.integrationtest;
import com.braintreegateway.*;
import com.braintreegateway.SandboxValues.CreditCardNumber;
import com.braintreegateway.SandboxValues.TransactionAmount;
import com.braintreegateway.exceptions.ForgedQueryStringException;
import com.braintreegateway.exceptions.NotFoundException;
import com.braintreegateway.exceptions.DownForMaintenanceException;
import com.braintreegateway.test.CreditCardNumbers;
import com.braintreegateway.test.Nonce;
import com.braintreegateway.test.TestingGateway;
import com.braintreegateway.test.VenmoSdk;
import com.braintreegateway.testhelpers.CalendarTestUtils;
import com.braintreegateway.testhelpers.MerchantAccountTestConstants;
import com.braintreegateway.testhelpers.TestHelper;
import com.braintreegateway.testhelpers.ThreeDSecureRequestForTests;
import com.braintreegateway.util.NodeWrapperFactory;
import org.junit.Test;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.*;
import java.util.regex.Pattern;
import static org.junit.Assert.*;
public class TransactionIT extends IntegrationTest implements MerchantAccountTestConstants {
public static final String DISBURSEMENT_TRANSACTION_ID = "deposittransaction";
public static final String DISPUTED_TRANSACTION_ID = "disputedtransaction";
public static final String TWO_DISPUTE_TRANSACTION_ID = "2disputetransaction";
@SuppressWarnings("deprecation")
@Test
public void transparentRedirectURLForCreate() {
Configuration configuration = gateway.getConfiguration();
assertEquals(configuration.getBaseURL() + configuration.getMerchantPath() + "/transactions/all/create_via_transparent_redirect_request",
gateway.transaction().transparentRedirectURLForCreate());
}
@Test
public void trData() {
String trData = gateway.trData(new TransactionRequest(), "http://example.com");
TestHelper.assertValidTrData(gateway.getConfiguration(), trData);
}
@Test
public void saleTrData() {
String trData = gateway.transaction().saleTrData(new TransactionRequest(), "http://example.com");
TestHelper.assertValidTrData(gateway.getConfiguration(), trData);
assertTrue(trData.contains("sale"));
}
@Test
public void creditTrData() {
String trData = gateway.transaction().creditTrData(new TransactionRequest(), "http://example.com");
TestHelper.assertValidTrData(gateway.getConfiguration(), trData);
assertTrue(trData.contains("credit"));
}
@SuppressWarnings("deprecation")
@Test
public void createViaTransparentRedirect() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
options().
storeInVault(true).
done();
TransactionRequest trParams = new TransactionRequest().
type(Transaction.Type.SALE);
String queryString = TestHelper.simulateFormPostForTR(gateway, trParams, request, gateway.transaction().transparentRedirectURLForCreate());
Result<Transaction> result = gateway.transaction().confirmTransparentRedirect(queryString);
assertTrue(result.isSuccess());
}
@SuppressWarnings("deprecation")
@Test(expected = ForgedQueryStringException.class)
public void createViaTransparentRedirectThrowsWhenQueryStringHasBeenTamperedWith() {
String queryString = TestHelper.simulateFormPostForTR(gateway, new TransactionRequest(), new TransactionRequest(), gateway.transaction().transparentRedirectURLForCreate());
gateway.transaction().confirmTransparentRedirect(queryString + "this make it invalid");
}
@Test
public void createWithPaymentMethodNonce() {
String nonce = TestHelper.generateUnlockedNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(nonce);
Result<Transaction> result = gateway.transaction().sale(request);
assert(result.isSuccess());
}
@Test
public void cloneTransaction() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
orderId("123").
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
customer().
firstName("Dan").
done().
billingAddress().
firstName("Carl").
done().
shippingAddress().
firstName("Andrew").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
TransactionCloneRequest cloneRequest = new TransactionCloneRequest().
amount(new BigDecimal("123.45")).
channel("MyShoppingCartProvider").
options().
submitForSettlement(false).
done();
Result<Transaction> cloneResult = gateway.transaction().cloneTransaction(transaction.getId(), cloneRequest);
assertTrue(cloneResult.isSuccess());
Transaction cloneTransaction = cloneResult.getTarget();
assertEquals(new BigDecimal("123.45"), cloneTransaction.getAmount());
assertEquals("MyShoppingCartProvider", cloneTransaction.getChannel());
assertEquals("123", cloneTransaction.getOrderId());
assertEquals("411111******1111", cloneTransaction.getCreditCard().getMaskedNumber());
assertEquals("Dan", cloneTransaction.getCustomer().getFirstName());
assertEquals("Carl", cloneTransaction.getBillingAddress().getFirstName());
assertEquals("Andrew", cloneTransaction.getShippingAddress().getFirstName());
}
@Test
public void cloneTransactionAndSubmitForSettlement() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
orderId("123").
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
TransactionCloneRequest cloneRequest = new TransactionCloneRequest().amount(new BigDecimal("123.45")).options().submitForSettlement(true).done();
Result<Transaction> cloneResult = gateway.transaction().cloneTransaction(transaction.getId(), cloneRequest);
assertTrue(cloneResult.isSuccess());
Transaction cloneTransaction = cloneResult.getTarget();
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, cloneTransaction.getStatus());
}
@Test
public void cloneTransactionWithValidationErrors() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().credit(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
TransactionCloneRequest cloneRequest = new TransactionCloneRequest().amount(new BigDecimal("123.45"));
Result<Transaction> cloneResult = gateway.transaction().cloneTransaction(transaction.getId(), cloneRequest);
assertFalse(cloneResult.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_CANNOT_CLONE_CREDIT,
cloneResult.getErrors().forObject("transaction").onField("base").get(0).getCode());
}
@Test
public void sale() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(new BigDecimal("1000.00"), transaction.getAmount());
assertEquals("USD", transaction.getCurrencyIsoCode());
assertNotNull(transaction.getProcessorAuthorizationCode());
assertEquals(Transaction.Type.SALE, transaction.getType());
assertEquals(Transaction.Status.AUTHORIZED, transaction.getStatus());
assertEquals(Calendar.getInstance().get(Calendar.YEAR), transaction.getCreatedAt().get(Calendar.YEAR));
assertEquals(Calendar.getInstance().get(Calendar.YEAR), transaction.getUpdatedAt().get(Calendar.YEAR));
CreditCard creditCard = transaction.getCreditCard();
assertEquals("411111", creditCard.getBin());
assertEquals("1111", creditCard.getLast4());
assertEquals("05", creditCard.getExpirationMonth());
assertEquals("2009", creditCard.getExpirationYear());
assertEquals("05/2009", creditCard.getExpirationDate());
}
@Test
public void saleWithAccessToken() {
BraintreeGateway oauthGateway = new BraintreeGateway("client_id$development$integration_client_id", "client_secret$development$integration_client_secret");
String code = TestHelper.createOAuthGrant(oauthGateway, "integration_merchant_id", "read_write");
OAuthCredentialsRequest oauthRequest = new OAuthCredentialsRequest().
code(code).
scope("read_write");
Result<OAuthCredentials> accessTokenResult = oauthGateway.oauth().createTokenFromCode(oauthRequest);
BraintreeGateway gateway = new BraintreeGateway(accessTokenResult.getTarget().getAccessToken());
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(new BigDecimal("1000.00"), transaction.getAmount());
assertEquals("USD", transaction.getCurrencyIsoCode());
assertNotNull(transaction.getProcessorAuthorizationCode());
assertEquals(Transaction.Type.SALE, transaction.getType());
assertEquals(Transaction.Status.AUTHORIZED, transaction.getStatus());
}
@Test
public void saleReturnsRiskData() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertNotNull(transaction.getRiskData());
assertNotNull(transaction.getRiskData().getDecision());
}
@Test
public void saleWithCardTypeIndicators() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumbers.CardTypeIndicators.Prepaid.getValue()).
expirationDate("05/2012").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
CreditCard card = result.getTarget().getCreditCard();
assertEquals(CreditCard.Prepaid.YES, card.getPrepaid());
assertEquals(CreditCard.Healthcare.UNKNOWN, card.getHealthcare());
assertEquals(CreditCard.Payroll.UNKNOWN, card.getPayroll());
assertEquals(CreditCard.Debit.UNKNOWN, card.getDebit());
assertEquals(CreditCard.DurbinRegulated.UNKNOWN, card.getDurbinRegulated());
assertEquals(CreditCard.Commercial.UNKNOWN, card.getCommercial());
assertEquals("Unknown", card.getCountryOfIssuance());
assertEquals("Unknown", card.getIssuingBank());
assertEquals("Unknown", card.getProductId());
}
@Test
public void saleWithAllAttributes() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
channel("MyShoppingCartProvider").
orderId("123").
creditCard().
cardholderName("The Cardholder").
number(CreditCardNumber.VISA.number).
cvv("321").
expirationDate("05/2009").
done().
customer().
firstName("Dan").
lastName("Smith").
company("Braintree Payment Solutions").
email("dan@example.com").
phone("419-555-1234").
fax("419-555-1235").
website("http://braintreepayments.com").
done().
billingAddress().
firstName("Carl").
lastName("Jones").
company("Braintree").
streetAddress("123 E Main St").
extendedAddress("Suite 403").
locality("Chicago").
region("IL").
postalCode("60622").
countryName("United States of America").
countryCodeAlpha2("US").
countryCodeAlpha3("USA").
countryCodeNumeric("840").
done().
shippingAddress().
firstName("Andrew").
lastName("Mason").
company("Braintree Shipping").
streetAddress("456 W Main St").
extendedAddress("Apt 2F").
locality("Bartlett").
region("MA").
postalCode("60103").
countryName("Mexico").
countryCodeAlpha2("MX").
countryCodeAlpha3("MEX").
countryCodeNumeric("484").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(new BigDecimal("1000.00"), transaction.getAmount());
assertEquals(Transaction.Status.AUTHORIZED, transaction.getStatus());
assertEquals("MyShoppingCartProvider", transaction.getChannel());
assertEquals("123", transaction.getOrderId());
assertNull(transaction.getVaultCreditCard(gateway));
assertNull(transaction.getVaultCustomer(gateway));
assertNull(transaction.getAvsErrorResponseCode());
assertEquals("M", transaction.getAvsPostalCodeResponseCode());
assertEquals("M", transaction.getAvsStreetAddressResponseCode());
assertEquals("M", transaction.getCvvResponseCode());
assertFalse(transaction.isTaxExempt());
assertNull(transaction.getVaultCreditCard(gateway));
CreditCard creditCard = transaction.getCreditCard();
assertEquals("411111", creditCard.getBin());
assertEquals("1111", creditCard.getLast4());
assertEquals("05", creditCard.getExpirationMonth());
assertEquals("2009", creditCard.getExpirationYear());
assertEquals("05/2009", creditCard.getExpirationDate());
assertEquals("The Cardholder", creditCard.getCardholderName());
assertNull(transaction.getVoiceReferralNumber());
assertNull(transaction.getVaultCustomer(gateway));
Customer customer = transaction.getCustomer();
assertEquals("Dan", customer.getFirstName());
assertEquals("Smith", customer.getLastName());
assertEquals("Braintree Payment Solutions", customer.getCompany());
assertEquals("dan@example.com", customer.getEmail());
assertEquals("419-555-1234", customer.getPhone());
assertEquals("419-555-1235", customer.getFax());
assertEquals("http://braintreepayments.com", customer.getWebsite());
assertNull(transaction.getVaultBillingAddress(gateway));
Address billing = transaction.getBillingAddress();
assertEquals("Carl", billing.getFirstName());
assertEquals("Jones", billing.getLastName());
assertEquals("Braintree", billing.getCompany());
assertEquals("123 E Main St", billing.getStreetAddress());
assertEquals("Suite 403", billing.getExtendedAddress());
assertEquals("Chicago", billing.getLocality());
assertEquals("IL", billing.getRegion());
assertEquals("60622", billing.getPostalCode());
assertEquals("United States of America", billing.getCountryName());
assertEquals("US", billing.getCountryCodeAlpha2());
assertEquals("USA", billing.getCountryCodeAlpha3());
assertEquals("840", billing.getCountryCodeNumeric());
assertNull(transaction.getVaultShippingAddress(gateway));
Address shipping = transaction.getShippingAddress();
assertEquals("Andrew", shipping.getFirstName());
assertEquals("Mason", shipping.getLastName());
assertEquals("Braintree Shipping", shipping.getCompany());
assertEquals("456 W Main St", shipping.getStreetAddress());
assertEquals("Apt 2F", shipping.getExtendedAddress());
assertEquals("Bartlett", shipping.getLocality());
assertEquals("MA", shipping.getRegion());
assertEquals("60103", shipping.getPostalCode());
assertEquals("Mexico", shipping.getCountryName());
assertEquals("MX", shipping.getCountryCodeAlpha2());
assertEquals("MEX", shipping.getCountryCodeAlpha3());
assertEquals("484", shipping.getCountryCodeNumeric());
}
@Test
public void saleWithSpecifyingMerchantAccountId() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(NON_DEFAULT_MERCHANT_ACCOUNT_ID, transaction.getMerchantAccountId());
}
@Test
public void saleWithoutSpecifyingMerchantAccountIdFallsBackToDefault() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(DEFAULT_MERCHANT_ACCOUNT_ID, transaction.getMerchantAccountId());
}
@Test
public void saleWithStoreInVaultAndSpecifyingToken() {
String customerId = String.valueOf(new Random().nextInt());
String paymentToken = String.valueOf(new Random().nextInt());
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
token(paymentToken).
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
customer().
id(customerId).
firstName("Jane").
done().
options().
storeInVault(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
CreditCard creditCard = transaction.getCreditCard();
assertEquals(paymentToken, creditCard.getToken());
assertEquals("05/2009", transaction.getVaultCreditCard(gateway).getExpirationDate());
Customer customer = transaction.getCustomer();
assertEquals(customerId, customer.getId());
assertEquals("Jane", transaction.getVaultCustomer(gateway).getFirstName());
}
@Test
public void saleWithStoreInVaultWithoutSpecifyingToken() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
customer().
firstName("Jane").
done().
options().
storeInVault(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
CreditCard creditCard = transaction.getCreditCard();
assertNotNull(creditCard.getToken());
assertEquals("05/2009", transaction.getVaultCreditCard(gateway).getExpirationDate());
Customer customer = transaction.getCustomer();
assertNotNull(customer.getId());
assertEquals("Jane", transaction.getVaultCustomer(gateway).getFirstName());
}
@Test
public void saleWithStoreInVaultOnSuccessWhenTransactionSucceeds() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
customer().
firstName("Jane").
done().
options().
storeInVaultOnSuccess(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
CreditCard creditCard = transaction.getCreditCard();
assertNotNull(creditCard.getToken());
assertEquals("05/2009", transaction.getVaultCreditCard(gateway).getExpirationDate());
Customer customer = transaction.getCustomer();
assertNotNull(customer.getId());
assertEquals("Jane", transaction.getVaultCustomer(gateway).getFirstName());
}
@Test
public void saleWithStoreInVaultOnSuccessWhenTransactionFails() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.DECLINE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
customer().
firstName("Jane").
done().
options().
storeInVaultOnSuccess(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
Transaction transaction = result.getTransaction();
CreditCard creditCard = transaction.getCreditCard();
assertNull(creditCard.getToken());
assertNull(transaction.getVaultCreditCard(gateway));
Customer customer = transaction.getCustomer();
assertNull(customer.getId());
assertNull(transaction.getVaultCustomer(gateway));
}
@Test
public void saleWithStoreInVaultForBillingAndShipping() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
billingAddress().
firstName("Carl").
done().
shippingAddress().
firstName("Andrew").
done().
options().
storeInVault(true).
addBillingAddressToPaymentMethod(true).
storeShippingAddressInVault(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
CreditCard creditCard = transaction.getVaultCreditCard(gateway);
assertEquals("Carl", creditCard.getBillingAddress().getFirstName());
assertEquals("Carl", transaction.getVaultBillingAddress(gateway).getFirstName());
assertEquals("Andrew", transaction.getVaultShippingAddress(gateway).getFirstName());
Customer customer = transaction.getVaultCustomer(gateway);
assertEquals(2, customer.getAddresses().size());
List<Address> addresses = new ArrayList<Address>(customer.getAddresses());
Collections.sort(addresses, new Comparator<Address>() {
public int compare(Address left, Address right) {
return left.getFirstName().compareTo(right.getFirstName());
}
});
assertEquals("Andrew", addresses.get(0).getFirstName());
assertEquals("Carl", addresses.get(1).getFirstName());
assertNotNull(transaction.getBillingAddress().getId());
assertNotNull(transaction.getShippingAddress().getId());
}
@Test
public void saleWithVaultCustomerAndNewCreditCard() {
Customer customer = gateway.customer().create(new CustomerRequest().
firstName("Michael").
lastName("Angelo").
company("Some Company")
).getTarget();
TransactionRequest request = new TransactionRequest().
amount(SandboxValues.TransactionAmount.AUTHORIZE.amount).
customerId(customer.getId()).
creditCard().
cardholderName("Bob the Builder").
number(SandboxValues.CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals("Bob the Builder", transaction.getCreditCard().getCardholderName());
assertNull(transaction.getVaultCreditCard(gateway));
}
@Test
public void saleWithVaultCustomerAndNewCreditCardStoresInVault() {
Customer customer = gateway.customer().create(new CustomerRequest().
firstName("Michael").
lastName("Angelo").
company("Some Company")
).getTarget();
TransactionRequest request = new TransactionRequest().
amount(SandboxValues.TransactionAmount.AUTHORIZE.amount).
customerId(customer.getId()).
creditCard().
cardholderName("Bob the Builder").
number(SandboxValues.CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
options().
storeInVault(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals("Bob the Builder", transaction.getCreditCard().getCardholderName());
assertEquals("Bob the Builder", transaction.getVaultCreditCard(gateway).getCardholderName());
}
@Test
public void saleWithApplePayNonce() {
String applePayNonce = Nonce.ApplePayAmex;
TransactionRequest request = new TransactionRequest().
amount(SandboxValues.TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(applePayNonce);
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(PaymentInstrumentType.APPLE_PAY_CARD, transaction.getPaymentInstrumentType());
assertNotNull(transaction.getApplePayDetails());
assertNotNull(transaction.getApplePayDetails().getCardType());
assertNotNull(transaction.getApplePayDetails().getPaymentInstrumentName());
assertNotNull(transaction.getApplePayDetails().getSourceDescription());
assertNotNull(transaction.getApplePayDetails().getExpirationMonth());
assertNotNull(transaction.getApplePayDetails().getExpirationYear());
assertNotNull(transaction.getApplePayDetails().getCardholderName());
assertNotNull(transaction.getApplePayDetails().getLast4());
}
@Test
public void saleWithAndroidPayProxyCardNonce() {
String androidPayCardNonce = Nonce.AndroidPayDiscover;
TransactionRequest request = new TransactionRequest().
amount(SandboxValues.TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(androidPayCardNonce);
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(PaymentInstrumentType.ANDROID_PAY_CARD, transaction.getPaymentInstrumentType());
assertNotNull(transaction.getAndroidPayDetails());
AndroidPayDetails androidPayDetails = transaction.getAndroidPayDetails();
assertNull(androidPayDetails.getToken());
assertNotNull(androidPayDetails.getBin());
assertNotNull(androidPayDetails.getImageUrl());
assertNotNull(androidPayDetails.getSourceCardType());
assertNotNull(androidPayDetails.getSourceCardLast4());
assertNotNull(androidPayDetails.getSourceDescription());
assertNotNull(androidPayDetails.getVirtualCardType());
assertNotNull(androidPayDetails.getVirtualCardLast4());
assertNotNull(androidPayDetails.getGoogleTransactionId());
assertNotNull(androidPayDetails.getCardType());
assertNotNull(androidPayDetails.getLast4());
assertNotNull(androidPayDetails.getExpirationMonth());
assertNotNull(androidPayDetails.getExpirationYear());
}
@Test
public void saleWithAndroidPayNetworkTokenNonce() {
String androidPayCardNonce = Nonce.AndroidPayMasterCard;
TransactionRequest request = new TransactionRequest().
amount(SandboxValues.TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(androidPayCardNonce);
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(PaymentInstrumentType.ANDROID_PAY_CARD, transaction.getPaymentInstrumentType());
assertNotNull(transaction.getAndroidPayDetails());
AndroidPayDetails androidPayDetails = transaction.getAndroidPayDetails();
assertNull(androidPayDetails.getToken());
assertNotNull(androidPayDetails.getBin());
assertNotNull(androidPayDetails.getImageUrl());
assertNotNull(androidPayDetails.getSourceCardType());
assertNotNull(androidPayDetails.getSourceCardLast4());
assertNotNull(androidPayDetails.getSourceDescription());
assertNotNull(androidPayDetails.getVirtualCardType());
assertNotNull(androidPayDetails.getVirtualCardLast4());
assertNotNull(androidPayDetails.getGoogleTransactionId());
assertNotNull(androidPayDetails.getCardType());
assertNotNull(androidPayDetails.getLast4());
assertNotNull(androidPayDetails.getExpirationMonth());
assertNotNull(androidPayDetails.getExpirationYear());
}
@Test
public void saleWithAmexExpressCheckoutCardNonce() {
String amexExpressCheckoutCardNonce = Nonce.AmexExpressCheckout;
TransactionRequest request = new TransactionRequest().
merchantAccountId(FAKE_AMEX_DIRECT_MERCHANT_ACCOUNT_ID).
amount(SandboxValues.TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(amexExpressCheckoutCardNonce);
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(PaymentInstrumentType.AMEX_EXPRESS_CHECKOUT_CARD, transaction.getPaymentInstrumentType());
assertNotNull(transaction.getAmexExpressCheckoutDetails());
AmexExpressCheckoutDetails amexExpressCheckoutDetails = transaction.getAmexExpressCheckoutDetails();
assertNull(amexExpressCheckoutDetails.getToken());
assertNotNull(amexExpressCheckoutDetails.getCardType());
assertNotNull(amexExpressCheckoutDetails.getBin());
assertNotNull(amexExpressCheckoutDetails.getExpirationMonth());
assertNotNull(amexExpressCheckoutDetails.getExpirationYear());
assertNotNull(amexExpressCheckoutDetails.getCardMemberNumber());
assertNotNull(amexExpressCheckoutDetails.getCardMemberExpiryDate());
assertNotNull(amexExpressCheckoutDetails.getImageUrl());
assertNotNull(amexExpressCheckoutDetails.getSourceDescription());
}
@Test
public void saleWithVenmoAccountNonce() {
String venmoAccountNonce = Nonce.VenmoAccount;
TransactionRequest request = new TransactionRequest()
.merchantAccountId(FAKE_VENMO_ACCOUNT_MERCHANT_ACCOUNT_ID)
.amount(SandboxValues.TransactionAmount.AUTHORIZE.amount)
.paymentMethodNonce(venmoAccountNonce);
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(PaymentInstrumentType.VENMO_ACCOUNT, transaction.getPaymentInstrumentType());
VenmoAccountDetails venmoAccountDetails = transaction.getVenmoAccountDetails();
assertNotNull(venmoAccountDetails);
assertNull(venmoAccountDetails.getToken());
assertNotNull(venmoAccountDetails.getUsername());
assertNotNull(venmoAccountDetails.getVenmoUserId());
assertNotNull(venmoAccountDetails.getImageUrl());
assertNotNull(venmoAccountDetails.getSourceDescription());
}
@Test
public void saleWithThreeDSecureOptionRequired() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(THREE_D_SECURE_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
options().
threeDSecure().
required(true).
done().
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
Transaction transaction = result.getTransaction();
assertEquals(Transaction.Status.GATEWAY_REJECTED, transaction.getStatus());
assertEquals(Transaction.GatewayRejectionReason.THREE_D_SECURE, transaction.getGatewayRejectionReason());
}
@Test
public void saleWithThreeDSecureToken() {
String threeDSecureToken = TestHelper.createTest3DS(gateway, THREE_D_SECURE_MERCHANT_ACCOUNT_ID, new ThreeDSecureRequestForTests().
number(CreditCardNumber.VISA.number).
expirationMonth("05").
expirationYear("2009")
);
TransactionRequest request = new TransactionRequest().
merchantAccountId(THREE_D_SECURE_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
threeDSecureToken(threeDSecureToken).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(Transaction.Status.AUTHORIZED, transaction.getStatus());
}
@Test
public void saleErrorWithNullThreeDSecureToken() {
String threeDSecureToken = null;
TransactionRequest request = new TransactionRequest().
merchantAccountId(THREE_D_SECURE_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
threeDSecureToken(threeDSecureToken).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_THREE_D_SECURE_TOKEN_IS_INVALID,
result.getErrors().forObject("transaction").onField("threeDSecureToken").get(0).getCode());
}
@Test
public void saleErrorWithMismatchedThreeDSecureData() {
String threeDSecureToken = TestHelper.createTest3DS(gateway, THREE_D_SECURE_MERCHANT_ACCOUNT_ID, new ThreeDSecureRequestForTests().
number(CreditCardNumber.VISA.number).
expirationMonth("05").
expirationYear("2009")
);
TransactionRequest request = new TransactionRequest().
merchantAccountId(THREE_D_SECURE_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
threeDSecureToken(threeDSecureToken).
creditCard().
number(CreditCardNumber.MASTER_CARD.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_THREE_D_SECURE_TRANSACTION_DATA_DOESNT_MATCH_VERIFY,
result.getErrors().forObject("transaction").onField("threeDSecureToken").get(0).getCode());
}
@Test
public void saleWithThreeDSecurePassThru() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(THREE_D_SECURE_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
threeDSecurePassThru().
eciFlag("02").
cavv("some_cavv").
xid("some_xid").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(Transaction.Status.AUTHORIZED, transaction.getStatus());
}
@Test
public void saleErrorWithThreeDSecurePassThruWhenMerchantAccountDoesNotSupportCardType() {
TransactionRequest request = new TransactionRequest().
merchantAccountId("adyen_ma").
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
threeDSecurePassThru().
eciFlag("02").
cavv("some_cavv").
xid("some_xid").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_THREE_D_SECURE_PASS_THRU_MERCHANT_ACCOUNT_DOES_NOT_SUPPORT_CARD_TYPE,
result.getErrors().forObject("transaction").onField("merchantAccountId").get(0).getCode());
}
@Test
public void saleErrorWithMissingThreeDSecurePassThruEciFlag() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(THREE_D_SECURE_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
threeDSecurePassThru().
eciFlag("").
cavv("some_cavv").
xid("some_xid").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_THREE_D_SECURE_PASS_THRU_ECI_FLAG_IS_REQUIRED,
result.getErrors().forObject("transaction").forObject("threeDSecurePassThru").onField("eciFlag").get(0).getCode());
}
@Test
public void saleErrorWithMissingThreeDSecurePassThruCavvOrXid() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(THREE_D_SECURE_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
threeDSecurePassThru().
eciFlag("05").
cavv("").
xid("").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_THREE_D_SECURE_PASS_THRU_CAVV_IS_REQUIRED,
result.getErrors().forObject("transaction").forObject("threeDSecurePassThru").onField("cavv").get(0).getCode());
}
@Test
public void saleErrorWithInvalidThreeDSecurePassThruEciFlag() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(THREE_D_SECURE_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
threeDSecurePassThru().
eciFlag("bad_eci_flag").
cavv("some_cavv").
xid("some_xid").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_THREE_D_SECURE_PASS_THRU_ECI_FLAG_IS_INVALID,
result.getErrors().forObject("transaction").forObject("threeDSecurePassThru").onField("eciFlag").get(0).getCode());
}
@Test
public void saleWithUsBankAccountNonce() {
TransactionRequest request = new TransactionRequest()
.merchantAccountId("us_bank_merchant_account")
.amount(SandboxValues.TransactionAmount.AUTHORIZE.amount)
.paymentMethodNonce(TestHelper.generateValidUsBankAccountNonce(gateway))
.options()
.submitForSettlement(true)
.storeInVault(true)
.done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(new BigDecimal("1000.00"), transaction.getAmount());
assertEquals("USD", transaction.getCurrencyIsoCode());
assertEquals(Transaction.Type.SALE, transaction.getType());
assertEquals(Transaction.Status.SETTLEMENT_PENDING, transaction.getStatus());
UsBankAccountDetails usBankAccountDetails = transaction.getUsBankAccountDetails();
assertEquals("021000021", usBankAccountDetails.getRoutingNumber());
assertEquals("1234", usBankAccountDetails.getLast4());
assertEquals("checking", usBankAccountDetails.getAccountType());
assertEquals("Dan Schulman", usBankAccountDetails.getAccountHolderName());
assertTrue(Pattern.matches(".*CHASE.*", usBankAccountDetails.getBankName()));
AchMandate achMandate = usBankAccountDetails.getAchMandate();
assertEquals("cl mandate text", achMandate.getText());
assertNotNull(achMandate.getAcceptedAt());
}
@Test
public void saleWithUsBankAccountNonceAndVaultedToken() {
TransactionRequest request = new TransactionRequest()
.merchantAccountId("us_bank_merchant_account")
.amount(SandboxValues.TransactionAmount.AUTHORIZE.amount)
.paymentMethodNonce(TestHelper.generateValidUsBankAccountNonce(gateway))
.options()
.submitForSettlement(true)
.storeInVault(true)
.done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(new BigDecimal("1000.00"), transaction.getAmount());
assertEquals("USD", transaction.getCurrencyIsoCode());
assertEquals(Transaction.Type.SALE, transaction.getType());
assertEquals(Transaction.Status.SETTLEMENT_PENDING, transaction.getStatus());
UsBankAccountDetails usBankAccountDetails = transaction.getUsBankAccountDetails();
assertEquals("021000021", usBankAccountDetails.getRoutingNumber());
assertEquals("1234", usBankAccountDetails.getLast4());
assertEquals("checking", usBankAccountDetails.getAccountType());
assertEquals("Dan Schulman", usBankAccountDetails.getAccountHolderName());
assertTrue(Pattern.matches(".*CHASE.*", usBankAccountDetails.getBankName()));
AchMandate achMandate = usBankAccountDetails.getAchMandate();
assertEquals("cl mandate text", achMandate.getText());
assertNotNull(achMandate.getAcceptedAt());
request = new TransactionRequest()
.merchantAccountId("us_bank_merchant_account")
.amount(SandboxValues.TransactionAmount.AUTHORIZE.amount)
.paymentMethodToken(transaction.getUsBankAccountDetails().getToken())
.options()
.submitForSettlement(true)
.done();
result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
transaction = result.getTarget();
assertEquals(new BigDecimal("1000.00"), transaction.getAmount());
assertEquals("USD", transaction.getCurrencyIsoCode());
assertEquals(Transaction.Type.SALE, transaction.getType());
assertEquals(Transaction.Status.SETTLEMENT_PENDING, transaction.getStatus());
usBankAccountDetails = transaction.getUsBankAccountDetails();
assertEquals("021000021", usBankAccountDetails.getRoutingNumber());
assertEquals("1234", usBankAccountDetails.getLast4());
assertEquals("checking", usBankAccountDetails.getAccountType());
assertEquals("Dan Schulman", usBankAccountDetails.getAccountHolderName());
assertTrue(Pattern.matches(".*CHASE.*", usBankAccountDetails.getBankName()));
achMandate = usBankAccountDetails.getAchMandate();
assertEquals("cl mandate text", achMandate.getText());
assertNotNull(achMandate.getAcceptedAt());
}
@Test
public void saleWithInvalidUsBankAccountNonce() {
TransactionRequest request = new TransactionRequest()
.merchantAccountId("us_bank_merchant_account")
.amount(SandboxValues.TransactionAmount.AUTHORIZE.amount)
.paymentMethodNonce(TestHelper.generateInvalidUsBankAccountNonce())
.options()
.submitForSettlement(true)
.storeInVault(true)
.done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_PAYMENT_METHOD_NONCE_UNKNOWN,
result.getErrors().forObject("transaction").onField("paymentMethodNonce").get(0).getCode());
}
@Test
public void saleWithIdealPaymentId() {
TransactionRequest request = new TransactionRequest()
.merchantAccountId("ideal_merchant_account")
.amount(SandboxValues.TransactionAmount.AUTHORIZE.amount)
.paymentMethodNonce(TestHelper.generateValidIdealPaymentId(gateway))
.orderId("ABC123")
.options()
.submitForSettlement(true)
.done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(Transaction.Status.SETTLED, transaction.getStatus());
IdealPaymentDetails idealPaymentDetails = transaction.getIdealPaymentDetails();
assertTrue(Pattern.matches("^idealpayment_\\w{6,}$", idealPaymentDetails.getIdealPaymentId()));
assertTrue(Pattern.matches("^\\d{16,}$", idealPaymentDetails.getIdealTransactionId()));
assertTrue(idealPaymentDetails.getImageUrl().startsWith("https://"));
assertNotNull(idealPaymentDetails.getMaskedIban());
assertNotNull(idealPaymentDetails.getBic());
}
@Test
public void saleWithInvalidIdealPaymentId() {
BigDecimal amount = new BigDecimal("3.00");
TransactionRequest request = new TransactionRequest()
.merchantAccountId("ideal_merchant_account")
.amount(amount)
.paymentMethodNonce(TestHelper.generateValidIdealPaymentId(gateway, amount))
.options()
.submitForSettlement(true)
.done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_IDEAL_PAYMENT_NOT_COMPLETE,
result.getErrors().forObject("transaction").onField("paymentMethodNonce").get(0).getCode());
}
@Test
public void saleWithAmexRewards() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(FAKE_AMEX_DIRECT_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.AmexPayWithPoints.SUCCESS.number).
expirationDate("12/2020").
done()
.options().
submitForSettlement(true).
amexRewards().
requestId("ABC123").
points("1000").
currencyAmount("10.00").
currencyIsoCode("USD").
done().
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, transaction.getStatus());
}
@Test
public void saleWithAmexRewardsSucceedsEvenIfCardIneligible() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(FAKE_AMEX_DIRECT_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.AmexPayWithPoints.INELIGIBLE_CARD.number).
expirationDate("12/2020").
done()
.options().
submitForSettlement(true).
amexRewards().
requestId("ABC123").
points("1000").
currencyAmount("10.00").
currencyIsoCode("USD").
done().
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, transaction.getStatus());
}
@Test
public void saleWithAmexRewardsSucceedsEvenIfCardBalanceIsInsufficient() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(FAKE_AMEX_DIRECT_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.AmexPayWithPoints.INSUFFICIENT_POINTS.number).
expirationDate("12/2020").
done()
.options().
submitForSettlement(true).
amexRewards().
requestId("ABC123").
points("1000").
currencyAmount("10.00").
currencyIsoCode("USD").
done().
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, transaction.getStatus());
}
@Test
public void submitForSettlementWithAmexRewards() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
merchantAccountId(FAKE_AMEX_DIRECT_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.AmexPayWithPoints.SUCCESS.number).
expirationDate("12/2020").
done()
.options().
amexRewards().
requestId("ABC123").
points("1000").
currencyAmount("10.00").
currencyIsoCode("USD").
done().
done();
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertEquals(Transaction.Status.AUTHORIZED, saleResult.getTarget().getStatus());
Result<Transaction> submitForSettlementResult = gateway.transaction().submitForSettlement(saleResult.getTarget().getId());
assertTrue(submitForSettlementResult.isSuccess());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, submitForSettlementResult.getTarget().getStatus());
}
@Test
public void submitForSettlementWithAmexRewardsSucceedsEvenIfCardIsIneligible() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
merchantAccountId(FAKE_AMEX_DIRECT_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.AmexPayWithPoints.INELIGIBLE_CARD.number).
expirationDate("12/2020").
done()
.options().
amexRewards().
requestId("ABC123").
points("1000").
currencyAmount("10.00").
currencyIsoCode("USD").
done().
done();
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertEquals(Transaction.Status.AUTHORIZED, saleResult.getTarget().getStatus());
Result<Transaction> submitForSettlementResult = gateway.transaction().submitForSettlement(saleResult.getTarget().getId());
assertTrue(submitForSettlementResult.isSuccess());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, submitForSettlementResult.getTarget().getStatus());
}
@Test
public void submitForSettlementWithAmexRewardsSucceedsEvenIfCardBalanceIsInsufficient() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
merchantAccountId(FAKE_AMEX_DIRECT_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.AmexPayWithPoints.INSUFFICIENT_POINTS.number).
expirationDate("12/2020").
done()
.options().
amexRewards().
requestId("ABC123").
points("1000").
currencyAmount("10.00").
currencyIsoCode("USD").
done().
done();
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertEquals(Transaction.Status.AUTHORIZED, saleResult.getTarget().getStatus());
Result<Transaction> submitForSettlementResult = gateway.transaction().submitForSettlement(saleResult.getTarget().getId());
assertTrue(submitForSettlementResult.isSuccess());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, submitForSettlementResult.getTarget().getStatus());
}
@Test
public void saleDeclined() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.DECLINE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
Transaction transaction = result.getTransaction();
assertEquals(new BigDecimal("2000.00"), transaction.getAmount());
assertEquals(Transaction.Status.PROCESSOR_DECLINED, transaction.getStatus());
assertEquals("2000", transaction.getProcessorResponseCode());
assertNotNull(transaction.getProcessorResponseText());
assertEquals("2000 : Do Not Honor", transaction.getAdditionalProcessorResponse());
CreditCard creditCard = transaction.getCreditCard();
assertEquals("411111", creditCard.getBin());
assertEquals("1111", creditCard.getLast4());
assertEquals("05", creditCard.getExpirationMonth());
assertEquals("2009", creditCard.getExpirationYear());
assertEquals("05/2009", creditCard.getExpirationDate());
}
@Test
public void saleWithFraudCardIsDeclined() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.FRAUD.number).
expirationDate("05/2016").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
Transaction transaction = result.getTransaction();
assertEquals(Transaction.Status.GATEWAY_REJECTED, transaction.getStatus());
assertEquals(Transaction.GatewayRejectionReason.FRAUD, transaction.getGatewayRejectionReason());
}
@Test
public void saleWithSecurityParams() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
deviceSessionId("abc123").
fraudMerchantId("456").
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
}
@Test
public void saleWithRiskDataParam() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
riskData().
customerBrowser("IE6").
customerIP("192.168.0.1").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
}
@Test
public void saleWithCustomFields() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
customField("storeMe", "custom value").
customField("another_stored_field", "custom value2").
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
Map<String, String> expected = new HashMap<String, String>();
expected.put("store_me", "custom value");
expected.put("another_stored_field", "custom value2");
assertEquals(expected, transaction.getCustomFields());
}
@Test
public void saleReturnsCreditCardPaymentInstrumentType() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(
PaymentInstrumentType.CREDIT_CARD,
transaction.getPaymentInstrumentType()
);
}
@Test
public void saleWithRecurringFlag() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
recurring(true).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertTrue(transaction.getRecurring());
}
@Test
public void saleWithTransactinSourceAsRecurring() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
transactionSource("recurring").
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertTrue(transaction.getRecurring());
}
@Test
public void saleWithaTransactionAsMoto() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
transactionSource("moto").
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertFalse(transaction.getRecurring());
}
@Test
public void saleWithValidationErrorsOnAddress() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.DECLINE.amount).
customField("unkown_custom_field", "custom value").
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
billingAddress().
countryName("No such country").
countryCodeAlpha2("zz").
countryCodeAlpha3("zzz").
countryCodeNumeric("000").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED,
result.getErrors().forObject("transaction").forObject("billing").onField("countryName").get(0).getCode());
assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_CODE_ALPHA2_IS_NOT_ACCEPTED,
result.getErrors().forObject("transaction").forObject("billing").onField("countryCodeAlpha2").get(0).getCode());
assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_CODE_ALPHA3_IS_NOT_ACCEPTED,
result.getErrors().forObject("transaction").forObject("billing").onField("countryCodeAlpha3").get(0).getCode());
assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_CODE_NUMERIC_IS_NOT_ACCEPTED,
result.getErrors().forObject("transaction").forObject("billing").onField("countryCodeNumeric").get(0).getCode());
}
@Test
public void saleWithUnregisteredCustomField() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.DECLINE.amount).
customField("unkown_custom_field", "custom value").
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_CUSTOM_FIELD_IS_INVALID,
result.getErrors().forObject("transaction").onField("customFields").get(0).getCode());
}
@Test
public void saleWithMultipleValidationErrorsOnSameField() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodToken("foo").
customerId("5").
creditCard().
number(CreditCardNumber.VISA.number).
cvv("321").
expirationDate("04/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
List<ValidationError> errros = result.getErrors().forObject("transaction").onField("base");
assertNull(result.getTransaction());
assertNull(result.getCreditCardVerification());
assertEquals(2, errros.size());
List<ValidationErrorCode> validationErrorCodes = new ArrayList<ValidationErrorCode>();
validationErrorCodes.add(errros.get(0).getCode());
validationErrorCodes.add(errros.get(1).getCode());
assertTrue(validationErrorCodes.contains(ValidationErrorCode.TRANSACTION_PAYMENT_METHOD_CONFLICT_WITH_VENMO_SDK));
assertTrue(validationErrorCodes.contains(ValidationErrorCode.TRANSACTION_PAYMENT_METHOD_DOES_NOT_BELONG_TO_CUSTOMER));
}
@Test
public void saleWithCustomerId() {
Customer customer = gateway.customer().create(new CustomerRequest()).getTarget();
CreditCardRequest creditCardRequest = new CreditCardRequest().
customerId(customer.getId()).
cvv("123").
number("5105105105105100").
expirationDate("05/12");
CreditCard creditCard = gateway.creditCard().create(creditCardRequest).getTarget();
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodToken(creditCard.getToken());
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(creditCard.getToken(), transaction.getCreditCard().getToken());
assertEquals("510510", transaction.getCreditCard().getBin());
assertEquals("05/2012", transaction.getCreditCard().getExpirationDate());
}
@Test
public void saleWithPaymentMethodTokenAndCvv() {
Customer customer = gateway.customer().create(new CustomerRequest()).getTarget();
CreditCardRequest creditCardRequest = new CreditCardRequest().
customerId(customer.getId()).
number("5105105105105100").
expirationDate("05/12");
CreditCard creditCard = gateway.creditCard().create(creditCardRequest).getTarget();
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodToken(creditCard.getToken()).
creditCard().cvv("301").done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(creditCard.getToken(), transaction.getCreditCard().getToken());
assertEquals("510510", transaction.getCreditCard().getBin());
assertEquals("05/2012", transaction.getCreditCard().getExpirationDate());
assertEquals("S", transaction.getCvvResponseCode());
}
@Test
public void saleWithPaymentMethodTokenAndNonce() {
Customer customer = gateway.customer().create(new CustomerRequest()).getTarget();
CreditCardRequest creditCardRequest = new CreditCardRequest().
customerId(customer.getId()).
number("5105105105105100").
expirationDate("05/12");
CreditCard creditCard = gateway.creditCard().create(creditCardRequest).getTarget();
CreditCardRequest cvvRequest = new CreditCardRequest().cvv("123");
String nonce = TestHelper.generateNonceForCreditCard(gateway, cvvRequest, customer.getId(), false);
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodToken(creditCard.getToken()).
paymentMethodNonce(nonce);
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals("M", transaction.getCvvResponseCode());
}
@Test
public void saleUsesShippingAddressFromVault() {
Customer customer = gateway.customer().create(new CustomerRequest()).getTarget();
gateway.creditCard().create(new CreditCardRequest().
customerId(customer.getId()).
cvv("123").
number("5105105105105100").
expirationDate("05/12")).getTarget();
Address shippingAddress = gateway.address().create(customer.getId(),
new AddressRequest().firstName("Carl")).getTarget();
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
customerId(customer.getId()).
shippingAddressId(shippingAddress.getId());
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(shippingAddress.getId(), transaction.getShippingAddress().getId());
assertEquals("Carl", transaction.getShippingAddress().getFirstName());
}
@Test
public void saleUsesBillingAddressFromVault() {
Customer customer = gateway.customer().create(new CustomerRequest()).getTarget();
gateway.creditCard().create(new CreditCardRequest().
customerId(customer.getId()).
cvv("123").
number("5105105105105100").
expirationDate("05/12")).getTarget();
Address billingAddress = gateway.address().create(customer.getId(),
new AddressRequest().firstName("Carl")).getTarget();
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
customerId(customer.getId()).
billingAddressId(billingAddress.getId());
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(billingAddress.getId(), transaction.getBillingAddress().getId());
assertEquals("Carl", transaction.getBillingAddress().getFirstName());
}
@Test
public void saleWithValidationError() {
TransactionRequest request = new TransactionRequest().
amount(null).
creditCard().
expirationMonth("05").
expirationYear("2010").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertNull(result.getTarget());
assertEquals(ValidationErrorCode.TRANSACTION_AMOUNT_IS_REQUIRED, result.getErrors().forObject("transaction").onField("amount").get(0).getCode());
Map<String, String> parameters = result.getParameters();
assertEquals(null, parameters.get("transaction[amount]"));
assertEquals("05", parameters.get("transaction[credit_card][expiration_month]"));
assertEquals("2010", parameters.get("transaction[credit_card][expiration_year]"));
}
@Test
public void saleWithSubmitForSettlement() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
options().
submitForSettlement(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, transaction.getStatus());
}
@Test
public void saleWithDescriptor() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
descriptor().
name("123*123456789012345678").
phone("3334445555").
url("ebay.com").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals("123*123456789012345678", transaction.getDescriptor().getName());
assertEquals("3334445555", transaction.getDescriptor().getPhone());
assertEquals("ebay.com", transaction.getDescriptor().getUrl());
}
@Test
public void saleWithDescriptorValidation() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
descriptor().
name("badcompanyname12*badproduct12").
phone("%bad4445555").
url("12345678901234").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.DESCRIPTOR_NAME_FORMAT_IS_INVALID,
result.getErrors().forObject("transaction").forObject("descriptor").onField("name").get(0).getCode());
assertEquals(ValidationErrorCode.DESCRIPTOR_PHONE_FORMAT_IS_INVALID,
result.getErrors().forObject("transaction").forObject("descriptor").onField("phone").get(0).getCode());
assertEquals(ValidationErrorCode.DESCRIPTOR_URL_FORMAT_IS_INVALID,
result.getErrors().forObject("transaction").forObject("descriptor").onField("url").get(0).getCode());
}
@Test
public void saleWithLodgingIndustryData() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
industry().
industryType(Transaction.IndustryType.LODGING).
data().
folioNumber("aaa").
checkInDate("2014-07-07").
checkOutDate("2014-08-08").
roomRate("2.00").
done().
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
}
@Test
public void saleWithIndustryDataValidation() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
industry().
industryType(Transaction.IndustryType.LODGING).
data().
folioNumber("aaa").
checkInDate("2014-07-07").
checkOutDate("2014-06-06").
done().
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.INDUSTRY_DATA_LODGING_CHECK_OUT_DATE_MUST_FOLLOW_CHECK_IN_DATE,
result.getErrors().forObject("transaction").forObject("industry").onField("checkOutDate").get(0).getCode());
}
@Test
public void saleWithTravelCruiseIndustryData() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
industry().
industryType(Transaction.IndustryType.TRAVEL_CRUISE).
data().
travelPackage("flight").
departureDate("2014-07-07").
lodgingCheckInDate("2014-07-07").
lodgingCheckOutDate("2014-08-08").
lodgingName("Disney").
done().
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
}
@Test
public void saleWithTravelCruiseIndustryDataValidation() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
industry().
industryType(Transaction.IndustryType.TRAVEL_CRUISE).
data().
travelPackage("plane").
departureDate("2014-07-07").
lodgingCheckInDate("2014-07-07").
lodgingCheckOutDate("2014-08-08").
lodgingName("Disney").
done().
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.INDUSTRY_DATA_TRAVEL_CRUISE_TRAVEL_PACKAGE_IS_INVALID,
result.getErrors().forObject("transaction").forObject("industry").onField("travelPackage").get(0).getCode());
}
@Test
public void saleWithLevel2() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
taxAmount(new BigDecimal("10.00")).
taxExempt(true).
purchaseOrderNumber("12345");
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(new BigDecimal("10.00"), transaction.getTaxAmount());
assertTrue(transaction.isTaxExempt());
assertEquals("12345", transaction.getPurchaseOrderNumber());
}
@Test
public void saleWithTooLongPurchaseOrderNumber() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
purchaseOrderNumber("aaaaaaaaaaaaaaaaaa");
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_PURCHASE_ORDER_NUMBER_IS_TOO_LONG,
result.getErrors().forObject("transaction").onField("purchaseOrderNumber").get(0).getCode());
}
@Test
public void saleWithInvalidPurchaseOrderNumber() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
purchaseOrderNumber("\u00c3\u009f\u00c3\u00a5\u00e2\u0088\u0082");
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_PURCHASE_ORDER_NUMBER_IS_INVALID,
result.getErrors().forObject("transaction").onField("purchaseOrderNumber").get(0).getCode());
}
@Test
public void saleWithVenmoSdkPaymentMethodCode() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
venmoSdkPaymentMethodCode(VenmoSdk.PaymentMethodCode.Visa.code);
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
assertEquals("411111", result.getTarget().getCreditCard().getBin());
}
@Test
public void saleWithVenmoSdkSession() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
options().
venmoSdkSession(VenmoSdk.Session.Valid.value).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
assertTrue(result.getTarget().getCreditCard().isVenmoSdk());
}
@Test
public void saleWithAdvancedFraudCheckingSkipped() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2016").
done().
options().
skipAdvancedFraudChecking(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
assertNull(result.getTarget().getRiskData().getId());
}
@Test
public void saleWithSkipAvsOptionSet() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2019").
done().
options().
skipAvs(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
assertNull(result.getTarget().getAvsErrorResponseCode());
assertEquals("B", result.getTarget().getAvsStreetAddressResponseCode());
}
@Test
public void saleWithSkipCvvOptionSet() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2019").
done().
options().
skipCvv(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
assertEquals("B", result.getTarget().getCvvResponseCode());
}
@Test
public void createTransactionFromTransparentRedirectWithAddress() {
TransactionRequest request = new TransactionRequest();
TransactionRequest trParams = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
type(Transaction.Type.SALE).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
billingAddress().
countryName("United States of America").
countryCodeAlpha2("US").
countryCodeAlpha3("USA").
countryCodeNumeric("840").
done();
String queryString = TestHelper.simulateFormPostForTR(gateway, trParams, request, gateway.transparentRedirect().url());
Result<Transaction> result = gateway.transparentRedirect().confirmTransaction(queryString);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals("United States of America", transaction.getBillingAddress().getCountryName());
assertEquals("US", transaction.getBillingAddress().getCountryCodeAlpha2());
assertEquals("USA", transaction.getBillingAddress().getCountryCodeAlpha3());
assertEquals("840", transaction.getBillingAddress().getCountryCodeNumeric());
}
@Test
public void createTransactionFromTransparentRedirectWithAddressWithErrors() {
TransactionRequest request = new TransactionRequest();
TransactionRequest trParams = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
type(Transaction.Type.SALE).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
billingAddress().
countryName("Foo bar!").
countryCodeAlpha2("zz").
countryCodeAlpha3("zzz").
countryCodeNumeric("000").
done();
String queryString = TestHelper.simulateFormPostForTR(gateway, trParams, request, gateway.transparentRedirect().url());
Result<Transaction> result = gateway.transparentRedirect().confirmTransaction(queryString);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_NAME_IS_NOT_ACCEPTED,
result.getErrors().forObject("transaction").forObject("billing").onField("countryName").get(0).getCode());
assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_CODE_ALPHA2_IS_NOT_ACCEPTED,
result.getErrors().forObject("transaction").forObject("billing").onField("countryCodeAlpha2").get(0).getCode());
assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_CODE_ALPHA3_IS_NOT_ACCEPTED,
result.getErrors().forObject("transaction").forObject("billing").onField("countryCodeAlpha3").get(0).getCode());
assertEquals(ValidationErrorCode.ADDRESS_COUNTRY_CODE_NUMERIC_IS_NOT_ACCEPTED,
result.getErrors().forObject("transaction").forObject("billing").onField("countryCodeNumeric").get(0).getCode());
}
@Test
public void credit() {
TransactionRequest request = new TransactionRequest().
amount(SandboxValues.TransactionAmount.AUTHORIZE.amount).
creditCard().
number(SandboxValues.CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().credit(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(new BigDecimal("1000.00"), transaction.getAmount());
assertEquals(Transaction.Type.CREDIT, transaction.getType());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, transaction.getStatus());
CreditCard creditCard = transaction.getCreditCard();
assertEquals("411111", creditCard.getBin());
assertEquals("1111", creditCard.getLast4());
assertEquals("05", creditCard.getExpirationMonth());
assertEquals("2009", creditCard.getExpirationYear());
assertEquals("05/2009", creditCard.getExpirationDate());
}
@Test
public void creditWithSpecifyingMerchantAccountId() {
TransactionRequest request = new TransactionRequest().
amount(SandboxValues.TransactionAmount.AUTHORIZE.amount).
merchantAccountId(NON_DEFAULT_MERCHANT_ACCOUNT_ID).
creditCard().
number(SandboxValues.CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().credit(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(NON_DEFAULT_MERCHANT_ACCOUNT_ID, transaction.getMerchantAccountId());
}
@Test
public void creditWithoutSpecifyingMerchantAccountIdFallsBackToDefault() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().credit(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(DEFAULT_MERCHANT_ACCOUNT_ID, transaction.getMerchantAccountId());
}
@Test
public void creditWithCustomFields() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
customField("store_me", "custom value").
customField("another_stored_field", "custom value2").
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().credit(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
Map<String, String> expected = new HashMap<String, String>();
expected.put("store_me", "custom value");
expected.put("another_stored_field", "custom value2");
assertEquals(expected, transaction.getCustomFields());
}
@Test
public void creditWithValidationError() {
TransactionRequest request = new TransactionRequest().
amount(null).
creditCard().
expirationMonth("05").
expirationYear("2010").
done();
Result<Transaction> result = gateway.transaction().credit(request);
assertFalse(result.isSuccess());
assertNull(result.getTarget());
assertEquals(ValidationErrorCode.TRANSACTION_AMOUNT_IS_REQUIRED, result.getErrors().forObject("transaction").onField("amount").get(0).getCode());
Map<String, String> parameters = result.getParameters();
assertEquals(null, parameters.get("transaction[amount]"));
assertEquals("05", parameters.get("transaction[credit_card][expiration_month]"));
assertEquals("2010", parameters.get("transaction[credit_card][expiration_year]"));
}
@Test
public void find() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
Transaction foundTransaction = gateway.transaction().find(transaction.getId());
assertEquals(transaction.getId(), foundTransaction.getId());
assertEquals(Transaction.Status.AUTHORIZED, foundTransaction.getStatus());
assertEquals("05/2008", foundTransaction.getCreditCard().getExpirationDate());
}
@Test(expected = NotFoundException.class)
public void findWithBadId() {
gateway.transaction().find("badId");
}
@Test(expected = NotFoundException.class)
public void findWithWhitespaceId() {
gateway.transaction().find(" ");
}
@Test
public void findWithDisbursementDetails() throws Exception {
Calendar disbursementCalendar = CalendarTestUtils.date("2013-04-10");
Transaction foundTransaction = gateway.transaction().find(DISBURSEMENT_TRANSACTION_ID);
DisbursementDetails disbursementDetails = foundTransaction.getDisbursementDetails();
assertEquals(true, foundTransaction.isDisbursed());
assertEquals(disbursementCalendar, disbursementDetails.getDisbursementDate());
assertEquals("USD", disbursementDetails.getSettlementCurrencyIsoCode());
assertEquals(false, disbursementDetails.isFundsHeld());
assertEquals(new BigDecimal("1"), disbursementDetails.getSettlementCurrencyExchangeRate());
assertEquals(new BigDecimal("100.00"), disbursementDetails.getSettlementAmount());
}
@Test
public void findWithDisputes() throws Exception {
Calendar disputeCalendar = CalendarTestUtils.date("2014-03-01");
Calendar replyCalendar = CalendarTestUtils.date("2014-03-21");
Calendar openedCalendar = CalendarTestUtils.date("2014-03-01");
Calendar wonCalendar = CalendarTestUtils.date("2014-03-07");
Transaction foundTransaction = gateway.transaction().find(DISPUTED_TRANSACTION_ID);
List<Dispute> disputes = foundTransaction.getDisputes();
Dispute dispute = disputes.get(0);
assertEquals(disputeCalendar, dispute.getReceivedDate());
assertEquals(replyCalendar, dispute.getReplyByDate());
assertEquals("USD", dispute.getCurrencyIsoCode());
assertEquals(Dispute.Reason.FRAUD, dispute.getReason());
assertEquals(Dispute.Status.WON, dispute.getStatus());
assertEquals(new BigDecimal("250.00"), dispute.getAmount());
assertEquals(new BigDecimal("1000.00"), dispute.getTransactionDetails().getAmount());
assertEquals(DISPUTED_TRANSACTION_ID, dispute.getTransactionDetails().getId());
assertEquals(Dispute.Kind.CHARGEBACK, dispute.getKind());
assertEquals(openedCalendar, dispute.getOpenedDate());
assertEquals(wonCalendar, dispute.getWonDate());
}
@Test
public void findWithRetrievals() throws Exception {
Calendar disputeCalendar = CalendarTestUtils.date("2014-03-01");
Calendar replyCalendar = CalendarTestUtils.date("2014-03-21");
Transaction foundTransaction = gateway.transaction().find("retrievaltransaction");
List<Dispute> disputes = foundTransaction.getDisputes();
Dispute dispute = disputes.get(0);
assertEquals("USD", dispute.getCurrencyIsoCode());
assertEquals(Dispute.Reason.RETRIEVAL, dispute.getReason());
assertEquals(Dispute.Status.OPEN, dispute.getStatus());
assertEquals(new BigDecimal("1000.00"), dispute.getAmount());
assertEquals(new BigDecimal("1000.00"), dispute.getTransactionDetails().getAmount());
assertEquals("retrievaltransaction", dispute.getTransactionDetails().getId());
}
@Test
public void findWithThreeDSecureInfo() throws Exception {
Transaction foundTransaction = gateway.transaction().find("threedsecuredtransaction");
ThreeDSecureInfo info = foundTransaction.getThreeDSecureInfo();
assertEquals("Y", info.getEnrolled());
assertTrue(info.isLiabilityShifted());
assertTrue(info.isLiabilityShiftPossible());
assertEquals("authenticate_successful", info.getStatus());
}
@Test
public void findWithoutThreeDSecureInfo() throws Exception {
Transaction foundTransaction = gateway.transaction().find("settledtransaction");
assertNull(foundTransaction.getThreeDSecureInfo());
}
@Test
public void voidVoidsTheTransaction() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
Result<Transaction> result = gateway.transaction().voidTransaction(transaction.getId());
assertTrue(result.isSuccess());
assertEquals(transaction.getId(), result.getTarget().getId());
assertEquals(Transaction.Status.VOIDED, result.getTarget().getStatus());
}
@Test(expected = NotFoundException.class)
public void voidWithBadId() {
gateway.transaction().voidTransaction("badId");
}
@Test
public void voidWithBadStatus() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
gateway.transaction().voidTransaction(transaction.getId());
Result<Transaction> result = gateway.transaction().voidTransaction(transaction.getId());
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_CANNOT_BE_VOIDED,
result.getErrors().forObject("transaction").onField("base").get(0).getCode());
}
@Test
public void statusHistoryReturnsCorrectStatusEvents() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
Transaction settledTransaction = gateway.transaction().submitForSettlement(transaction.getId()).getTarget();
assertEquals(2, settledTransaction.getStatusHistory().size());
assertEquals(Transaction.Status.AUTHORIZED, settledTransaction.getStatusHistory().get(0).getStatus());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, settledTransaction.getStatusHistory().get(1).getStatus());
}
@Test
public void submitForSettlementWithoutAmount() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
Result<Transaction> result = gateway.transaction().submitForSettlement(transaction.getId());
assertTrue(result.isSuccess());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, result.getTarget().getStatus());
assertEquals(TransactionAmount.AUTHORIZE.amount, result.getTarget().getAmount());
}
@Test
public void submitForSettlementWithAmount() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
Result<Transaction> result = gateway.transaction().submitForSettlement(transaction.getId(), new BigDecimal("50.00"));
assertTrue(result.isSuccess());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, result.getTarget().getStatus());
assertEquals(new BigDecimal("50.00"), result.getTarget().getAmount());
}
@Test
public void submitForSettlementWithOrderId() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionRequest submitForSettlementRequest = new TransactionRequest().
orderId("1234");
Result<Transaction> result = gateway.transaction().submitForSettlement(transaction.getId(), submitForSettlementRequest);
assertTrue(result.isSuccess());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, result.getTarget().getStatus());
assertEquals(new String("1234"), result.getTarget().getOrderId());
}
@Test
public void submitForSettlementWithDescriptors() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionRequest submitForSettlementRequest = new TransactionRequest().
descriptor().
name("123*123456789012345678").
phone("3334445555").
url("ebay.com").
done();
Result<Transaction> result = gateway.transaction().submitForSettlement(transaction.getId(), submitForSettlementRequest);
assertTrue(result.isSuccess());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, result.getTarget().getStatus());
assertEquals("123*123456789012345678", result.getTarget().getDescriptor().getName());
assertEquals("3334445555", result.getTarget().getDescriptor().getPhone());
assertEquals("ebay.com", result.getTarget().getDescriptor().getUrl());
}
@Test
public void submitForSettlementWithBadStatus() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
gateway.transaction().submitForSettlement(transaction.getId());
Result<Transaction> result = gateway.transaction().submitForSettlement(transaction.getId());
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_CANNOT_SUBMIT_FOR_SETTLEMENT,
result.getErrors().forObject("transaction").onField("base").get(0).getCode());
}
@Test
public void updateDetails() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done().
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionRequest updateDetailsRequest = new TransactionRequest().
amount(new BigDecimal("123.45")).
descriptor().
name("123*123456789012345678").
phone("3334445555").
url("ebay.com").
done().
orderId("1234");
Result<Transaction> result = gateway.transaction().updateDetails(transaction.getId(), updateDetailsRequest);
assertTrue(result.isSuccess());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, result.getTarget().getStatus());
assertEquals(new BigDecimal("123.45"), result.getTarget().getAmount());
assertEquals(new String("1234"), result.getTarget().getOrderId());
assertEquals("123*123456789012345678", result.getTarget().getDescriptor().getName());
assertEquals("3334445555", result.getTarget().getDescriptor().getPhone());
assertEquals("ebay.com", result.getTarget().getDescriptor().getUrl());
}
@Test
public void updateDetailsWithInvalidAmount() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done().
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionRequest updateDetailsRequest = new TransactionRequest().
amount(new BigDecimal("9999")).
descriptor().
name("123*123456789012345678").
phone("3334445555").
url("ebay.com").
done().
orderId("1234");
Result<Transaction> result = gateway.transaction().updateDetails(transaction.getId(), updateDetailsRequest);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_SETTLEMENT_AMOUNT_IS_TOO_LARGE,
result.getErrors().forObject("transaction").onField("amount").get(0).getCode());
}
@Test
public void updateDetailsWithInvalidDescriptor() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done().
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionRequest updateDetailsRequest = new TransactionRequest().
descriptor().
name("invalid name").
phone("invalid phone").
url("invalid url is way too long to be valid").
done().
orderId("1234");
Result<Transaction> result = gateway.transaction().updateDetails(transaction.getId(), updateDetailsRequest);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.DESCRIPTOR_NAME_FORMAT_IS_INVALID,
result.getErrors().forObject("transaction").forObject("descriptor").onField("name").get(0).getCode());
assertEquals(ValidationErrorCode.DESCRIPTOR_PHONE_FORMAT_IS_INVALID,
result.getErrors().forObject("transaction").forObject("descriptor").onField("phone").get(0).getCode());
assertEquals(ValidationErrorCode.DESCRIPTOR_URL_FORMAT_IS_INVALID,
result.getErrors().forObject("transaction").forObject("descriptor").onField("url").get(0).getCode());
}
@Test
public void updateDetailsWithBadStatus() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionRequest updateDetailsRequest = new TransactionRequest().
amount(new BigDecimal("123.45")).
descriptor().
name("123*123456789012345678").
phone("3334445555").
url("ebay.com").
done().
orderId("1234");
Result<Transaction> result = gateway.transaction().updateDetails(transaction.getId(), updateDetailsRequest);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_CANNOT_UPDATE_DETAILS_NOT_SUBMITTED_FOR_SETTLEMENT,
result.getErrors().forObject("transaction").onField("base").get(0).getCode());
}
@Test
public void updateDetailsWithInvalidProcessor() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(FAKE_AMEX_DIRECT_MERCHANT_ACCOUNT_ID).
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.AmexPayWithPoints.SUCCESS.number).
expirationDate("12/2020").
done().
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionRequest updateDetailsRequest = new TransactionRequest().
amount(new BigDecimal("123.45")).
descriptor().
name("123*123456789012345678").
phone("3334445555").
url("ebay.com").
done().
orderId("1234");
Result<Transaction> result = gateway.transaction().updateDetails(transaction.getId(), updateDetailsRequest);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_PROCESSOR_DOES_NOT_SUPPORT_UPDATING_DETAILS,
result.getErrors().forObject("transaction").onField("base").get(0).getCode());
}
@Test(expected = NotFoundException.class)
public void submitForSettlementWithBadId() {
gateway.transaction().submitForSettlement("badId");
}
@Test
public void searchOnAllTextFields() {
String creditCardToken = String.valueOf(new Random().nextInt());
String firstName = String.valueOf(new Random().nextInt());
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("1000")).
creditCard().
number("4111111111111111").
expirationDate("05/2012").
cardholderName("Tom Smith").
token(creditCardToken).
done().
billingAddress().
company("Braintree").
countryName("United States of America").
extendedAddress("Suite 123").
firstName(firstName).
lastName("Smith").
locality("Chicago").
postalCode("12345").
region("IL").
streetAddress("123 Main St").
done().
customer().
company("Braintree").
email("smith@example.com").
fax("5551231234").
firstName("Tom").
lastName("Smith").
phone("5551231234").
website("http://example.com").
done().
options().
storeInVault(true).
submitForSettlement(true).
done().
orderId("myorder").
shippingAddress().
company("Braintree P.S.").
countryName("Mexico").
extendedAddress("Apt 456").
firstName("Thomas").
lastName("Smithy").
locality("Braintree").
postalCode("54321").
region("MA").
streetAddress("456 Road").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TestHelper.settle(gateway, transaction.getId());
transaction = gateway.transaction().find(transaction.getId());
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
billingCompany().is("Braintree").
billingCountryName().is("United States of America").
billingExtendedAddress().is("Suite 123").
billingFirstName().is(firstName).
billingLastName().is("Smith").
billingLocality().is("Chicago").
billingPostalCode().is("12345").
billingRegion().is("IL").
billingStreetAddress().is("123 Main St").
creditCardCardholderName().is("Tom Smith").
creditCardExpirationDate().is("05/2012").
creditCardNumber().is(CreditCardNumber.VISA.number).
currency().is("USD").
customerCompany().is("Braintree").
customerEmail().is("smith@example.com").
customerFax().is("5551231234").
customerFirstName().is("Tom").
customerId().is(transaction.getCustomer().getId()).
customerLastName().is("Smith").
customerPhone().is("5551231234").
customerWebsite().is("http://example.com").
orderId().is("myorder").
paymentMethodToken().is(creditCardToken).
processorAuthorizationCode().is(transaction.getProcessorAuthorizationCode()).
settlementBatchId().is(transaction.getSettlementBatchId()).
shippingCompany().is("Braintree P.S.").
shippingCountryName().is("Mexico").
shippingExtendedAddress().is("Apt 456").
shippingFirstName().is("Thomas").
shippingLastName().is("Smithy").
shippingLocality().is("Braintree").
shippingPostalCode().is("54321").
shippingRegion().is("MA").
shippingStreetAddress().is("456 Road");
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
assertEquals(transaction.getId(), collection.getFirst().getId());
}
@Test
public void searchOnTextNodeOperators() {
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("1000")).
creditCard().
number("4111111111111111").
expirationDate("05/2012").
cardholderName("Tom Smith").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
creditCardCardholderName().startsWith("Tom");
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
creditCardCardholderName().endsWith("Smith");
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
creditCardCardholderName().contains("m Sm");
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
creditCardCardholderName().isNot("Tom Smith");
collection = gateway.transaction().search(searchRequest);
assertEquals(0, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
user().is("integration_user_public_id").
id().is(transaction.getId());
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
creditCardUniqueIdentifier().is(transaction.getCreditCard().getUniqueNumberIdentifier()).
id().is(transaction.getId());
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
}
@Test
public void searchOnsPaymentInstrumentTypeIsCreditCard() {
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("1000")).
creditCard().
number("4111111111111111").
expirationDate("05/2012").
cardholderName("Tom Smith").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
paymentInstrumentType().is("CreditCardDetail");
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(collection.getFirst().getPaymentInstrumentType(), PaymentInstrumentType.CREDIT_CARD);
}
@Test
public void searchOnsPaymentInstrumentTypeIsPayPal() {
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("1000")).
paymentMethodNonce(Nonce.PayPalFuturePayment);
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
paymentInstrumentType().is("PayPalDetail");
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(collection.getFirst().getPaymentInstrumentType(), PaymentInstrumentType.PAYPAL_ACCOUNT);
}
@Test
public void searchOnsPaymentInstrumentTypeIsApplePay() {
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("1000")).
paymentMethodNonce(Nonce.ApplePayVisa);
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
paymentInstrumentType().is("ApplePayDetail");
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(collection.getFirst().getPaymentInstrumentType(), PaymentInstrumentType.APPLE_PAY_CARD);
}
@Test
public void searchOnPaymentInstrumentTypeIsEuropeBank() {
BraintreeGateway altpayGateway = new BraintreeGateway(
Environment.DEVELOPMENT,
"altpay_merchant",
"altpay_merchant_public_key",
"altpay_merchant_private_key"
);
Result<Customer> customerResult = altpayGateway.customer().create(new CustomerRequest());
assertTrue(customerResult.isSuccess());
Customer customer = customerResult.getTarget();
String nonce = TestHelper.generateEuropeBankAccountNonce(altpayGateway, customer);
TransactionRequest request = new TransactionRequest().
merchantAccountId("fake_sepa_ma").
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(nonce);
Transaction transaction = altpayGateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
paymentInstrumentType().is("EuropeBankAccountDetail");
ResourceCollection<Transaction> collection = altpayGateway.transaction().search(searchRequest);
assertEquals(collection.getFirst().getPaymentInstrumentType(), PaymentInstrumentType.EUROPE_BANK_ACCOUNT);
}
@Test
public void searchOnNullValue() {
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("1000")).
creditCard().
number("4111111111111111").
expirationDate("05/2012").
cardholderName("Tom Smith").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
creditCardCardholderName().is(null);
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
}
@Test
public void searchOnCreatedUsing() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
createdUsing().is(Transaction.CreatedUsing.FULL_INFORMATION);
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
createdUsing().in(Transaction.CreatedUsing.FULL_INFORMATION, Transaction.CreatedUsing.TOKEN);
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
createdUsing().is(Transaction.CreatedUsing.TOKEN);
collection = gateway.transaction().search(searchRequest);
assertEquals(0, collection.getMaximumSize());
}
@Test
public void searchOnCreditCardCustomerLocation() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
creditCardCustomerLocation().is(CreditCard.CustomerLocation.US);
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
creditCardCustomerLocation().in(CreditCard.CustomerLocation.US, CreditCard.CustomerLocation.INTERNATIONAL);
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
creditCardCustomerLocation().is(CreditCard.CustomerLocation.INTERNATIONAL);
collection = gateway.transaction().search(searchRequest);
assertEquals(0, collection.getMaximumSize());
}
@Test
public void searchOnMerchantAccountId() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
merchantAccountId().is(transaction.getMerchantAccountId());
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
merchantAccountId().in(transaction.getMerchantAccountId(), "badmerchantaccountid");
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
merchantAccountId().is("badmerchantaccountid");
collection = gateway.transaction().search(searchRequest);
assertEquals(0, collection.getMaximumSize());
}
@Test
public void searchOnCreditCardType() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
creditCardCardType().is(CreditCard.CardType.VISA);
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
creditCardCardType().in(CreditCard.CardType.VISA, CreditCard.CardType.MASTER_CARD);
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
creditCardCardType().is(CreditCard.CardType.MASTER_CARD);
collection = gateway.transaction().search(searchRequest);
assertEquals(0, collection.getMaximumSize());
}
@Test
public void searchOnEuropeBankAccountIban() {
BraintreeGateway altpayGateway = new BraintreeGateway(
Environment.DEVELOPMENT,
"altpay_merchant",
"altpay_merchant_public_key",
"altpay_merchant_private_key"
);
Result<Customer> customerResult = altpayGateway.customer().create(new CustomerRequest());
assertTrue(customerResult.isSuccess());
Customer customer = customerResult.getTarget();
String nonce = TestHelper.generateEuropeBankAccountNonce(altpayGateway, customer);
TransactionRequest request = new TransactionRequest().
merchantAccountId("fake_sepa_ma").
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(nonce);
Transaction transaction = altpayGateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
europeBankAccountIban().is("DE89370400440532013000");
assertEquals(1, altpayGateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnStatus() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
status().is(Transaction.Status.AUTHORIZED);
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
status().in(Transaction.Status.AUTHORIZED, Transaction.Status.GATEWAY_REJECTED);
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
status().is(Transaction.Status.GATEWAY_REJECTED);
collection = gateway.transaction().search(searchRequest);
assertEquals(0, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
status().is(Transaction.Status.SETTLEMENT_CONFIRMED);
collection = gateway.transaction().search(searchRequest);
assertEquals(0, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
status().is(Transaction.Status.SETTLEMENT_DECLINED);
collection = gateway.transaction().search(searchRequest);
assertEquals(0, collection.getMaximumSize());
}
@Test
public void searchOnAuthorizationExpiredStatus() {
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
status().is(Transaction.Status.AUTHORIZATION_EXPIRED);
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertTrue(collection.getMaximumSize() > 0);
assertEquals(Transaction.Status.AUTHORIZATION_EXPIRED, collection.getFirst().getStatus());
}
@Test
public void searchOnSource() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
source().is(Transaction.Source.API);
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
source().in(Transaction.Source.API, Transaction.Source.CONTROL_PANEL);
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
source().is(Transaction.Source.CONTROL_PANEL);
collection = gateway.transaction().search(searchRequest);
assertEquals(0, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
source().in(Transaction.Source.API, Transaction.Source.RECURRING);
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
source().in(Transaction.Source.RECURRING);
collection = gateway.transaction().search(searchRequest);
assertEquals(0, collection.getMaximumSize());
}
@Test
public void searchOnType() {
String name = String.valueOf(new Random().nextInt());
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
cardholderName(name).
done().
options().
submitForSettlement(true).
done();
Transaction creditTransaction = gateway.transaction().credit(request).getTarget();
Transaction saleTransaction = gateway.transaction().sale(request).getTarget();
TestHelper.settle(gateway, saleTransaction.getId());
Transaction refundTransaction = gateway.transaction().refund(saleTransaction.getId()).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
creditCardCardholderName().is(name).
type().is(Transaction.Type.CREDIT);
ResourceCollection<Transaction> collection = gateway.transaction().search(searchRequest);
assertEquals(2, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
creditCardCardholderName().is(name).
type().is(Transaction.Type.SALE);
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
searchRequest = new TransactionSearchRequest().
creditCardCardholderName().is(name).
type().is(Transaction.Type.CREDIT).
refund().is(true);
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
assertEquals(refundTransaction.getId(), collection.getFirst().getId());
searchRequest = new TransactionSearchRequest().
creditCardCardholderName().is(name).
type().is(Transaction.Type.CREDIT).
refund().is(false);
collection = gateway.transaction().search(searchRequest);
assertEquals(1, collection.getMaximumSize());
assertEquals(creditTransaction.getId(), collection.getFirst().getId());
}
@Test
public void searchOnAmount() {
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("1000")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
amount().between(new BigDecimal("500"), new BigDecimal("1500"));
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
amount().greaterThanOrEqualTo(new BigDecimal("500"));
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
amount().lessThanOrEqualTo(new BigDecimal("1500"));
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
amount().between(new BigDecimal("1300"), new BigDecimal("1500"));
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnDisbursementDate() throws ParseException {
Calendar disbursementTime = CalendarTestUtils.dateTime("2013-04-10T00:00:00Z");
Calendar threeDaysEarlier = ((Calendar) disbursementTime.clone());
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = ((Calendar) disbursementTime.clone());
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = ((Calendar) disbursementTime.clone());
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(DISBURSEMENT_TRANSACTION_ID).
disbursementDate().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(DISBURSEMENT_TRANSACTION_ID).
disbursementDate().greaterThanOrEqualTo(oneDayEarlier);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(DISBURSEMENT_TRANSACTION_ID).
disbursementDate().lessThanOrEqualTo(oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(DISBURSEMENT_TRANSACTION_ID).
disbursementDate().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnDisbursementDateUsingLocalTime() throws ParseException {
Calendar oneDayEarlier = CalendarTestUtils.dateTime("2013-04-09T00:00:00Z", "CST");
Calendar oneDayLater = CalendarTestUtils.dateTime("2013-04-11T00:00:00Z", "CST");
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(DISBURSEMENT_TRANSACTION_ID).
disbursementDate().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnDisputeDate() throws ParseException {
Calendar disputeTime = CalendarTestUtils.dateTime("2014-03-01T00:00:00Z");
Calendar threeDaysEarlier = ((Calendar) disputeTime.clone());
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = ((Calendar) disputeTime.clone());
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = ((Calendar) disputeTime.clone());
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(DISPUTED_TRANSACTION_ID).
disputeDate().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(TWO_DISPUTE_TRANSACTION_ID).
disputeDate().greaterThanOrEqualTo(oneDayEarlier);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(DISPUTED_TRANSACTION_ID).
disputeDate().lessThanOrEqualTo(oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(DISPUTED_TRANSACTION_ID).
disputeDate().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnDisputeDateUsingLocalTime() throws ParseException {
Calendar oneDayEarlier = CalendarTestUtils.dateTime("2014-02-28T00:00:00Z", "CST");
Calendar oneDayLater = CalendarTestUtils.dateTime("2014-03-02T00:00:00Z", "CST");
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(DISPUTED_TRANSACTION_ID).
disputeDate().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnCreatedAt() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
Calendar createdAt = transaction.getCreatedAt();
Calendar threeDaysEarlier = ((Calendar) createdAt.clone());
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = ((Calendar) createdAt.clone());
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = ((Calendar) createdAt.clone());
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
createdAt().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
createdAt().greaterThanOrEqualTo(oneDayEarlier);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
createdAt().lessThanOrEqualTo(oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
createdAt().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnCreatedAtUsingLocalTime() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
Calendar oneDayEarlier = Calendar.getInstance();
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = Calendar.getInstance();
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
createdAt().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnAuthorizationExpiredAt() {
Calendar threeDaysEarlier = Calendar.getInstance();
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = Calendar.getInstance();
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = Calendar.getInstance();
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
authorizationExpiredAt().between(oneDayEarlier, oneDayLater);
ResourceCollection<Transaction> results = gateway.transaction().search(searchRequest);
assertTrue(results.getMaximumSize() > 0);
assertEquals(Transaction.Status.AUTHORIZATION_EXPIRED, results.getFirst().getStatus());
searchRequest = new TransactionSearchRequest().
authorizationExpiredAt().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnAuthorizedAt() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
Calendar threeDaysEarlier = Calendar.getInstance();
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = Calendar.getInstance();
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = Calendar.getInstance();
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
authorizedAt().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
authorizedAt().greaterThanOrEqualTo(oneDayEarlier);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
authorizedAt().lessThanOrEqualTo(oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
authorizedAt().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnFailedAt() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.FAILED.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTransaction();
Calendar threeDaysEarlier = Calendar.getInstance();
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = Calendar.getInstance();
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = Calendar.getInstance();
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
failedAt().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
failedAt().greaterThanOrEqualTo(oneDayEarlier);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
failedAt().lessThanOrEqualTo(oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
failedAt().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnGatewayRejectedAt() {
BraintreeGateway processingRulesGateway = new BraintreeGateway(Environment.DEVELOPMENT, "processing_rules_merchant_id", "processing_rules_public_key", "processing_rules_private_key");
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
cvv("200").
done();
Transaction transaction = processingRulesGateway.transaction().sale(request).getTransaction();
Calendar threeDaysEarlier = Calendar.getInstance();
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = Calendar.getInstance();
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = Calendar.getInstance();
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
gatewayRejectedAt().between(oneDayEarlier, oneDayLater);
assertEquals(1, processingRulesGateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
gatewayRejectedAt().greaterThanOrEqualTo(oneDayEarlier);
assertEquals(1, processingRulesGateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
gatewayRejectedAt().lessThanOrEqualTo(oneDayLater);
assertEquals(1, processingRulesGateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
gatewayRejectedAt().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, processingRulesGateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnProcessorDeclinedAt() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.DECLINE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTransaction();
Calendar threeDaysEarlier = Calendar.getInstance();
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = Calendar.getInstance();
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = Calendar.getInstance();
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
processorDeclinedAt().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
processorDeclinedAt().greaterThanOrEqualTo(oneDayEarlier);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
processorDeclinedAt().lessThanOrEqualTo(oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
processorDeclinedAt().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnSettledAt() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done().
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TestHelper.settle(gateway, transaction.getId());
transaction = gateway.transaction().find(transaction.getId());
Calendar threeDaysEarlier = Calendar.getInstance();
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = Calendar.getInstance();
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = Calendar.getInstance();
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
settledAt().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
settledAt().greaterThanOrEqualTo(oneDayEarlier);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
settledAt().lessThanOrEqualTo(oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
settledAt().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnSubmittedForSettlementAt() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done().
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
Calendar threeDaysEarlier = Calendar.getInstance();
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = Calendar.getInstance();
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = Calendar.getInstance();
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
submittedForSettlementAt().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
submittedForSettlementAt().greaterThanOrEqualTo(oneDayEarlier);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
submittedForSettlementAt().lessThanOrEqualTo(oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
submittedForSettlementAt().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnVoidedAt() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
transaction = gateway.transaction().voidTransaction(transaction.getId()).getTarget();
Calendar threeDaysEarlier = Calendar.getInstance();
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = Calendar.getInstance();
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = Calendar.getInstance();
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
voidedAt().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
voidedAt().greaterThanOrEqualTo(oneDayEarlier);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
voidedAt().lessThanOrEqualTo(oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
voidedAt().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnMultipleStatusAtFields() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2010").
done().
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
Calendar threeDaysEarlier = Calendar.getInstance();
threeDaysEarlier.add(Calendar.DAY_OF_MONTH, -3);
Calendar oneDayEarlier = Calendar.getInstance();
oneDayEarlier.add(Calendar.DAY_OF_MONTH, -1);
Calendar oneDayLater = Calendar.getInstance();
oneDayLater.add(Calendar.DAY_OF_MONTH, 1);
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
authorizedAt().between(oneDayEarlier, oneDayLater).
submittedForSettlementAt().between(oneDayEarlier, oneDayLater);
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
authorizedAt().between(threeDaysEarlier, oneDayEarlier).
submittedForSettlementAt().between(threeDaysEarlier, oneDayEarlier);
assertEquals(0, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test
public void searchOnPayPalFields() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(nonce);
Transaction transaction = gateway.transaction().sale(request).getTarget();
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId()).
paypalPaymentId().startsWith("PAY").
paypalPayerEmail().is("payer@example.com").
paypalAuthorizationId().startsWith("AUTH");
assertEquals(1, gateway.transaction().search(searchRequest).getMaximumSize());
}
@Test(expected = DownForMaintenanceException.class)
public void searchReturnsAndHandlesInvalidCriteria() {
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
amount().is(new BigDecimal("-500"));
gateway.transaction().search(searchRequest);
}
@Test
@SuppressWarnings("deprecation")
public void refundTransaction() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done().
options().
submitForSettlement(true).
done();
String transactionId = gateway.transaction().sale(request).getTarget().getId();
TestHelper.settle(gateway, transactionId);
Result<Transaction> result = gateway.transaction().refund(transactionId);
assertTrue(result.isSuccess());
Transaction refund = result.getTarget();
Transaction originalTransaction = gateway.transaction().find(transactionId);
assertEquals(Transaction.Type.CREDIT, refund.getType());
assertEquals(originalTransaction.getAmount(), refund.getAmount());
assertEquals(refund.getId(), originalTransaction.getRefundId());
assertEquals(originalTransaction.getId(), refund.getRefundedTransactionId());
}
@Test
public void refundTransactionWithOrderId() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done().
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TestHelper.settle(gateway, transaction.getId());
TransactionRefundRequest refundRequest = new TransactionRefundRequest().orderId("12345678");
Result<Transaction> result = gateway.transaction().refund(transaction.getId(), refundRequest);
assertTrue(result.isSuccess());
assertEquals("12345678", result.getTarget().getOrderId());
}
@Test
public void refundTransactionWithAmountAndOrderId() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done().
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TestHelper.settle(gateway, transaction.getId());
TransactionRefundRequest refundRequest = new TransactionRefundRequest().
orderId("12345678").
amount(TransactionAmount.AUTHORIZE.amount.divide(new BigDecimal("2")));
Result<Transaction> result = gateway.transaction().refund(transaction.getId(), refundRequest);
assertTrue(result.isSuccess());
assertEquals("12345678", result.getTarget().getOrderId());
assertEquals(TransactionAmount.AUTHORIZE.amount.divide(new BigDecimal("2")), result.getTarget().getAmount());
}
@Test
public void refundTransactionWithPartialAmount() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done().
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TestHelper.settle(gateway, transaction.getId());
Result<Transaction> result = gateway.transaction().refund(transaction.getId(), TransactionAmount.AUTHORIZE.amount.divide(new BigDecimal(2)));
assertTrue(result.isSuccess());
assertEquals(Transaction.Type.CREDIT, result.getTarget().getType());
assertEquals(TransactionAmount.AUTHORIZE.amount.divide(new BigDecimal(2)), result.getTarget().getAmount());
}
@Test
public void refundMultipleTransactionsWithPartialAmounts() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done().
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TestHelper.settle(gateway, transaction.getId());
Transaction refund1 = gateway.transaction().refund(transaction.getId(), TransactionAmount.AUTHORIZE.amount.divide(new BigDecimal(2))).getTarget();
assertEquals(Transaction.Type.CREDIT, refund1.getType());
assertEquals(TransactionAmount.AUTHORIZE.amount.divide(new BigDecimal(2)), refund1.getAmount());
Transaction refund2 = gateway.transaction().refund(transaction.getId(), TransactionAmount.AUTHORIZE.amount.divide(new BigDecimal(2))).getTarget();
assertEquals(Transaction.Type.CREDIT, refund2.getType());
assertEquals(TransactionAmount.AUTHORIZE.amount.divide(new BigDecimal(2)), refund2.getAmount());
transaction = gateway.transaction().find(transaction.getId());
assertTrue(TestHelper.listIncludes(transaction.getRefundIds(), refund1.getId()));
assertTrue(TestHelper.listIncludes(transaction.getRefundIds(), refund1.getId()));
}
@Test
public void refundFailsWithNonSettledTransaction() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
assertEquals(Transaction.Status.AUTHORIZED, transaction.getStatus());
Result<Transaction> result = gateway.transaction().refund(transaction.getId());
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_CANNOT_REFUND_UNLESS_SETTLED,
result.getErrors().forObject("transaction").onField("base").get(0).getCode());
}
@Test
public void unrecognizedStatus() {
String xml = "<transaction><status>foobar</status><billing/><credit-card/><customer/><descriptor/><shipping/><subscription/><service-fee></service-fee><disbursement-details/><type>sale</type></transaction>";
Transaction transaction = new Transaction(NodeWrapperFactory.instance.create(xml));
assertEquals(Transaction.Status.UNRECOGNIZED, transaction.getStatus());
}
@Test
public void unrecognizedType() {
String xml = "<transaction><type>foobar</type><billing/><credit-card/><customer/><descriptor/><shipping/><subscription/><service-fee></service-fee><disbursement-details/><type>sale</type></transaction>";
Transaction transaction = new Transaction(NodeWrapperFactory.instance.create(xml));
assertEquals(Transaction.Type.UNRECOGNIZED, transaction.getType());
}
@Test
public void gatewayRejectedOnCvv() {
BraintreeGateway processingRulesGateway = new BraintreeGateway(Environment.DEVELOPMENT, "processing_rules_merchant_id", "processing_rules_public_key", "processing_rules_private_key");
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
cvv("200").
done();
Result<Transaction> result = processingRulesGateway.transaction().sale(request);
assertFalse(result.isSuccess());
Transaction transaction = result.getTransaction();
assertEquals(Transaction.GatewayRejectionReason.CVV, transaction.getGatewayRejectionReason());
}
@Test
public void gatewayRejectedOnApplicationIncomplete() {
gateway = new BraintreeGateway("client_id$development$integration_client_id", "client_secret$development$integration_client_secret");
MerchantRequest request = new MerchantRequest().
email("name@email.com").
countryCodeAlpha3("USA").
paymentMethods(Arrays.asList("credit_card", "paypal"));
Result<Merchant> merchantResult = gateway.merchant().create(request);
gateway = new BraintreeGateway(merchantResult.getTarget().getCredentials().getAccessToken());
TransactionRequest transactionRequest = new TransactionRequest().
amount(new BigDecimal(4000.00)).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2020").
done();
Result<Transaction> result = gateway.transaction().sale(transactionRequest);
assertFalse(result.isSuccess());
Transaction transaction = result.getTransaction();
assertEquals(Transaction.GatewayRejectionReason.APPLICATION_INCOMPLETE, transaction.getGatewayRejectionReason());
}
@Test
public void gatewayRejectedOnAvs() {
BraintreeGateway processingRulesGateway = new BraintreeGateway(Environment.DEVELOPMENT, "processing_rules_merchant_id", "processing_rules_public_key", "processing_rules_private_key");
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
billingAddress().
postalCode("20001").
done().
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = processingRulesGateway.transaction().sale(request);
assertFalse(result.isSuccess());
Transaction transaction = result.getTransaction();
assertEquals(Transaction.GatewayRejectionReason.AVS, transaction.getGatewayRejectionReason());
}
@Test
public void gatewayRejectedOnAvsAndCvv() {
BraintreeGateway processingRulesGateway = new BraintreeGateway(Environment.DEVELOPMENT, "processing_rules_merchant_id", "processing_rules_public_key", "processing_rules_private_key");
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
billingAddress().
postalCode("20001").
done().
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
cvv("200").
done();
Result<Transaction> result = processingRulesGateway.transaction().sale(request);
assertFalse(result.isSuccess());
Transaction transaction = result.getTransaction();
assertEquals(Transaction.GatewayRejectionReason.AVS_AND_CVV, transaction.getGatewayRejectionReason());
}
@Test
public void fieldsWithUnrecognizedValuesAreCategorizedAsSuch() {
Transaction transaction = gateway.transaction().find("unrecognized_transaction_id");
assertEquals(Transaction.GatewayRejectionReason.UNRECOGNIZED, transaction.getGatewayRejectionReason());
assertEquals(Transaction.EscrowStatus.UNRECOGNIZED, transaction.getEscrowStatus());
assertEquals(Transaction.Status.UNRECOGNIZED, transaction.getStatus());
}
@Test
public void snapshotPlanIdAddOnsAndDiscountsFromSubscription() {
CustomerRequest customerRequest = new CustomerRequest().
creditCard().
number("5105105105105100").
expirationDate("05/12").
done();
CreditCard creditCard = gateway.customer().create(customerRequest).getTarget().getCreditCards().get(0);
SubscriptionRequest request = new SubscriptionRequest().
paymentMethodToken(creditCard.getToken()).
planId(PlanFixture.PLAN_WITHOUT_TRIAL.getId()).
addOns().
add().
amount(new BigDecimal("11.00")).
inheritedFromId("increase_10").
numberOfBillingCycles(5).
quantity(2).
done().
add().
amount(new BigDecimal("21.00")).
inheritedFromId("increase_20").
numberOfBillingCycles(6).
quantity(3).
done().
done().
discounts().
add().
amount(new BigDecimal("7.50")).
inheritedFromId("discount_7").
neverExpires(true).
quantity(2).
done().
done();
Transaction transaction = gateway.subscription().create(request).getTarget().getTransactions().get(0);
assertEquals(PlanFixture.PLAN_WITHOUT_TRIAL.getId(), transaction.getPlanId());
List<AddOn> addOns = transaction.getAddOns();
Collections.sort(addOns, new TestHelper.CompareModificationsById());
assertEquals(2, addOns.size());
assertEquals("increase_10", addOns.get(0).getId());
assertEquals(new BigDecimal("11.00"), addOns.get(0).getAmount());
assertEquals(new Integer(5), addOns.get(0).getNumberOfBillingCycles());
assertEquals(new Integer(2), addOns.get(0).getQuantity());
assertFalse(addOns.get(0).neverExpires());
assertEquals("increase_20", addOns.get(1).getId());
assertEquals(new BigDecimal("21.00"), addOns.get(1).getAmount());
assertEquals(new Integer(6), addOns.get(1).getNumberOfBillingCycles());
assertEquals(new Integer(3), addOns.get(1).getQuantity());
assertFalse(addOns.get(1).neverExpires());
List<Discount> discounts = transaction.getDiscounts();
assertEquals(1, discounts.size());
assertEquals("discount_7", discounts.get(0).getId());
assertEquals(new BigDecimal("7.50"), discounts.get(0).getAmount());
assertNull(discounts.get(0).getNumberOfBillingCycles());
assertEquals(new Integer(2), discounts.get(0).getQuantity());
assertTrue(discounts.get(0).neverExpires());
}
@Test
public void serviceFee() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_SUB_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
serviceFeeAmount(new BigDecimal("1.00"));
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction transaction = result.getTarget();
assertEquals(new BigDecimal("1.00"), transaction.getServiceFeeAmount());
}
@Test
public void serviceFeeNotAllowedForMasterMerchant() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2017").
done().
serviceFeeAmount(new BigDecimal("1.00"));
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_SERVICE_FEE_AMOUNT_NOT_ALLOWED_ON_MASTER_MERCHANT_ACCOUNT,
result.getErrors().forObject("transaction").onField("service_fee_amount").get(0).getCode());
}
@Test
public void serviceFeeRequiredWhenUsingSubmerchant() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_SUB_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_SUB_MERCHANT_ACCOUNT_REQUIRES_SERVICE_FEE_AMOUNT,
result.getErrors().forObject("transaction").onField("merchant_account_id").get(0).getCode());
}
@Test
public void negativeServiceFee() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_SUB_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
serviceFeeAmount(new BigDecimal("-1.00"));
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_SERVICE_FEE_AMOUNT_CANNOT_BE_NEGATIVE,
result.getErrors().forObject("transaction").onField("service_fee_amount").get(0).getCode());
}
@Test
public void holdInEscrowOnCreate() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_SUB_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
serviceFeeAmount(new BigDecimal("1.00")).
options().
holdInEscrow(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
assertEquals(
Transaction.EscrowStatus.HOLD_PENDING,
result.getTarget().getEscrowStatus()
);
}
@Test
public void holdInEscrowOnSaleForMasterMerchantAccount() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2009").
done().
serviceFeeAmount(new BigDecimal("1.00")).
options().
holdInEscrow(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertFalse(result.isSuccess());
assertEquals(
ValidationErrorCode.TRANSACTION_CANNOT_HOLD_IN_ESCROW,
result.getErrors().forObject("transaction").onField("base").get(0).getCode()
);
}
@Test
public void holdInEscrowAfterSale() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_SUB_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2012").
done().
serviceFeeAmount(new BigDecimal("1.00"));
Result<Transaction> sale = gateway.transaction().sale(request);
assertTrue(sale.isSuccess());
String transactionID = sale.getTarget().getId();
Result<Transaction> holdInEscrow = gateway.transaction().holdInEscrow(transactionID);
assertTrue(holdInEscrow.isSuccess());
assertEquals(
Transaction.EscrowStatus.HOLD_PENDING,
holdInEscrow.getTarget().getEscrowStatus()
);
}
@Test
public void holdInEscrowAfterSaleFailsForMasterMerchants() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2012").
done();
Result<Transaction> sale = gateway.transaction().sale(request);
assertTrue(sale.isSuccess());
Result<Transaction> holdInEscrow = gateway.transaction().holdInEscrow(sale.getTarget().getId());
assertFalse(holdInEscrow.isSuccess());
assertEquals(
ValidationErrorCode.TRANSACTION_CANNOT_HOLD_IN_ESCROW,
holdInEscrow.getErrors().forObject("transaction").onField("base").get(0).getCode()
);
}
@Test
public void releaseFromEscrow() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_SUB_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2012").
done().
serviceFeeAmount(new BigDecimal("1.00"));
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
TestHelper.escrow(gateway, saleResult.getTarget().getId());
Result<Transaction> releaseResult = gateway.transaction().releaseFromEscrow(saleResult.getTarget().getId());
assertTrue(releaseResult.isSuccess());
assertEquals(
Transaction.EscrowStatus.RELEASE_PENDING,
releaseResult.getTarget().getEscrowStatus()
);
}
@Test
public void releaseFromEscrowFailsWhenTransactionIsNotEscrowed() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_SUB_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2012").
done().
serviceFeeAmount(new BigDecimal("1.00"));
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
Result<Transaction> releaseResult = gateway.transaction().releaseFromEscrow(saleResult.getTarget().getId());
assertFalse(releaseResult.isSuccess());
assertEquals(
ValidationErrorCode.TRANSACTION_CANNOT_RELEASE_FROM_ESCROW,
releaseResult.getErrors().forObject("transaction").onField("base").get(0).getCode()
);
}
@Test
public void cancelReleaseSucceeds() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_SUB_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2012").
done().
serviceFeeAmount(new BigDecimal("1.00"));
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
TestHelper.escrow(gateway, saleResult.getTarget().getId());
Result<Transaction> releaseResult = gateway.transaction().releaseFromEscrow(saleResult.getTarget().getId());
Result<Transaction> cancelResult = gateway.transaction().cancelRelease(saleResult.getTarget().getId());
assertTrue(cancelResult.isSuccess());
assertEquals(
Transaction.EscrowStatus.HELD,
cancelResult.getTarget().getEscrowStatus()
);
}
@Test
public void cancelReleaseFailsReleasingNonPendingTransactions() {
TransactionRequest request = new TransactionRequest().
merchantAccountId(NON_DEFAULT_SUB_MERCHANT_ACCOUNT_ID).
amount(new BigDecimal("100.00")).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2012").
done().
serviceFeeAmount(new BigDecimal("1.00"));
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
TestHelper.escrow(gateway, saleResult.getTarget().getId());
Result<Transaction> cancelResult = gateway.transaction().cancelRelease(saleResult.getTarget().getId());
assertFalse(cancelResult.isSuccess());
assertEquals(
ValidationErrorCode.TRANSACTION_CANNOT_CANCEL_RELEASE,
cancelResult.getErrors().forObject("transaction").onField("base").get(0).getCode()
);
}
@Test
public void createOneTimePayPalTransaction() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodNonce(nonce);
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertNotNull(saleResult.getTarget().getPayPalDetails());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPayerEmail());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPaymentId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getAuthorizationId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getImageUrl());
assertNotNull(saleResult.getTarget().getPayPalDetails().getDebugId());
assertNull(saleResult.getTarget().getPayPalDetails().getToken());
assertEquals(
PaymentInstrumentType.PAYPAL_ACCOUNT,
saleResult.getTarget().getPaymentInstrumentType()
);
}
@Test
public void createPayPalTransactionWithPayeeEmail() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodNonce(nonce).
paypalAccount().
payeeEmail("payee@example.com").
done();
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertNotNull(saleResult.getTarget().getPayPalDetails());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPayerEmail());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPaymentId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getAuthorizationId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getImageUrl());
assertNotNull(saleResult.getTarget().getPayPalDetails().getDebugId());
assertNull(saleResult.getTarget().getPayPalDetails().getToken());
assertEquals("payee@example.com", saleResult.getTarget().getPayPalDetails().getPayeeEmail());
assertEquals(
PaymentInstrumentType.PAYPAL_ACCOUNT,
saleResult.getTarget().getPaymentInstrumentType()
);
}
@Test
public void createPayPalTransactionWithPayeeEmailInOptionsParams() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodNonce(nonce).
paypalAccount().
done().
options().
payeeEmail("payee@example.com").
done();
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertNotNull(saleResult.getTarget().getPayPalDetails());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPayerEmail());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPaymentId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getAuthorizationId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getImageUrl());
assertNotNull(saleResult.getTarget().getPayPalDetails().getDebugId());
assertNull(saleResult.getTarget().getPayPalDetails().getToken());
assertEquals("payee@example.com", saleResult.getTarget().getPayPalDetails().getPayeeEmail());
assertEquals(
PaymentInstrumentType.PAYPAL_ACCOUNT,
saleResult.getTarget().getPaymentInstrumentType()
);
}
@Test
public void createPayPalTransactionWithPayeeEmailInOptionsPayPalParams() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodNonce(nonce).
paypalAccount().
done().
options().
paypal().
payeeEmail("payee@example.com").
done().
done();
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertNotNull(saleResult.getTarget().getPayPalDetails());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPayerEmail());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPaymentId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getAuthorizationId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getImageUrl());
assertNotNull(saleResult.getTarget().getPayPalDetails().getDebugId());
assertNull(saleResult.getTarget().getPayPalDetails().getToken());
assertEquals("payee@example.com", saleResult.getTarget().getPayPalDetails().getPayeeEmail());
assertEquals(
PaymentInstrumentType.PAYPAL_ACCOUNT,
saleResult.getTarget().getPaymentInstrumentType()
);
}
@Test
public void createPayPalTransactionWithPayPalCustomField() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodNonce(nonce).
paypalAccount().
done().
options().
paypal().
customField("custom field stuff").
done().
done();
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertNotNull(saleResult.getTarget().getPayPalDetails());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPayerEmail());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPaymentId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getAuthorizationId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getImageUrl());
assertNotNull(saleResult.getTarget().getPayPalDetails().getDebugId());
assertNull(saleResult.getTarget().getPayPalDetails().getToken());
assertEquals("custom field stuff", saleResult.getTarget().getPayPalDetails().getCustomField());
assertEquals(
PaymentInstrumentType.PAYPAL_ACCOUNT,
saleResult.getTarget().getPaymentInstrumentType()
);
}
@Test
public void createPayPalTransactionWithPayPalSupplementaryData() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodNonce(nonce).
paypalAccount().
done().
options().
paypal().
supplementaryData("key1", "value1").
supplementaryData("key2", "value2").
done().
done();
Result<Transaction> saleResult = gateway.transaction().sale(request);
// note - supplementary data is not returned in response
assertTrue(saleResult.isSuccess());
}
@Test
public void createPayPalTransactionWithPayPalDescription() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodNonce(nonce).
paypalAccount().
done().
options().
paypal().
description("Product description").
done().
done();
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertNotNull(saleResult.getTarget().getPayPalDetails());
assertEquals("Product description", saleResult.getTarget().getPayPalDetails().getDescription());
}
@Test
public void createOneTimePayPalTransactionAndAttemptToVault() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodNonce(nonce).
options().
storeInVault(true).
done();
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertNotNull(saleResult.getTarget().getPayPalDetails());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPayerEmail());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPaymentId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getAuthorizationId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getDebugId());
assertNull(saleResult.getTarget().getPayPalDetails().getToken());
}
@Test
public void createFuturePaymentPayPalTransactionAndAttemptToVault() {
String nonce = TestHelper.generateFuturePaymentPayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodNonce(nonce).
options().
storeInVault(true).
done();
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertNotNull(saleResult.getTarget().getPayPalDetails());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPayerEmail());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPaymentId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getAuthorizationId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getToken());
assertNotNull(saleResult.getTarget().getPayPalDetails().getDebugId());
}
@Test
public void createPayPalTransactionFromVaultRecord() {
String nonce = TestHelper.generateFuturePaymentPayPalNonce(gateway);
Result<Customer> customerResult = gateway.customer().create(new CustomerRequest());
assertTrue(customerResult.isSuccess());
Customer customer = customerResult.getTarget();
PaymentMethodRequest vaultRequest = new PaymentMethodRequest().
customerId(customer.getId()).
paymentMethodNonce(nonce);
Result<? extends PaymentMethod> vaultResult = gateway.paymentMethod().create(vaultRequest);
assertTrue(vaultResult.isSuccess());
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodToken(vaultResult.getTarget().getToken());
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
assertNotNull(saleResult.getTarget().getPayPalDetails());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPayerEmail());
assertNotNull(saleResult.getTarget().getPayPalDetails().getPaymentId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getAuthorizationId());
assertNotNull(saleResult.getTarget().getPayPalDetails().getToken());
assertNotNull(saleResult.getTarget().getPayPalDetails().getDebugId());
}
@Test
public void submitPayPalTransactionForSettlement() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodNonce(nonce);
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
Result<Transaction> submitForSettlementResult = gateway.transaction().submitForSettlement(saleResult.getTarget().getId());
assertTrue(submitForSettlementResult.isSuccess());
assertEquals(Transaction.Status.SETTLING, submitForSettlementResult.getTarget().getStatus());
}
@Test
public void voidPayPalTransaction() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(new BigDecimal("100.00")).
paymentMethodNonce(nonce);
Result<Transaction> saleResult = gateway.transaction().sale(request);
assertTrue(saleResult.isSuccess());
Result<Transaction> submitForSettlementResult = gateway.transaction().voidTransaction(saleResult.getTarget().getId());
assertTrue(submitForSettlementResult.isSuccess());
assertEquals(Transaction.Status.VOIDED, submitForSettlementResult.getTarget().getStatus());
}
@Test
public void refundPayPalTransaction() {
String nonce = TestHelper.generateOneTimePayPalNonce(gateway);
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(nonce).
options().
submitForSettlement(true).
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
TestHelper.settle(gateway, transaction.getId());
Result<Transaction> result = gateway.transaction().refund(transaction.getId(), TransactionAmount.AUTHORIZE.amount.divide(new BigDecimal(2)));
assertTrue(result.isSuccess());
assertEquals(Transaction.Type.CREDIT, result.getTarget().getType());
assertEquals(TransactionAmount.AUTHORIZE.amount.divide(new BigDecimal(2)), result.getTarget().getAmount());
}
@Test
public void paypalTransactionReturnsSettlementResponseCode() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(Nonce.PayPalFuturePayment).
options().
submitForSettlement(true).
done();
Result<Transaction> authResult = gateway.transaction().sale(request);
assertTrue(authResult.isSuccess());
TestingGateway testingGateway = gateway.testing();
testingGateway.settlementDecline(authResult.getTarget().getId());
Transaction transaction = gateway.transaction().find(authResult.getTarget().getId());
assertEquals(Transaction.Status.SETTLEMENT_DECLINED, transaction.getStatus());
assertEquals("4001", transaction.getProcessorSettlementResponseCode());
assertEquals("Settlement Declined", transaction.getProcessorSettlementResponseText());
}
@Test
public void returnsAllRequiredPaypalFields() {
Transaction transaction = gateway.transaction().find("settledtransaction");
assertNotNull(transaction.getPayPalDetails().getDebugId());
assertNotNull(transaction.getPayPalDetails().getPayerEmail());
assertNotNull(transaction.getPayPalDetails().getAuthorizationId());
assertNotNull(transaction.getPayPalDetails().getPayerId());
assertNotNull(transaction.getPayPalDetails().getPayerFirstName());
assertNotNull(transaction.getPayPalDetails().getPayerLastName());
assertNotNull(transaction.getPayPalDetails().getPayerStatus());
assertNotNull(transaction.getPayPalDetails().getSellerProtectionStatus());
assertNotNull(transaction.getPayPalDetails().getCaptureId());
assertNotNull(transaction.getPayPalDetails().getRefundId());
assertNotNull(transaction.getPayPalDetails().getTransactionFeeAmount());
assertNotNull(transaction.getPayPalDetails().getTransactionFeeCurrencyIsoCode());
}
@Test
public void settleAltPayTransaction() {
BraintreeGateway altpayGateway = new BraintreeGateway(
Environment.DEVELOPMENT,
"altpay_merchant",
"altpay_merchant_public_key",
"altpay_merchant_private_key"
);
Result<Customer> customerResult = altpayGateway.customer().create(new CustomerRequest());
assertTrue(customerResult.isSuccess());
Customer customer = customerResult.getTarget();
String nonce = TestHelper.generateEuropeBankAccountNonce(altpayGateway, customer);
TransactionRequest request = new TransactionRequest().
merchantAccountId("fake_sepa_ma").
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(nonce).
options().
submitForSettlement(true).
done();
Transaction transaction = altpayGateway.transaction().sale(request).getTarget();
TestHelper.settle(altpayGateway, transaction.getId());
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId());
ResourceCollection<Transaction> searchResult = altpayGateway.transaction().search(searchRequest);
assertEquals(1, searchResult.getMaximumSize());
assertEquals(Transaction.Status.SETTLED, searchResult.getFirst().getStatus());
}
@Test
public void settlementConfirmTransaction() {
BraintreeGateway altpayGateway = new BraintreeGateway(
Environment.DEVELOPMENT,
"altpay_merchant",
"altpay_merchant_public_key",
"altpay_merchant_private_key"
);
Result<Customer> customerResult = altpayGateway.customer().create(new CustomerRequest());
assertTrue(customerResult.isSuccess());
Customer customer = customerResult.getTarget();
String nonce = TestHelper.generateEuropeBankAccountNonce(altpayGateway, customer);
TransactionRequest request = new TransactionRequest().
merchantAccountId("fake_sepa_ma").
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(nonce).
options().
submitForSettlement(true).
done();
Transaction transaction = altpayGateway.transaction().sale(request).getTarget();
TestHelper.settlement_confirm(altpayGateway, transaction.getId());
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId());
ResourceCollection<Transaction> searchResult = altpayGateway.transaction().search(searchRequest);
assertEquals(1, searchResult.getMaximumSize());
assertEquals(Transaction.Status.SETTLEMENT_CONFIRMED, searchResult.getFirst().getStatus());
}
@Test
public void settlementConfirmTransactionReturnsValidationError() {
BraintreeGateway altpayGateway = new BraintreeGateway(
Environment.DEVELOPMENT,
"altpay_merchant",
"altpay_merchant_public_key",
"altpay_merchant_private_key"
);
Result<Customer> customerResult = altpayGateway.customer().create(new CustomerRequest());
assertTrue(customerResult.isSuccess());
Customer customer = customerResult.getTarget();
String nonce = TestHelper.generateEuropeBankAccountNonce(altpayGateway, customer);
TransactionRequest request = new TransactionRequest().
merchantAccountId("fake_sepa_ma").
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(nonce);
Transaction transaction = altpayGateway.transaction().sale(request).getTarget();
Result<Transaction> result = TestHelper.settlement_decline(altpayGateway, transaction.getId());
assertFalse(result.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_CANNOT_SIMULATE_SETTLEMENT, result.getErrors().forObject("transaction").onField("base").get(0).getCode());
}
@Test
public void settlementDeclineTransaction() {
BraintreeGateway altpayGateway = new BraintreeGateway(
Environment.DEVELOPMENT,
"altpay_merchant",
"altpay_merchant_public_key",
"altpay_merchant_private_key"
);
Result<Customer> customerResult = altpayGateway.customer().create(new CustomerRequest());
assertTrue(customerResult.isSuccess());
Customer customer = customerResult.getTarget();
String nonce = TestHelper.generateEuropeBankAccountNonce(altpayGateway, customer);
TransactionRequest request = new TransactionRequest().
merchantAccountId("fake_sepa_ma").
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(nonce).
options().
submitForSettlement(true).
done();
Transaction transaction = altpayGateway.transaction().sale(request).getTarget();
TestHelper.settlement_decline(altpayGateway, transaction.getId());
TransactionSearchRequest searchRequest = new TransactionSearchRequest().
id().is(transaction.getId());
ResourceCollection<Transaction> searchResult = altpayGateway.transaction().search(searchRequest);
assertEquals(1, searchResult.getMaximumSize());
assertEquals(Transaction.Status.SETTLEMENT_DECLINED, searchResult.getFirst().getStatus());
}
@Test
public void successfulPartialSettlementSale()
{
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.MASTER_CARD.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction authorizedTransaction = result.getTarget();
assertEquals(TransactionAmount.AUTHORIZE.amount, authorizedTransaction.getAmount());
assertEquals(Transaction.Type.SALE, authorizedTransaction.getType());
assertNotNull(authorizedTransaction.getProcessorAuthorizationCode());
assertEquals(Transaction.Status.AUTHORIZED, authorizedTransaction.getStatus());
BigDecimal amount1 = new BigDecimal("400.00");
Result<Transaction> partialSettlementResult1 = gateway.transaction().submitForPartialSettlement(authorizedTransaction.getId(), amount1);
Transaction partialSettlementTransaction1 = partialSettlementResult1.getTarget();
assertEquals(amount1, partialSettlementTransaction1.getAmount());
assertEquals(Transaction.Type.SALE, partialSettlementTransaction1.getType());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, partialSettlementTransaction1.getStatus());
assertEquals(authorizedTransaction.getId(), partialSettlementTransaction1.getAuthorizedTransactionId());
BigDecimal amount2 = new BigDecimal("600.00");
Result<Transaction> partialSettlementResult2 = gateway.transaction().submitForPartialSettlement(authorizedTransaction.getId(), amount2);
Transaction partialSettlementTransaction2 = partialSettlementResult2.getTarget();
assertEquals(amount2, partialSettlementTransaction2.getAmount());
assertEquals(Transaction.Type.SALE, partialSettlementTransaction2.getType());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, partialSettlementTransaction2.getStatus());
Transaction refreshedAuthorizedTransaction = gateway.transaction().find(authorizedTransaction.getId());
assertEquals(2, refreshedAuthorizedTransaction.getPartialSettlementTransactionIds().size());
}
@Test
public void submitForPartialSettlementWithOrderId() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction transaction = gateway.transaction().sale(request).getTarget();
BigDecimal amount = new BigDecimal("400.00");
TransactionRequest submitForPartialSettlementRequest = new TransactionRequest().
amount(amount).
orderId("1234");
Result<Transaction> result = gateway.transaction().submitForPartialSettlement(transaction.getId(), submitForPartialSettlementRequest);
assertTrue(result.isSuccess());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, result.getTarget().getStatus());
assertEquals("1234", result.getTarget().getOrderId());
}
@Test
public void submitForPartialSettlementWithDescriptors()
{
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.VISA.number).
expirationDate("05/2008").
done();
Transaction authorizedTransaction = gateway.transaction().sale(request).getTarget();
BigDecimal amount = new BigDecimal("400.00");
TransactionRequest submitForPartialSettlementRequest = new TransactionRequest().
amount(amount).
descriptor().
name("123*123456789012345678").
phone("3334445555").
url("ebay.com").
done();
Result<Transaction> result = gateway.transaction().submitForPartialSettlement(authorizedTransaction.getId(), submitForPartialSettlementRequest);
assertTrue(result.isSuccess());
assertEquals(Transaction.Status.SUBMITTED_FOR_SETTLEMENT, result.getTarget().getStatus());
assertEquals("123*123456789012345678", result.getTarget().getDescriptor().getName());
assertEquals("3334445555", result.getTarget().getDescriptor().getPhone());
assertEquals("ebay.com", result.getTarget().getDescriptor().getUrl());
}
@Test
public void cannotCreatePartialSettlementTransactionsOnPartialSettlementTransactions() {
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
creditCard().
number(CreditCardNumber.MASTER_CARD.number).
expirationDate("05/2009").
done();
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
Transaction authorizedTransaction = result.getTarget();
BigDecimal amount1 = new BigDecimal("400.00");
Result<Transaction> partialSettlementResult1 = gateway.transaction().submitForPartialSettlement(authorizedTransaction.getId(), amount1);
Transaction partialSettlementTransaction = partialSettlementResult1.getTarget();
BigDecimal amount2 = new BigDecimal("100.00");
Result<Transaction> partialSettlementResult2 = gateway.transaction().submitForPartialSettlement(partialSettlementTransaction.getId(), amount2);
assertFalse(partialSettlementResult2.isSuccess());
assertEquals(ValidationErrorCode.TRANSACTION_CANNOT_SUBMIT_FOR_PARTIAL_SETTLEMENT,
partialSettlementResult2.getErrors().forObject("transaction").onField("base").get(0).getCode());
}
@Test
public void sharedPaymentMethods() {
BraintreeGateway sharerGateway = new BraintreeGateway(Environment.DEVELOPMENT, "integration_merchant_public_id", "oauth_app_partner_user_public_key", "oauth_app_partner_user_private_key");
Customer customer = sharerGateway.customer().create(new CustomerRequest().
creditCard().
number("5105105105105100").
expirationDate("05/19").
billingAddress().
postalCode("94107").
done().
done()
).getTarget();
CreditCard card = customer.getCreditCards().get(0);
Address billingAddress = card.getBillingAddress();
Address shippingAddress = sharerGateway.address().create(customer.getId(),
new AddressRequest().postalCode("94107")).getTarget();
BraintreeGateway oauthGateway = new BraintreeGateway("client_id$development$integration_client_id", "client_secret$development$integration_client_secret");
String code = TestHelper.createOAuthGrant(oauthGateway, "integration_merchant_id", "shared_vault_transactions");
OAuthCredentialsRequest oauthRequest = new OAuthCredentialsRequest().
code(code).
scope("shared_vault_transactions");
Result<OAuthCredentials> accessTokenResult = oauthGateway.oauth().createTokenFromCode(oauthRequest);
BraintreeGateway gateway = new BraintreeGateway(accessTokenResult.getTarget().getAccessToken());
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
sharedPaymentMethodToken(card.getToken()).
sharedCustomerId(customer.getId()).
sharedShippingAddressId(shippingAddress.getId()).
sharedBillingAddressId(billingAddress.getId());
Result<Transaction> result = gateway.transaction().sale(request);
assertTrue(result.isSuccess());
}
@Test
public void paymentMethodGrantIncludeBillingPostalCode() {
BraintreeGateway partnerGateway = new BraintreeGateway(
Environment.DEVELOPMENT,
"integration_merchant_public_id",
"oauth_app_partner_user_public_key",
"oauth_app_partner_user_private_key"
);
Customer customer = partnerGateway.customer().create(new CustomerRequest().
creditCard().
number("5105105105105100").
expirationDate("05/19").
billingAddress().
postalCode("94107").
done().
done()
).getTarget();
CreditCard creditCard = customer.getCreditCards().get(0);
BraintreeGateway oauthGateway = new BraintreeGateway(
"client_id$development$integration_client_id",
"client_secret$development$integration_client_secret"
);
String code = TestHelper.createOAuthGrant(oauthGateway, "integration_merchant_id", "grant_payment_method");
OAuthCredentialsRequest oauthRequest = new OAuthCredentialsRequest().
code(code).
scope("grant_payment_method");
Result<OAuthCredentials> accessTokenResult = oauthGateway.oauth().createTokenFromCode(oauthRequest);
BraintreeGateway grantGateway = new BraintreeGateway(accessTokenResult.getTarget().getAccessToken());
PaymentMethodGrantRequest grantRequest = new PaymentMethodGrantRequest().allowVaulting(false).includeBillingPostalCode(true);
Result<PaymentMethodNonce> grantResult = grantGateway.paymentMethod().grant(creditCard.getToken(), grantRequest);
TransactionRequest request = new TransactionRequest().
amount(TransactionAmount.AUTHORIZE.amount).
paymentMethodNonce(grantResult.getTarget().getNonce());
Result<Transaction> transactionResult = gateway.transaction().sale(request);
assertTrue(transactionResult.isSuccess());
assertEquals(transactionResult.getTarget().getBillingAddress().getPostalCode(), "94107");
}
}