killbill-memoizeit

Merge branch 'fix-for-449'

1/7/2016 7:49:42 PM

Details

diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/SubscriptionJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/SubscriptionJson.java
index fab4d96..c860f33 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/SubscriptionJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/SubscriptionJson.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -313,12 +313,35 @@ public class SubscriptionJson extends JsonBase {
     public SubscriptionJson(final Subscription subscription, @Nullable final AccountAuditLogs accountAuditLogs) {
         super(toAuditLogJson(accountAuditLogs == null ? null : accountAuditLogs.getAuditLogsForSubscription(subscription.getId())));
         this.startDate = subscription.getEffectiveStartDate();
-        // last* fields can be null if the subscription starts in the future
-        this.productName = subscription.getLastActiveProduct() == null ? null : subscription.getLastActiveProduct().getName();
-        this.productCategory = subscription.getLastActiveProductCategory() == null ? null : subscription.getLastActiveProductCategory().name();
-        this.billingPeriod = subscription.getLastActivePlan() == null ? null : subscription.getLastActivePlan().getRecurringBillingPeriod().toString();
-        this.phaseType = subscription.getLastActivePhase() == null ? null : subscription.getLastActivePhase().getPhaseType().toString();
-        this.priceList = subscription.getLastActivePriceList() == null ? null : subscription.getLastActivePriceList().getName();
+
+        // last* fields can be null if the subscription starts in the future - rely on the first available event instead
+        final SubscriptionEvent firstEvent = subscription.getSubscriptionEvents().isEmpty() ? null : subscription.getSubscriptionEvents().get(0);
+        if (subscription.getLastActiveProduct() == null) {
+            this.productName = firstEvent == null ? null : firstEvent.getNextProduct().getName();
+        } else {
+            this.productName = subscription.getLastActiveProduct().getName();
+        }
+        if (subscription.getLastActiveProductCategory() == null) {
+            this.productCategory = firstEvent == null ? null : firstEvent.getNextProduct().getCategory().name();
+        } else {
+            this.productCategory = subscription.getLastActiveProductCategory().name();
+        }
+        if (subscription.getLastActivePlan() == null) {
+            this.billingPeriod = firstEvent == null ? null : firstEvent.getNextPlan().getRecurringBillingPeriod().name();
+        } else {
+            this.billingPeriod = subscription.getLastActivePlan().getRecurringBillingPeriod().toString();
+        }
+        if (subscription.getLastActivePhase() == null) {
+            this.phaseType = firstEvent == null ? null : firstEvent.getNextPhase().getPhaseType().name();
+        } else {
+            this.phaseType = subscription.getLastActivePhase().getPhaseType().toString();
+        }
+        if (subscription.getLastActivePriceList() == null) {
+            this.priceList = firstEvent == null ? null : firstEvent.getNextPriceList().getName();
+        } else {
+            this.priceList = subscription.getLastActivePriceList().getName();
+        }
+
         this.state = subscription.getState().name();
         this.sourceType = subscription.getSourceType().name();
         this.cancelledDate = subscription.getEffectiveEndDate();
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java
index 2f5ca6d..c795c16 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestEntitlement.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -198,7 +198,6 @@ public class TestEntitlement extends TestJaxrsBase {
         assertEquals(objFromJson.getBillingPeriod(), BillingPeriod.MONTHLY);
     }
 
-
     @Test(groups = "slow", description = "Can override a price when creating a subscription")
     public void testOverridePrice() throws Exception {
         final DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
@@ -209,7 +208,6 @@ public class TestEntitlement extends TestJaxrsBase {
         final String productName = "Shotgun";
         final BillingPeriod term = BillingPeriod.ANNUAL;
 
-
         final Subscription input = new Subscription();
         input.setAccountId(accountJson.getAccountId());
         input.setExternalKey("identical");
@@ -221,7 +219,7 @@ public class TestEntitlement extends TestJaxrsBase {
         overrides.add(new PhasePriceOverride(null, PhaseType.TRIAL.toString(), BigDecimal.TEN, null));
         input.setPriceOverrides(overrides);
 
-        final Subscription subscription =  killBillClient.createSubscription(input,  DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC, createdBy, reason, comment);
+        final Subscription subscription = killBillClient.createSubscription(input, DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC, createdBy, reason, comment);
 
         final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), true, false, AuditLevel.FULL);
         assertEquals(invoices.size(), 1);
@@ -235,7 +233,6 @@ public class TestEntitlement extends TestJaxrsBase {
 
         final Account accountJson = createAccountWithDefaultPaymentMethod();
 
-
         final Subscription base = new Subscription();
         base.setAccountId(accountJson.getAccountId());
         base.setExternalKey("base");
@@ -273,4 +270,28 @@ public class TestEntitlement extends TestJaxrsBase {
         assertEquals(invoices.size(), 1);
     }
 
+    @Test(groups = "slow", description = "Can create an entitlement in the future")
+    public void testCreateEntitlementInTheFuture() throws Exception {
+        final DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
+        clock.setDeltaFromReality(initialDate.getMillis() - clock.getUTCNow().getMillis());
+
+        final Account accountJson = createAccountWithDefaultPaymentMethod();
+
+        final Subscription input = new Subscription();
+        input.setAccountId(accountJson.getAccountId());
+        input.setProductName("Shotgun");
+        input.setProductCategory(ProductCategory.BASE);
+        input.setBillingPeriod(BillingPeriod.MONTHLY);
+        input.setPriceList(PriceListSet.DEFAULT_PRICELIST_NAME);
+        final Subscription entitlementJson = killBillClient.createSubscription(input, initialDate.plusMonths(1), -1, createdBy, reason, comment);
+
+        Assert.assertEquals(entitlementJson.getProductName(), input.getProductName());
+        Assert.assertEquals(entitlementJson.getProductCategory(), input.getProductCategory());
+        Assert.assertEquals(entitlementJson.getBillingPeriod(), input.getBillingPeriod());
+        Assert.assertEquals(entitlementJson.getPriceList(), input.getPriceList());
+
+        // Retrieves with GET
+        final Subscription objFromJson = killBillClient.getSubscription(entitlementJson.getSubscriptionId());
+        Assert.assertTrue(objFromJson.equals(entitlementJson));
+    }
 }