package com.braintreegateway.integrationtest; import com.braintreegateway.*; import com.braintreegateway.SandboxValues.TransactionAmount; import com.braintreegateway.Subscription.Status; import com.braintreegateway.exceptions.NotFoundException; import com.braintreegateway.testhelpers.MerchantAccountTestConstants; import com.braintreegateway.testhelpers.TestHelper; import com.braintreegateway.util.Http; import com.braintreegateway.util.NodeWrapper; import com.braintreegateway.util.NodeWrapperFactory; import org.junit.Before; import org.junit.Test; import java.math.BigDecimal; import java.util.*; import static org.junit.Assert.*; public class SubscriptionIT extends IntegrationTest implements MerchantAccountTestConstants { private Customer customer; private CreditCard creditCard; @Before public void createCustomer() { CustomerRequest request = new CustomerRequest(); request. creditCard(). cardholderName("Fred Jones"). number("5105105105105100"). expirationDate("05/12"). done(); Result<Customer> result = this.gateway.customer().create(request); assertTrue(result.isSuccess()); this.customer = result.getTarget(); this.creditCard = customer.getCreditCards().get(0); } @SuppressWarnings("deprecation") @Test public void createSimpleSubscriptionWithoutTrial() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); Calendar expectedBillingPeriodEndDate = Calendar.getInstance(); expectedBillingPeriodEndDate.setTimeZone(TimeZone.getTimeZone("US/Mountain")); expectedBillingPeriodEndDate.add(Calendar.MONTH, plan.getBillingFrequency()); expectedBillingPeriodEndDate.add(Calendar.DAY_OF_MONTH, -1); Calendar expectedNextBillingDate = Calendar.getInstance(); expectedNextBillingDate.setTimeZone(TimeZone.getTimeZone("US/Mountain")); expectedNextBillingDate.add(Calendar.MONTH, plan.getBillingFrequency()); Calendar expectedBillingPeriodStartDate = Calendar.getInstance(); expectedBillingPeriodStartDate.setTimeZone(TimeZone.getTimeZone("US/Mountain")); Calendar expectedFirstDate = Calendar.getInstance(); expectedFirstDate.setTimeZone(TimeZone.getTimeZone("US/Mountain")); assertEquals(creditCard.getToken(), subscription.getPaymentMethodToken()); assertEquals(plan.getId(), subscription.getPlanId()); assertEquals(plan.getPrice(), subscription.getPrice()); assertEquals(new BigDecimal("0.00"), subscription.getBalance()); assertEquals(new Integer(1), subscription.getCurrentBillingCycle()); assertEquals(new BigDecimal("12.34"), subscription.getNextBillAmount()); assertEquals(new BigDecimal("12.34"), subscription.getNextBillingPeriodAmount()); assertTrue(subscription.getId().matches("^\\w{6}$")); assertEquals(Subscription.Status.ACTIVE, subscription.getStatus()); assertEquals(new Integer(0), subscription.getFailureCount()); assertEquals(false, subscription.hasTrialPeriod()); assertEquals(DEFAULT_MERCHANT_ACCOUNT_ID, subscription.getMerchantAccountId()); Calendar expectedCreateUpdateDate = Calendar.getInstance(); expectedCreateUpdateDate.add(Calendar.HOUR, -1); assertTrue(expectedCreateUpdateDate.compareTo(subscription.getCreatedAt()) < 0); assertTrue(expectedCreateUpdateDate.compareTo(subscription.getUpdatedAt()) < 0); assertEquals(Subscription.Status.ACTIVE, subscription.getStatusHistory().get(0).getStatus()); assertEquals(Subscription.Source.API, subscription.getStatusHistory().get(0).getSource()); assertEquals(new BigDecimal("12.34"), subscription.getStatusHistory().get(0).getPrice()); assertEquals(new BigDecimal("0.00"), subscription.getStatusHistory().get(0).getBalance()); assertEquals("USD", subscription.getStatusHistory().get(0).getCurrencyIsoCode()); assertEquals("integration_trialless_plan", subscription.getStatusHistory().get(0).getPlanId()); TestHelper.assertDatesEqual(expectedBillingPeriodEndDate, subscription.getBillingPeriodEndDate()); TestHelper.assertDatesEqual(expectedBillingPeriodStartDate, subscription.getBillingPeriodStartDate()); TestHelper.assertDatesEqual(expectedBillingPeriodEndDate, subscription.getPaidThroughDate()); TestHelper.assertDatesEqual(expectedNextBillingDate, subscription.getNextBillingDate()); TestHelper.assertDatesEqual(expectedFirstDate, subscription.getFirstBillingDate()); } @SuppressWarnings("deprecation") @Test public void createSimpleSubscriptionWithPaymentMethodNonce() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; String customerId = creditCard.getCustomerId(); String nonce = TestHelper.generateUnlockedNonce(gateway, customerId, "4111111111111111"); SubscriptionRequest request = new SubscriptionRequest(). paymentMethodNonce(nonce). planId(plan.getId()); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals("1111", subscription.getTransactions().get(0).getCreditCard().getLast4()); } @Test public void createReturnsTransactionWithSubscriptionBillingPeriod() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); Transaction transaction = subscription.getTransactions().get(0); assertEquals(subscription.getBillingPeriodStartDate(), transaction.getSubscription().getBillingPeriodStartDate()); assertEquals(subscription.getBillingPeriodEndDate(), transaction.getSubscription().getBillingPeriodEndDate()); } @Test public void createSimpleSubscriptionWithTrial() { Plan plan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); Calendar expectedFirstAndNextBillingDate = Calendar.getInstance(); expectedFirstAndNextBillingDate.setTimeZone(TimeZone.getTimeZone("US/Mountain")); expectedFirstAndNextBillingDate.add(Calendar.DAY_OF_MONTH, plan.getTrialDuration()); assertEquals(plan.getId(), subscription.getPlanId()); assertEquals(plan.getPrice(), subscription.getPrice()); assertEquals(creditCard.getToken(), subscription.getPaymentMethodToken()); assertTrue(subscription.getId().matches("^\\w{6}$")); assertEquals(Subscription.Status.ACTIVE, subscription.getStatus()); assertEquals(null, subscription.getBillingPeriodStartDate()); assertEquals(null, subscription.getBillingPeriodEndDate()); assertEquals(new Integer(0), subscription.getCurrentBillingCycle()); assertEquals(new Integer(0), subscription.getFailureCount()); assertEquals(true, subscription.hasTrialPeriod()); assertEquals(plan.getTrialDuration(), subscription.getTrialDuration()); assertEquals(plan.getTrialDurationUnit().toString(), subscription.getTrialDurationUnit().toString()); TestHelper.assertDatesEqual(expectedFirstAndNextBillingDate, subscription.getNextBillingDate()); TestHelper.assertDatesEqual(expectedFirstAndNextBillingDate, subscription.getFirstBillingDate()); } @Test public void createWithPayPalAccountToken() { String nonce = TestHelper.generateFuturePaymentPayPalNonce(gateway); Result<Customer> customerResult = gateway.customer().create(new CustomerRequest()); assertTrue(customerResult.isSuccess()); Customer customer = customerResult.getTarget(); PaymentMethodRequest paymentMethodRequest = new PaymentMethodRequest(). customerId(customer.getId()). paymentMethodNonce(nonce); Result<? extends PaymentMethod> paypalResult = gateway.paymentMethod().create(paymentMethodRequest); assertTrue(paypalResult.isSuccess()); PaymentMethod paymentMethod = paypalResult.getTarget(); Plan plan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(paymentMethod.getToken()). planId(plan.getId()); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals(paymentMethod.getToken(), subscription.getPaymentMethodToken()); } @Test public void overridePlanAddTrial() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). trialPeriod(true). trialDuration(2). trialDurationUnit(Subscription.DurationUnit.MONTH); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals(true, subscription.hasTrialPeriod()); assertEquals(new Integer(2), subscription.getTrialDuration()); assertEquals(Subscription.DurationUnit.MONTH, subscription.getTrialDurationUnit()); } @Test public void overridePlanRemoveTrial() { Plan plan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). trialPeriod(false); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals(false, subscription.hasTrialPeriod()); } @Test public void overridePlanPrice() { Plan plan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). price(new BigDecimal("482.48")); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals(new BigDecimal("482.48"), subscription.getPrice()); } @Test public void overridePlanNumberOfBillingCycles() { Plan plan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Subscription subscription = gateway.subscription().create(request).getTarget(); assertEquals(plan.getNumberOfBillingCycles(), subscription.getNumberOfBillingCycles()); SubscriptionRequest overrideRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). numberOfBillingCycles(10); Subscription overriddenSubsription = gateway.subscription().create(overrideRequest).getTarget(); assertEquals(new Integer(10), overriddenSubsription.getNumberOfBillingCycles()); assertFalse(overriddenSubsription.neverExpires()); } @Test public void setNeverExpires() { Plan plan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). neverExpires(true); Subscription subscription = gateway.subscription().create(request).getTarget(); assertNull(subscription.getNumberOfBillingCycles()); assertTrue(subscription.neverExpires()); } @Test public void setNumberOfBillingCyclesAndUpdateToNeverExpire() { Plan plan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). numberOfBillingCycles(10); Subscription subscription = gateway.subscription().create(request).getTarget(); SubscriptionRequest updateRequest = new SubscriptionRequest(). neverExpires(true); Subscription updatedSubscription = gateway.subscription().update(subscription.getId(), updateRequest).getTarget(); assertNull(updatedSubscription.getNumberOfBillingCycles()); } @Test public void setNumberOfBillingCyclesAndUpdate() { Plan plan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). numberOfBillingCycles(10); Subscription subscription = gateway.subscription().create(request).getTarget(); SubscriptionRequest updateRequest = new SubscriptionRequest(). numberOfBillingCycles(14); Subscription updatedSubscription = gateway.subscription().update(subscription.getId(), updateRequest).getTarget(); assertEquals(new Integer(14), updatedSubscription.getNumberOfBillingCycles()); } @Test public void inheritBillingDayOfMonth() { SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.BILLING_DAY_OF_MONTH_PLAN.getId()); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals(new Integer(5), subscription.getBillingDayOfMonth()); } @Test public void overrideBillingDayOfMonth() { SubscriptionRequest request = new SubscriptionRequest(). billingDayOfMonth(19). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.BILLING_DAY_OF_MONTH_PLAN.getId()); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals(new Integer(19), subscription.getBillingDayOfMonth()); } @Test public void overrideBillingDayOfMonthWithStartImmediately() { SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.BILLING_DAY_OF_MONTH_PLAN.getId()). options(). startImmediately(true). done(); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals(1, subscription.getTransactions().size()); } @Test public void setFirstBillingDate() { Calendar firstBillingDate = Calendar.getInstance(); firstBillingDate.add(Calendar.DAY_OF_MONTH, 3); firstBillingDate.setTimeZone(TimeZone.getTimeZone("UTC")); SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.BILLING_DAY_OF_MONTH_PLAN.getId()). firstBillingDate(firstBillingDate); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); TestHelper.assertDatesEqual(firstBillingDate, subscription.getFirstBillingDate()); assertEquals(Subscription.Status.PENDING, subscription.getStatus()); } @Test public void setFirstBillingDateInThePast() { Calendar firstBillingDate = Calendar.getInstance(); firstBillingDate.add(Calendar.DAY_OF_MONTH, -3); SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.BILLING_DAY_OF_MONTH_PLAN.getId()). firstBillingDate(firstBillingDate); Result<Subscription> createResult = gateway.subscription().create(request); assertFalse(createResult.isSuccess()); List<ValidationError> errors = createResult.getErrors().forObject("subscription").onField("firstBillingDate"); assertEquals(ValidationErrorCode.SUBSCRIPTION_FIRST_BILLING_DATE_CANNOT_BE_IN_THE_PAST, errors.get(0).getCode()); } @Test public void setId() { Plan plan = PlanFixture.PLAN_WITH_TRIAL; String newId = "new-id-" + new Random().nextInt(); SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). price(new BigDecimal("482.48")). id(newId); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals(newId, subscription.getId()); } @Test public void setMerchantAccountId() { Plan plan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). price(new BigDecimal("482.48")). merchantAccountId(NON_DEFAULT_MERCHANT_ACCOUNT_ID); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals(NON_DEFAULT_MERCHANT_ACCOUNT_ID, subscription.getMerchantAccountId()); } @Test public void hasTransactionOnCreateWithNoTrial() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). price(new BigDecimal("482.48")); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); Transaction transaction = subscription.getTransactions().get(0); assertEquals(1, subscription.getTransactions().size()); assertEquals(new BigDecimal("482.48"), transaction.getAmount()); assertEquals(Transaction.Type.SALE, transaction.getType()); assertEquals(subscription.getId(), transaction.getSubscriptionId()); } @Test public void hasTransactionOnCreateWhenTransactionFails() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). price(SandboxValues.TransactionAmount.DECLINE.amount); Result<Subscription> result = gateway.subscription().create(request); assertFalse(result.isSuccess()); assertEquals(Transaction.Status.PROCESSOR_DECLINED, result.getTransaction().getStatus()); } @Test public void hasNoTransactionOnCreateWithATrial() { Plan plan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals(0, subscription.getTransactions().size()); } @Test public void createInheritsNoAddOnsAndDiscountsWhenOptionIsPassed() { Plan plan = PlanFixture.ADD_ON_DISCOUNT_PLAN; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). options(). doNotInheritAddOnsOrDiscounts(true). done(); Result<Subscription> result = gateway.subscription().create(request); assertTrue(result.isSuccess()); Subscription subscription = result.getTarget(); assertEquals(0, subscription.getAddOns().size()); assertEquals(0, subscription.getDiscounts().size()); } @Test public void createInheritsAddOnsAndDiscountsFromPlan() { Plan plan = PlanFixture.ADD_ON_DISCOUNT_PLAN; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Result<Subscription> result = gateway.subscription().create(request); assertTrue(result.isSuccess()); Subscription subscription = result.getTarget(); List<AddOn> addOns = subscription.getAddOns(); Collections.sort(addOns, new TestHelper.CompareModificationsById()); assertEquals(2, addOns.size()); assertEquals("increase_10", addOns.get(0).getId()); assertEquals(new BigDecimal("10.00"), addOns.get(0).getAmount()); assertEquals(new Integer(1), addOns.get(0).getQuantity()); assertTrue(addOns.get(0).neverExpires()); assertNull(addOns.get(0).getNumberOfBillingCycles()); assertEquals(new Integer(0), addOns.get(0).getCurrentBillingCycle()); assertEquals("increase_20", addOns.get(1).getId()); assertEquals(new BigDecimal("20.00"), addOns.get(1).getAmount()); assertEquals(new Integer(1), addOns.get(1).getQuantity()); assertTrue(addOns.get(1).neverExpires()); assertNull(addOns.get(1).getNumberOfBillingCycles()); assertEquals(new Integer(0), addOns.get(1).getCurrentBillingCycle()); List<Discount> discounts = subscription.getDiscounts(); Collections.sort(discounts, new TestHelper.CompareModificationsById()); assertEquals(2, discounts.size()); assertEquals("discount_11", discounts.get(0).getId()); assertEquals(new BigDecimal("11.00"), discounts.get(0).getAmount()); assertEquals(new Integer(1), discounts.get(0).getQuantity()); assertTrue(discounts.get(0).neverExpires()); assertNull(discounts.get(0).getNumberOfBillingCycles()); assertEquals(new Integer(0), discounts.get(0).getCurrentBillingCycle()); assertEquals("discount_7", discounts.get(1).getId()); assertEquals(new BigDecimal("7.00"), discounts.get(1).getAmount()); assertEquals(new Integer(1), discounts.get(1).getQuantity()); assertTrue(discounts.get(1).neverExpires()); assertNull(discounts.get(1).getNumberOfBillingCycles()); assertEquals(new Integer(0), discounts.get(1).getCurrentBillingCycle()); } @Test public void createOverridesInheritedAddOnsAndDiscounts() { Plan plan = PlanFixture.ADD_ON_DISCOUNT_PLAN; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). addOns(). update("increase_10"). amount(new BigDecimal("30.00")). numberOfBillingCycles(3). quantity(9). done(). update("increase_20"). amount(new BigDecimal("40.00")). done(). done(). discounts(). update("discount_7"). amount(new BigDecimal("15.00")). neverExpires(true). done(). update("discount_11"). amount(new BigDecimal("23.00")). done(). done(); Result<Subscription> result = gateway.subscription().create(request); assertTrue(result.isSuccess()); Subscription subscription = result.getTarget(); List<AddOn> addOns = subscription.getAddOns(); Collections.sort(addOns, new TestHelper.CompareModificationsById()); assertEquals(2, addOns.size()); assertEquals("increase_10", addOns.get(0).getId()); assertEquals(new BigDecimal("30.00"), addOns.get(0).getAmount()); assertEquals(new Integer(3), addOns.get(0).getNumberOfBillingCycles()); assertFalse(addOns.get(0).neverExpires()); assertEquals(new Integer(9), addOns.get(0).getQuantity()); assertEquals(new Integer(0), addOns.get(0).getCurrentBillingCycle()); assertEquals("increase_20", addOns.get(1).getId()); assertEquals(new BigDecimal("40.00"), addOns.get(1).getAmount()); assertEquals(new Integer(1), addOns.get(1).getQuantity()); assertEquals(new Integer(0), addOns.get(1).getCurrentBillingCycle()); List<Discount> discounts = subscription.getDiscounts(); Collections.sort(discounts, new TestHelper.CompareModificationsById()); assertEquals(2, discounts.size()); assertEquals("discount_11", discounts.get(0).getId()); assertEquals(new BigDecimal("23.00"), discounts.get(0).getAmount()); assertNull(discounts.get(0).getNumberOfBillingCycles()); assertTrue(discounts.get(0).neverExpires()); assertEquals(new Integer(1), discounts.get(0).getQuantity()); assertEquals(new Integer(0), discounts.get(0).getCurrentBillingCycle()); assertEquals("discount_7", discounts.get(1).getId()); assertEquals(new BigDecimal("15.00"), discounts.get(1).getAmount()); assertEquals(new Integer(1), discounts.get(1).getQuantity()); assertEquals(new Integer(0), discounts.get(1).getCurrentBillingCycle()); } @Test public void createRemovesInheritedAddOnsAndDiscounts() { Plan plan = PlanFixture.ADD_ON_DISCOUNT_PLAN; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). addOns(). remove("increase_10", "increase_20"). done(). discounts(). remove("discount_7", "discount_11"). done(); Result<Subscription> result = gateway.subscription().create(request); assertTrue(result.isSuccess()); Subscription subscription = result.getTarget(); assertEquals(0, subscription.getAddOns().size()); assertEquals(0, subscription.getDiscounts().size()); } @Test public void createRemovesInheritedAddOnsAndDiscountsWithListsOrChaining() { Plan plan = PlanFixture.ADD_ON_DISCOUNT_PLAN; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). addOns(). remove(Arrays.asList("increase_10", "increase_20")). done(). discounts(). remove("discount_7"). remove("discount_11"). done(); Result<Subscription> result = gateway.subscription().create(request); assertTrue(result.isSuccess()); Subscription subscription = result.getTarget(); assertEquals(0, subscription.getAddOns().size()); assertEquals(0, subscription.getDiscounts().size()); } @Test public void createAddsNewAddOnsAndDiscounts() { Plan plan = PlanFixture.ADD_ON_DISCOUNT_PLAN; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). addOns(). remove("increase_10", "increase_20"). add(). inheritedFromId("increase_30"). amount(new BigDecimal("40.00")). neverExpires(false). numberOfBillingCycles(6). quantity(3). done(). done(). discounts(). remove("discount_7", "discount_11"). add(). inheritedFromId("discount_15"). amount(new BigDecimal("17.00")). neverExpires(true). numberOfBillingCycles(null). quantity(2). done(). done(); Result<Subscription> result = gateway.subscription().create(request); assertTrue(result.isSuccess()); Subscription subscription = result.getTarget(); assertEquals(1, subscription.getAddOns().size()); assertEquals(new BigDecimal("40.00"), subscription.getAddOns().get(0).getAmount()); assertEquals(new Integer(6), subscription.getAddOns().get(0).getNumberOfBillingCycles()); assertFalse(subscription.getAddOns().get(0).neverExpires()); assertEquals(new Integer(3), subscription.getAddOns().get(0).getQuantity()); assertEquals(new Integer(0), subscription.getAddOns().get(0).getCurrentBillingCycle()); assertEquals(1, subscription.getDiscounts().size()); assertEquals(new BigDecimal("17.00"), subscription.getDiscounts().get(0).getAmount()); assertNull(subscription.getDiscounts().get(0).getNumberOfBillingCycles()); assertTrue(subscription.getDiscounts().get(0).neverExpires()); assertEquals(new Integer(2), subscription.getDiscounts().get(0).getQuantity()); assertEquals(new Integer(0), subscription.getDiscounts().get(0).getCurrentBillingCycle()); } @Test public void createWithBadQuantityCorrectlyParsesValidationErrors() { Plan plan = PlanFixture.ADD_ON_DISCOUNT_PLAN; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). addOns(). update("addon_7"). amount(new BigDecimal("-15")). done(). update("discount_7"). quantity(-10). done(). done(); Result<Subscription> result = gateway.subscription().create(request); assertFalse(result.isSuccess()); assertEquals(ValidationErrorCode.SUBSCRIPTION_MODIFICATION_AMOUNT_IS_INVALID, result.getErrors().forObject("subscription").forObject("addOns").forObject("update").forIndex(0).onField("amount").get(0).getCode()); assertEquals(ValidationErrorCode.SUBSCRIPTION_MODIFICATION_QUANTITY_IS_INVALID, result.getErrors().forObject("subscription").forObject("addOns").forObject("update").forIndex(1).onField("quantity").get(0).getCode()); } @Test public void find() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); Subscription foundSubscription = gateway.subscription().find(subscription.getId()); assertEquals(subscription.getId(), foundSubscription.getId()); assertEquals(subscription.getPaymentMethodToken(), creditCard.getToken()); assertEquals(subscription.getPlanId(), plan.getId()); } @Test public void findWithEmptyIds() { try { gateway.subscription().find(" "); fail("Should throw NotFoundException"); } catch (NotFoundException e) { } } @Test public void updateId() { String oldId = "old-id-" + new Random().nextInt(); Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). id(oldId); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); String newId = "new-id-" + new Random().nextInt(); SubscriptionRequest updateRequest = new SubscriptionRequest().id(newId); Result<Subscription> result = gateway.subscription().update(oldId, updateRequest); assertTrue(result.isSuccess()); Subscription subscription = result.getTarget(); assertEquals(newId, subscription.getId()); assertNotNull(gateway.subscription().find(newId)); } @Test public void updateMerchantAccountId() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); SubscriptionRequest updateRequest = new SubscriptionRequest() .merchantAccountId(NON_DEFAULT_MERCHANT_ACCOUNT_ID); Result<Subscription> result = gateway.subscription().update(createResult.getTarget().getId(), updateRequest); assertTrue(result.isSuccess()); Subscription subscription = result.getTarget(); assertEquals(NON_DEFAULT_MERCHANT_ACCOUNT_ID, subscription.getMerchantAccountId()); } @Test public void updatePlan() { Plan originalPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(originalPlan.getId()); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); Plan newPlan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest updateRequest = new SubscriptionRequest().planId(newPlan.getId()); Result<Subscription> result = gateway.subscription().update(subscription.getId(), updateRequest); assertTrue(result.isSuccess()); subscription = result.getTarget(); assertEquals(newPlan.getId(), subscription.getPlanId()); } @Test public void updatePaymentMethod() { Plan originalPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(originalPlan.getId()); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); CreditCardRequest request = new CreditCardRequest(). customerId(customer.getId()). cardholderName("John Doe"). cvv("123"). number("5105105105105100"). expirationDate("05/12"); CreditCard newCreditCard = gateway.creditCard().create(request).getTarget(); SubscriptionRequest updateRequest = new SubscriptionRequest().paymentMethodToken(newCreditCard.getToken()); Result<Subscription> result = gateway.subscription().update(subscription.getId(), updateRequest); assertTrue(result.isSuccess()); subscription = result.getTarget(); assertEquals(newCreditCard.getToken(), subscription.getPaymentMethodToken()); } @Test public void createAProrationTransactionOnPriceIncreaseWhenFlagIsNotPassed() { Plan originalPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(originalPlan.getId()). price(new BigDecimal("1.23")); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); SubscriptionRequest updateRequest = new SubscriptionRequest().price(new BigDecimal("4.56")); Result<Subscription> result = gateway.subscription().update(subscription.getId(), updateRequest); assertTrue(result.isSuccess()); subscription = result.getTarget(); assertEquals(new BigDecimal("4.56"), subscription.getPrice()); assertEquals(2, subscription.getTransactions().size()); } @Test public void createAProrationTransactionOnPriceIncreaseWhenProrationFlagIsTrue() { Plan originalPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(originalPlan.getId()). price(new BigDecimal("1.23")); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); SubscriptionRequest updateRequest = new SubscriptionRequest(). price(new BigDecimal("4.56")). options(). prorateCharges(true). done(); Result<Subscription> result = gateway.subscription().update(subscription.getId(), updateRequest); assertTrue(result.isSuccess()); subscription = result.getTarget(); assertEquals(new BigDecimal("4.56"), subscription.getPrice()); assertEquals(2, subscription.getTransactions().size()); } @Test public void doNotCreateAProrationTransactionOnPriceIncreaseWhenProrationFlagIsFalse() { Plan originalPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(originalPlan.getId()). price(new BigDecimal("1.23")); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); SubscriptionRequest updateRequest = new SubscriptionRequest(). price(new BigDecimal("4.56")). options(). prorateCharges(false). done(); Result<Subscription> result = gateway.subscription().update(subscription.getId(), updateRequest); assertTrue(result.isSuccess()); subscription = result.getTarget(); assertEquals(new BigDecimal("4.56"), subscription.getPrice()); assertEquals(1, subscription.getTransactions().size()); } @Test public void doNotUpdateIfReverting() { Plan originalPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(originalPlan.getId()). price(new BigDecimal("1.23")); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); Subscription createdSubscription = createResult.getTarget(); SubscriptionRequest updateRequest = new SubscriptionRequest(). price(new BigDecimal("2100")). options(). prorateCharges(true). revertSubscriptionOnProrationFailure(true). done(); Result<Subscription> result = gateway.subscription().update(createdSubscription.getId(), updateRequest); assertFalse(result.isSuccess()); Subscription subscription = result.getSubscription(); assertEquals(createdSubscription.getTransactions().size() + 1, subscription.getTransactions().size()); assertEquals(Transaction.Status.PROCESSOR_DECLINED, subscription.getTransactions().get(0).getStatus()); assertEquals(new BigDecimal("0.00"), subscription.getBalance()); assertEquals(new BigDecimal("1.23"), subscription.getPrice()); } @Test public void UpdateIfNotReverting() { Plan originalPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(originalPlan.getId()). price(new BigDecimal("1.23")); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); Subscription createdSubscription = createResult.getTarget(); SubscriptionRequest updateRequest = new SubscriptionRequest(). price(new BigDecimal("2100")). options(). prorateCharges(true). revertSubscriptionOnProrationFailure(false). done(); Result<Subscription> result = gateway.subscription().update(createdSubscription.getId(), updateRequest); assertTrue(result.isSuccess()); Subscription subscription = result.getTarget(); assertEquals(createdSubscription.getTransactions().size() + 1, subscription.getTransactions().size()); assertEquals(Transaction.Status.PROCESSOR_DECLINED, subscription.getTransactions().get(0).getStatus()); assertEquals(subscription.getTransactions().get(0).getAmount(), subscription.getBalance()); assertEquals(new BigDecimal("2100.00"), subscription.getPrice()); } @Test public void dontIncreasePriceAndDontAddTransaction() { Plan originalPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(originalPlan.getId()); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); SubscriptionRequest updateRequest = new SubscriptionRequest().price(new BigDecimal("4.56")); Result<Subscription> result = gateway.subscription().update(subscription.getId(), updateRequest); assertTrue(result.isSuccess()); subscription = result.getTarget(); assertEquals(new BigDecimal("4.56"), subscription.getPrice()); assertEquals(1, subscription.getTransactions().size()); } @Test public void updateAddOnsAndDiscounts() { Plan plan = PlanFixture.ADD_ON_DISCOUNT_PLAN; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Subscription subscription = gateway.subscription().create(createRequest).getTarget(); SubscriptionRequest request = new SubscriptionRequest(). addOns(). update("increase_10"). amount(new BigDecimal("30.00")). quantity(9). done(). remove("increase_20"). add(). inheritedFromId("increase_30"). amount(new BigDecimal("31.00")). quantity(7). done(). done(). discounts(). update("discount_7"). amount(new BigDecimal("15.00")). done(). remove("discount_11"). add(). inheritedFromId("discount_15"). amount(new BigDecimal("23.00")). done(). done(); Result<Subscription> result = gateway.subscription().update(subscription.getId(), request); assertTrue(result.isSuccess()); Subscription updatedSubscription = result.getTarget(); List<AddOn> addOns = updatedSubscription.getAddOns(); Collections.sort(addOns, new TestHelper.CompareModificationsById()); assertEquals(2, addOns.size()); assertEquals(new BigDecimal("30.00"), addOns.get(0).getAmount()); assertEquals(new Integer(9), addOns.get(0).getQuantity()); assertEquals(new BigDecimal("31.00"), addOns.get(1).getAmount()); assertEquals(new Integer(7), addOns.get(1).getQuantity()); List<Discount> discounts = updatedSubscription.getDiscounts(); Collections.sort(discounts, new TestHelper.CompareModificationsById()); assertEquals(2, discounts.size()); assertEquals("discount_15", discounts.get(0).getId()); assertEquals(new BigDecimal("23.00"), discounts.get(0).getAmount()); assertEquals(new Integer(1), discounts.get(0).getQuantity()); assertEquals("discount_7", discounts.get(1).getId()); assertEquals(new BigDecimal("15.00"), discounts.get(1).getAmount()); assertEquals(new Integer(1), discounts.get(1).getQuantity()); } @Test public void updateWithPaymentMethodNonce() { Plan originalPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(originalPlan.getId()); Result<Subscription> createResult = gateway.subscription().create(createRequest); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); String customerId = creditCard.getCustomerId(); CreditCardRequest request = new CreditCardRequest(). customerId(customer.getId()). cardholderName("John Doe"). cvv("123"). number("5105105105105100"). expirationDate("05/12"); CreditCard newCreditCard = gateway.creditCard().create(request).getTarget(); String nonce = TestHelper.generateUnlockedNonce(gateway, customerId, "4111111111111111"); SubscriptionRequest updateRequest = new SubscriptionRequest().paymentMethodNonce(nonce); Result<Subscription> result = gateway.subscription().update(subscription.getId(), updateRequest); assertTrue(result.isSuccess()); subscription = result.getTarget(); } @Test public void updateCanReplaceAllAddOnsAndDiscounts() { Plan plan = PlanFixture.ADD_ON_DISCOUNT_PLAN; SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Subscription subscription = gateway.subscription().create(createRequest).getTarget(); SubscriptionRequest request = new SubscriptionRequest(). addOns(). add(). inheritedFromId("increase_30"). done(). done(). discounts(). add(). inheritedFromId("discount_15"). done(). done(). options(). replaceAllAddOnsAndDiscounts(true). done(); Result<Subscription> result = gateway.subscription().update(subscription.getId(), request); assertTrue(result.isSuccess()); Subscription updatedSubscription = result.getTarget(); assertEquals(1, updatedSubscription.getAddOns().size()); assertEquals(1, updatedSubscription.getDiscounts().size()); } @Test public void updateWithDescriptor() { Plan plan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). numberOfBillingCycles(10). descriptor(). name("123*123456789012345678"). phone("1234567890"). done(); Subscription subscription = gateway.subscription().create(request).getTarget(); SubscriptionRequest updateRequest = new SubscriptionRequest(). descriptor(). name("999*99"). phone("1234567891"). done(); Subscription updatedSubscription = gateway.subscription().update(subscription.getId(), updateRequest).getTarget(); assertEquals("999*99", updatedSubscription.getDescriptor().getName()); assertEquals("1234567891", updatedSubscription.getDescriptor().getPhone()); } @Test public void createWithBadPlanId() { SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId("noSuchPlanId"); Result<Subscription> result = gateway.subscription().create(createRequest); assertFalse(result.isSuccess()); assertEquals(ValidationErrorCode.SUBSCRIPTION_PLAN_ID_IS_INVALID, result.getErrors().forObject("subscription").onField("planId").get(0).getCode()); } @Test public void createWithBadPaymentMethod() { SubscriptionRequest createRequest = new SubscriptionRequest(). paymentMethodToken("invalidToken"). planId(PlanFixture.PLAN_WITHOUT_TRIAL.getId()); Result<Subscription> result = gateway.subscription().create(createRequest); assertFalse(result.isSuccess()); assertEquals(ValidationErrorCode.SUBSCRIPTION_PAYMENT_METHOD_TOKEN_IS_INVALID, result.getErrors().forObject("subscription").onField("paymentMethodToken").get(0).getCode()); } @Test public void createWithDescriptor() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). descriptor(). name("123*123456789012345678"). phone("3334445555"). url("ebay.com"). done(); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription subscription = createResult.getTarget(); assertEquals("123*123456789012345678", subscription.getDescriptor().getName()); assertEquals("3334445555", subscription.getDescriptor().getPhone()); Transaction transaction = subscription.getTransactions().get(0); assertEquals("123*123456789012345678", transaction.getDescriptor().getName()); assertEquals("3334445555", transaction.getDescriptor().getPhone()); assertEquals("ebay.com", transaction.getDescriptor().getUrl()); } @Test public void createWithDescriptorValidation() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). descriptor(). name("xxxx"). phone("xxx"). url("12345678901234"). done(); Result<Subscription> result = gateway.subscription().create(request); assertFalse(result.isSuccess()); assertEquals(ValidationErrorCode.DESCRIPTOR_NAME_FORMAT_IS_INVALID, result.getErrors().forObject("subscription").forObject("descriptor").onField("name").get(0).getCode()); assertEquals(ValidationErrorCode.DESCRIPTOR_PHONE_FORMAT_IS_INVALID, result.getErrors().forObject("subscription").forObject("descriptor").onField("phone").get(0).getCode()); assertEquals(ValidationErrorCode.DESCRIPTOR_URL_FORMAT_IS_INVALID, result.getErrors().forObject("subscription").forObject("descriptor").onField("url").get(0).getCode()); } @Test public void validationErrorsOnCreate() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). id("invalid id"); Result<Subscription> createResult = gateway.subscription().create(request); assertFalse(createResult.isSuccess()); assertNull(createResult.getTarget()); ValidationErrors errors = createResult.getErrors(); assertEquals(ValidationErrorCode.SUBSCRIPTION_TOKEN_FORMAT_IS_INVALID, errors.forObject("subscription").onField("id").get(0).getCode()); } @Test public void validationErrorsOnUpdate() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Result<Subscription> createResult = gateway.subscription().create(request); assertTrue(createResult.isSuccess()); Subscription createdSubscription = createResult.getTarget(); SubscriptionRequest updateRequest = new SubscriptionRequest().id("invalid id"); Result<Subscription> result = gateway.subscription().update(createdSubscription.getId(), updateRequest); assertFalse(result.isSuccess()); assertNull(result.getTarget()); ValidationErrors errors = result.getErrors(); assertEquals(ValidationErrorCode.SUBSCRIPTION_TOKEN_FORMAT_IS_INVALID, errors.forObject("subscription").onField("id").get(0).getCode()); } @Test public void getParamsOnError() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). id("invalid id"); Result<Subscription> createResult = gateway.subscription().create(request); assertFalse(createResult.isSuccess()); assertNull(createResult.getTarget()); Map<String, String> parameters = createResult.getParameters(); assertEquals(plan.getId(), parameters.get("plan_id")); assertEquals("invalid id", parameters.get("id")); } @Test public void cancel() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()); Result<Subscription> createResult = gateway.subscription().create(request); Result<Subscription> cancelResult = gateway.subscription().cancel(createResult.getTarget().getId()); assertTrue(cancelResult.isSuccess()); assertEquals(Subscription.Status.CANCELED, cancelResult.getTarget().getStatus()); assertEquals(Subscription.Status.CANCELED, gateway.subscription().find(createResult.getTarget().getId()).getStatus()); } @Test public void searchCreatedAt() { SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()); Subscription subscription = gateway.subscription().create(request).getTarget(); Calendar yesterday = Calendar.getInstance(); yesterday.setTime(new Date(System.currentTimeMillis() - 24*60*60*1000)); Calendar tomorrow = Calendar.getInstance(); tomorrow.setTime(new Date(System.currentTimeMillis() + 24*60*60*1000)); Calendar dayAfterTomorrow = Calendar.getInstance(); dayAfterTomorrow.setTime(new Date(System.currentTimeMillis() + 2*24*60*60*1000)); SubscriptionSearchRequest emptySearch = new SubscriptionSearchRequest(). createdAt().between(tomorrow,dayAfterTomorrow); ResourceCollection<Subscription> emptyResults = gateway.subscription().search(emptySearch); assertTrue(emptyResults.getMaximumSize() == 0); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). createdAt().between(yesterday,tomorrow); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(results.getMaximumSize() > 0); } @Test public void searchOnBillingCyclesRemaining() { SubscriptionRequest request12 = new SubscriptionRequest(). numberOfBillingCycles(12). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()). price(new BigDecimal(5)); Subscription subscription12 = gateway.subscription().create(request12).getTarget(); SubscriptionRequest request11 = new SubscriptionRequest(). numberOfBillingCycles(11). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()). price(new BigDecimal(5)); Subscription subscription11 = gateway.subscription().create(request11).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). billingCyclesRemaining().is(12). price().is(new BigDecimal(5)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription12)); assertFalse(TestHelper.includesSubscription(results, subscription11)); } @Test public void searchOnDaysPastDue() { SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()); Subscription subscription = gateway.subscription().create(request).getTarget(); makePastDue(subscription, 3); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). daysPastDue().between(2, 10); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(results.getMaximumSize() > 0); for (Subscription foundSubscription : results) { assertTrue(foundSubscription.getDaysPastDue() >= 2 && foundSubscription.getDaysPastDue() <= 10); } } @Test public void searchOnIdIs() { Random rand = new Random(); SubscriptionRequest request1 = new SubscriptionRequest(). id("find_me" + rand.nextInt()). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()). price(new BigDecimal(2)); Subscription subscription1 = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). id("do_not_find_me" + rand.nextInt()). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()). price(new BigDecimal(2)); Subscription subscription2 = gateway.subscription().create(request2).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). id().startsWith("find_me"). price().is(new BigDecimal(2)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription1)); assertFalse(TestHelper.includesSubscription(results, subscription2)); } @Test public void searchOnInTrialPeriod() { Random rand = new Random(); SubscriptionRequest request1 = new SubscriptionRequest(). id("find_me" + rand.nextInt()). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()). price(new BigDecimal(2)); Subscription subscriptionWithTrial = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). id("do_not_find_me" + rand.nextInt()). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITHOUT_TRIAL.getId()). price(new BigDecimal(2)); Subscription subscriptionWithoutTrial = gateway.subscription().create(request2).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). inTrialPeriod().is(true); ResourceCollection<Subscription> subscriptionsWithTrialPeriods = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(subscriptionsWithTrialPeriods, subscriptionWithTrial)); assertFalse(TestHelper.includesSubscription(subscriptionsWithTrialPeriods, subscriptionWithoutTrial)); search = new SubscriptionSearchRequest(). inTrialPeriod().is(false); ResourceCollection<Subscription> subscriptionsWithoutTrialPeriods = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(subscriptionsWithoutTrialPeriods, subscriptionWithoutTrial)); assertFalse(TestHelper.includesSubscription(subscriptionsWithoutTrialPeriods, subscriptionWithTrial)); } @Test public void searchOnMerchantAccountIdIs() { SubscriptionRequest request1 = new SubscriptionRequest(). merchantAccountId(DEFAULT_MERCHANT_ACCOUNT_ID). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()). price(new BigDecimal(3)); Subscription subscriptionDefaultMerchantAccount = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). merchantAccountId(NON_DEFAULT_MERCHANT_ACCOUNT_ID). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()). price(new BigDecimal(3)); Subscription subscriptionNonDefaultMerchantAccount = gateway.subscription().create(request2).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). merchantAccountId().is(NON_DEFAULT_MERCHANT_ACCOUNT_ID). price().is(new BigDecimal(3)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscriptionNonDefaultMerchantAccount)); assertFalse(TestHelper.includesSubscription(results, subscriptionDefaultMerchantAccount)); } @Test public void searchOnBogusMerchantAccountIdIs() { SubscriptionRequest request1 = new SubscriptionRequest(). merchantAccountId(DEFAULT_MERCHANT_ACCOUNT_ID). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()). price(new BigDecimal(5)); Subscription subscription = gateway.subscription().create(request1).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). merchantAccountId().is(subscription.getMerchantAccountId()). price().is(new BigDecimal(5)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription)); search = new SubscriptionSearchRequest(). merchantAccountId().in(subscription.getMerchantAccountId(), "totally_bogus"). price().is(new BigDecimal(5)); results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription)); search = new SubscriptionSearchRequest(). merchantAccountId().is("totally_bogus"). price().is(new BigDecimal(5)); results = gateway.subscription().search(search); assertFalse(TestHelper.includesSubscription(results, subscription)); } @Test public void searchOnNextBillingDate() { SubscriptionRequest request1 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()); SubscriptionRequest request2 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITHOUT_TRIAL.getId()); Subscription trialSubscription = gateway.subscription().create(request1).getTarget(); Subscription triallessSubscription = gateway.subscription().create(request2).getTarget(); Calendar expectedNextBillingDate = Calendar.getInstance(); expectedNextBillingDate.add(Calendar.DAY_OF_MONTH, 5); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). nextBillingDate().greaterThanOrEqualTo(expectedNextBillingDate); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, triallessSubscription)); assertFalse(TestHelper.includesSubscription(results, trialSubscription)); } @Test public void searchOnPlanIdIs() { Plan trialPlan = PlanFixture.PLAN_WITH_TRIAL; Plan triallessPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request1 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(trialPlan.getId()). price(new BigDecimal(7)); Subscription subscription1 = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(triallessPlan.getId()). price(new BigDecimal(7)); Subscription subscription2 = gateway.subscription().create(request2).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). planId().is(trialPlan.getId()). price().is(new BigDecimal(7)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription1)); assertFalse(TestHelper.includesSubscription(results, subscription2)); } @Test public void searchOnPlanIdIsNot() { Plan trialPlan = PlanFixture.PLAN_WITH_TRIAL; Plan triallessPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request1 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(trialPlan.getId()). price(new BigDecimal(8)); Subscription subscription1 = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(triallessPlan.getId()). price(new BigDecimal(8)); Subscription subscription2 = gateway.subscription().create(request2).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). planId().isNot(trialPlan.getId()). price().is(new BigDecimal(8)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription2)); assertFalse(TestHelper.includesSubscription(results, subscription1)); } @Test public void searchOnPlanIdEndsWith() { Plan trialPlan = PlanFixture.PLAN_WITH_TRIAL; Plan triallessPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request1 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(trialPlan.getId()). price(new BigDecimal(9)); Subscription subscription1 = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(triallessPlan.getId()). price(new BigDecimal(9)); Subscription subscription2 = gateway.subscription().create(request2).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). planId().endsWith("trial_plan"). price().is(new BigDecimal(9)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription1)); assertFalse(TestHelper.includesSubscription(results, subscription2)); } @Test public void searchOnPlanIdStartsWith() { Plan trialPlan = PlanFixture.PLAN_WITH_TRIAL; Plan triallessPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request1 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(trialPlan.getId()). price(new BigDecimal(10)); Subscription subscription1 = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(triallessPlan.getId()). price(new BigDecimal(10)); Subscription subscription2 = gateway.subscription().create(request2).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). planId().startsWith("integration_trial_p"). price().is(new BigDecimal(10)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription1)); assertFalse(TestHelper.includesSubscription(results, subscription2)); } @Test public void searchOnPlanIdContains() { Plan trialPlan = PlanFixture.PLAN_WITH_TRIAL; Plan triallessPlan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request1 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(trialPlan.getId()). price(new BigDecimal(11)); Subscription subscription1 = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(triallessPlan.getId()). price(new BigDecimal(11)); Subscription subscription2 = gateway.subscription().create(request2).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). planId().contains("trial_p"). price().is(new BigDecimal(11)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription1)); assertFalse(TestHelper.includesSubscription(results, subscription2)); } @Test public void searchOnPlanIdIn() { SubscriptionRequest request1 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITH_TRIAL.getId()). price(new BigDecimal(6)); Subscription subscription1 = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITHOUT_TRIAL.getId()). price(new BigDecimal(6)); Subscription subscription2 = gateway.subscription().create(request2).getTarget(); SubscriptionRequest request3 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.ADD_ON_DISCOUNT_PLAN.getId()). price(new BigDecimal(6)); Subscription subscription3 = gateway.subscription().create(request3).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). planId().in(PlanFixture.PLAN_WITH_TRIAL.getId(), PlanFixture.PLAN_WITHOUT_TRIAL.getId()). price().is(new BigDecimal(6)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription1)); assertTrue(TestHelper.includesSubscription(results, subscription2)); assertFalse(TestHelper.includesSubscription(results, subscription3)); } @Test public void searchOnStatusIn() { Plan trialPlan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request1 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(trialPlan.getId()). price(new BigDecimal(12)); Subscription subscription1 = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(trialPlan.getId()). price(new BigDecimal(12)); Subscription subscription2 = gateway.subscription().create(request2).getTarget(); gateway.subscription().cancel(subscription2.getId()); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). status().in(Status.ACTIVE). price().is(new BigDecimal(12)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription1)); assertFalse(TestHelper.includesSubscription(results, subscription2)); } @Test public void searchOnStatusExpired() { SubscriptionSearchRequest search = new SubscriptionSearchRequest(). status().in(Status.EXPIRED); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(results.getMaximumSize() > 0); for (Subscription subscription : results) { assertEquals(Status.EXPIRED, subscription.getStatus()); } } @Test public void searchOnStatusInWithMultipleStatusesAsList() { Plan trialPlan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request1 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(trialPlan.getId()). price(new BigDecimal(13)); Subscription subscription1 = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(trialPlan.getId()). price(new BigDecimal(13)); Subscription subscription2 = gateway.subscription().create(request2).getTarget(); gateway.subscription().cancel(subscription2.getId()); List<Status> statuses = new ArrayList<Status>(); statuses.add(Status.ACTIVE); statuses.add(Status.CANCELED); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). status().in(statuses). price().is(new BigDecimal(13)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription1)); assertTrue(TestHelper.includesSubscription(results, subscription2)); } @Test public void searchOnStatusInWithMultipleStatuses() { Plan trialPlan = PlanFixture.PLAN_WITH_TRIAL; SubscriptionRequest request1 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(trialPlan.getId()). price(new BigDecimal(14)); Subscription subscription1 = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(trialPlan.getId()). price(new BigDecimal(14)); Subscription subscription2 = gateway.subscription().create(request2).getTarget(); gateway.subscription().cancel(subscription2.getId()); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). status().in(Status.ACTIVE, Status.CANCELED). price().is(new BigDecimal(14)); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription1)); assertTrue(TestHelper.includesSubscription(results, subscription2)); } @Test public void searchOnTransactionId() { Plan plan = PlanFixture.PLAN_WITHOUT_TRIAL; SubscriptionRequest request1 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). price(new BigDecimal(14)); Subscription subscription1 = gateway.subscription().create(request1).getTarget(); SubscriptionRequest request2 = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(plan.getId()). price(new BigDecimal(14)); Subscription subscription2 = gateway.subscription().create(request2).getTarget(); SubscriptionSearchRequest search = new SubscriptionSearchRequest(). transactionId().is(subscription1.getTransactions().get(0).getId()); ResourceCollection<Subscription> results = gateway.subscription().search(search); assertTrue(TestHelper.includesSubscription(results, subscription1)); assertFalse(TestHelper.includesSubscription(results, subscription2)); } @Test public void unrecognizedStatus() { String xml = "<subscription><status>foobar</status></subscription>"; Subscription transaction = new Subscription(NodeWrapperFactory.instance.create(xml)); assertEquals(Subscription.Status.UNRECOGNIZED, transaction.getStatus()); } @Test public void unrecognizedDurationUnit() { String xml = "<subscription><trial-duration-unit>foobar</trial-duration-unit></subscription>"; Subscription transaction = new Subscription(NodeWrapperFactory.instance.create(xml)); assertEquals(Subscription.DurationUnit.UNRECOGNIZED, transaction.getTrialDurationUnit()); } @Test public void retryChargeWithAmount() { SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITHOUT_TRIAL.getId()); Subscription subscription = gateway.subscription().create(request).getTarget(); makePastDue(subscription, 1); Result<Transaction> result = gateway.subscription().retryCharge(subscription.getId(), TransactionAmount.AUTHORIZE.amount); assertTrue(result.isSuccess()); Transaction transaction = result.getTarget(); assertEquals(TransactionAmount.AUTHORIZE.amount, transaction.getAmount()); 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)); } @Test public void retryChargeWithoutAmount() { SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITHOUT_TRIAL.getId()); Subscription subscription = gateway.subscription().create(request).getTarget(); makePastDue(subscription, 1); Result<Transaction> result = gateway.subscription().retryCharge(subscription.getId()); assertTrue(result.isSuccess()); Transaction transaction = result.getTarget(); assertEquals(subscription.getPrice(), transaction.getAmount()); 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)); } @Test public void pastDueSubscriptionReportsCorrectStatus() { SubscriptionRequest request = new SubscriptionRequest(). paymentMethodToken(creditCard.getToken()). planId(PlanFixture.PLAN_WITHOUT_TRIAL.getId()); Subscription subscription = gateway.subscription().create(request).getTarget(); makePastDue(subscription, 1); Subscription foundSubscription = gateway.subscription().find(subscription.getId()); assertEquals(Status.PAST_DUE, foundSubscription.getStatus()); } private void makePastDue(Subscription subscription, int numberOfDaysPastDue) { NodeWrapper response = new Http(gateway.getConfiguration()).put(gateway.getConfiguration().getMerchantPath() + "/subscriptions/" + subscription.getId() + "/make_past_due?days_past_due=" + numberOfDaysPastDue); assertTrue(response.isSuccess()); } }