killbill-memoizeit
Merge pull request #998 from killbill/work-for-release-0.19.x-dev subscription. …
6/13/2018 2:24:19 PM
Changes
Details
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java
index 62bb358..762437d 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/user/DefaultSubscriptionBase.java
@@ -47,6 +47,7 @@ import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.entitlement.api.Entitlement.EntitlementSourceType;
import org.killbill.billing.entitlement.api.Entitlement.EntitlementState;
import org.killbill.billing.entity.EntityBase;
+import org.killbill.billing.payment.api.TransactionType;
import org.killbill.billing.subscription.api.SubscriptionBase;
import org.killbill.billing.subscription.api.SubscriptionBaseApiService;
import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
@@ -580,8 +581,18 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
public boolean isPendingChangePlan() {
- final SubscriptionBaseTransition pendingTransition = getPendingTransition();
- return pendingTransition != null && pendingTransition.getTransitionType() == SubscriptionBaseTransitionType.CHANGE;
+
+ final SubscriptionBaseTransitionDataIterator it = new SubscriptionBaseTransitionDataIterator(
+ clock, transitions, Order.ASC_FROM_PAST,
+ Visibility.ALL, TimeLimit.FUTURE_ONLY);
+
+ while (it.hasNext()) {
+ final SubscriptionBaseTransition next = it.next();
+ if (next.getTransitionType() == SubscriptionBaseTransitionType.CHANGE) {
+ return true;
+ }
+ }
+ return false;
}
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiChangePlan.java b/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiChangePlan.java
index 31a211e..9b4c902 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiChangePlan.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiChangePlan.java
@@ -613,4 +613,57 @@ public class TestUserApiChangePlan extends SubscriptionTestSuiteWithEmbeddedDB {
assertEquals(refreshedSubscription.getAllTransitions().get(1).getTransitionType(), SubscriptionBaseTransitionType.PHASE);
}
+
+ @Test(groups = "slow")
+ public void testUndoChangePlanOnPendingSubscription() throws SubscriptionBaseApiException {
+
+
+ final DateTime futureStartDate = clock.getUTCNow().plusDays(7);
+ final DefaultSubscriptionBase subscription = testUtil.createSubscription(bundle, "Shotgun", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null, internalCallContext.toLocalDate(futureStartDate));
+ assertNotNull(subscription);
+
+ clock.addDays(1);
+
+ // Change plan in the future
+ final DateTime futureChangeDate = futureStartDate.plusDays(5);
+ subscription.changePlanWithDate(new PlanPhaseSpecifier("Pistol", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME), null, futureChangeDate, callContext);
+ assertListenerStatus();
+
+ DefaultSubscriptionBase refreshedSubscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext);
+ assertEquals(refreshedSubscription.getAllTransitions().size(), 3);
+ assertEquals(refreshedSubscription.getAllTransitions().get(0).getTransitionType(), SubscriptionBaseTransitionType.CREATE);
+ assertEquals(refreshedSubscription.getAllTransitions().get(1).getTransitionType(), SubscriptionBaseTransitionType.CHANGE);
+ assertEquals(refreshedSubscription.getAllTransitions().get(2).getTransitionType(), SubscriptionBaseTransitionType.PHASE);
+ assertEquals(refreshedSubscription.getAllTransitions().get(2).getNextPlan().getName(), "pistol-monthly");
+
+ clock.addDays(1);
+
+ testListener.pushExpectedEvent(NextEvent.UNDO_CHANGE);
+ subscription.undoChangePlan(callContext);
+ assertListenerStatus();
+
+ testListener.pushExpectedEvent(NextEvent.CREATE);
+ clock.addDays(5);
+ assertListenerStatus();
+
+ // No CHANGE_PLAN
+ clock.addDays(5);
+ assertListenerStatus();
+
+
+ // Verify PHASE event for Shotgun is active
+ testListener.pushExpectedEvent(NextEvent.PHASE);
+ clock.addDays(25);
+ assertListenerStatus();
+
+
+ refreshedSubscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext);
+ assertEquals(refreshedSubscription.getAllTransitions().size(), 2);
+ assertEquals(refreshedSubscription.getAllTransitions().get(0).getTransitionType(), SubscriptionBaseTransitionType.CREATE);
+ assertEquals(refreshedSubscription.getAllTransitions().get(1).getTransitionType(), SubscriptionBaseTransitionType.PHASE);
+ assertEquals(refreshedSubscription.getAllTransitions().get(1).getNextPlan().getName(), "shotgun-monthly");
+
+ }
+
+
}