killbill-aplcache

analytics: PREV_* should be NULL for event type ADD_* Signed-off-by:

6/8/2012 12:36:50 PM

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
index 45d84ee..9e44c15 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
@@ -102,11 +102,14 @@ public class BusinessSubscriptionTransitionRecorder {
         // The ISubscriptionTransition interface gives us all the prev/next information we need but the start date
         // of the previous plan. We need to retrieve it from our own transitions table
         DateTime previousEffectiveTransitionTime = null;
-        final List<BusinessSubscriptionTransition> transitions = dao.getTransitions(transitionKey);
-        if (transitions != null && transitions.size() > 0) {
-            final BusinessSubscriptionTransition lastTransition = transitions.get(transitions.size() - 1);
-            if (lastTransition != null && lastTransition.getNextSubscription() != null) {
-                previousEffectiveTransitionTime = lastTransition.getNextSubscription().getStartDate();
+        // For creation events, the prev subscription will always be null
+        if (event.getEventType() != BusinessSubscriptionEvent.EventType.ADD) {
+            final List<BusinessSubscriptionTransition> transitions = dao.getTransitions(transitionKey);
+            if (transitions != null && transitions.size() > 0) {
+                final BusinessSubscriptionTransition lastTransition = transitions.get(transitions.size() - 1);
+                if (lastTransition != null && lastTransition.getNextSubscription() != null) {
+                    previousEffectiveTransitionTime = lastTransition.getNextSubscription().getStartDate();
+                }
             }
         }
 
@@ -115,7 +118,6 @@ public class BusinessSubscriptionTransitionRecorder {
         if (previousEffectiveTransitionTime == null) {
             prevSubscription = null;
         } else {
-
             prevSubscription = new BusinessSubscription(transition.getPreviousPriceList(), transition.getPreviousPlan(), transition.getPreviousPhase(), currency, previousEffectiveTransitionTime, transition.getPreviousState(), transition.getSubscriptionId(), transition.getBundleId(), catalogService.getFullCatalog());
         }
         final BusinessSubscription nextSubscription;
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 0081366..f48563a 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -242,7 +242,7 @@ public class TestAnalyticsService extends TestWithEmbeddedDB {
         invoice.addInvoiceItem(invoiceItem);
 
         invoiceDao.create(invoice, context);
-        List<Invoice> invoices = invoiceDao.getInvoicesByAccount(account.getId());
+        final List<Invoice> invoices = invoiceDao.getInvoicesByAccount(account.getId());
         Assert.assertEquals(invoices.size(), 1);
         Assert.assertEquals(invoices.get(0).getInvoiceItems().size(), 1);
 
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
index 036b426..6a03abc 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
@@ -123,15 +123,13 @@ public class TestAnalyticsListener extends AnalyticsTestSuite {
         return createExpectedBST(id, event, requestedTransitionTime, effectiveTransitionTime, lastSubscription, subscriptionState);
     }
 
-
     private BusinessSubscriptionTransition createExpectedBST(
             final UUID eventId,
             final BusinessSubscriptionEvent eventType,
             final DateTime requestedTransitionTime,
             final DateTime effectiveTransitionTime,
             @Nullable final BusinessSubscription previousSubscription,
-            @Nullable final Subscription.SubscriptionState nextState
-    ) {
+            @Nullable final Subscription.SubscriptionState nextState) {
         return new BusinessSubscriptionTransition(
                 eventId,
                 KEY,
@@ -177,7 +175,6 @@ public class TestAnalyticsListener extends AnalyticsTestSuite {
         );
     }
 
-
     private SubscriptionTransitionData createCancelSubscriptionTransition(final DateTime requestedTransitionTime, final DateTime effectiveTransitionTime, final Subscription.SubscriptionState previousState) {
         final ApiEventType eventType = ApiEventType.CANCEL;
         // next state is null for canceled events
@@ -227,34 +224,4 @@ public class TestAnalyticsListener extends AnalyticsTestSuite {
                 true
         );
     }
-
-
-    private SubscriptionTransitionData createSubscriptionTransition(
-            final ApiEventType eventType,
-            final DateTime requestedTransitionTime,
-            final DateTime effectiveTransitionTime,
-            final Subscription.SubscriptionState previousState,
-            final Subscription.SubscriptionState nextState
-    ) {
-        return new SubscriptionTransitionData(
-                UUID.randomUUID(),
-                subscriptionId,
-                bundleUUID,
-                EntitlementEvent.EventType.API_USER,
-                eventType,
-                requestedTransitionTime,
-                effectiveTransitionTime,
-                previousState,
-                plan,
-                phase,
-                priceList,
-                nextState,
-                plan,
-                phase,
-                priceList,
-                1L,
-                null,
-                true
-        );
-    }
 }
\ No newline at end of file
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
new file mode 100644
index 0000000..b5cf557
--- /dev/null
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestBusinessSubscriptionTransitionRecorder.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning 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
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.analytics;
+
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.mockito.Mockito;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountUserApi;
+import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionDao;
+import com.ning.billing.catalog.api.Catalog;
+import com.ning.billing.catalog.api.CatalogService;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.entitlement.api.user.EntitlementUserApi;
+import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.ning.billing.entitlement.api.user.SubscriptionEvent;
+
+public class TestBusinessSubscriptionTransitionRecorder extends AnalyticsTestSuite {
+    @Test(groups = "fast")
+    public void testCreateAddOn() throws Exception {
+        final UUID key = UUID.randomUUID();
+
+        // Setup the catalog
+        final CatalogService catalogService = Mockito.mock(CatalogService.class);
+        Mockito.when(catalogService.getFullCatalog()).thenReturn(Mockito.mock(Catalog.class));
+
+        // Setup the dao
+        final BusinessSubscriptionTransitionDao dao = new MockBusinessSubscriptionTransitionDao();
+        // Add a previous subscription to make sure it doesn't impact the addon
+        final BusinessSubscription nextPrevSubscription = new BusinessSubscription(UUID.randomUUID().toString(),
+                                                                                   UUID.randomUUID().toString(),
+                                                                                   UUID.randomUUID().toString(),
+                                                                                   Currency.USD,
+                                                                                   new DateTime(DateTimeZone.UTC),
+                                                                                   Subscription.SubscriptionState.ACTIVE,
+                                                                                   UUID.randomUUID(),
+                                                                                   UUID.randomUUID(),
+                                                                                   catalogService.getFullCatalog());
+        dao.createTransition(new BusinessSubscriptionTransition(UUID.randomUUID(),
+                                                                key.toString(),
+                                                                UUID.randomUUID().toString(),
+                                                                new DateTime(DateTimeZone.UTC),
+                                                                BusinessSubscriptionEvent.valueOf("ADD_MISC"),
+                                                                null,
+                                                                nextPrevSubscription));
+
+        // Setup the entitlement API
+        final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
+        Mockito.when(bundle.getKey()).thenReturn(key.toString());
+        final EntitlementUserApi entitlementApi = Mockito.mock(EntitlementUserApi.class);
+        Mockito.when(entitlementApi.getBundleFromId(Mockito.<UUID>any())).thenReturn(bundle);
+
+        // Setup the account API
+        final Account account = Mockito.mock(Account.class);
+        Mockito.when(account.getExternalKey()).thenReturn(key.toString());
+        final AccountUserApi accountApi = Mockito.mock(AccountUserApi.class);
+        Mockito.when(accountApi.getAccountById(bundle.getAccountId())).thenReturn(account);
+
+        final BusinessSubscriptionTransitionRecorder recorder = new BusinessSubscriptionTransitionRecorder(dao, catalogService, entitlementApi, accountApi);
+
+        // Create an new subscription event
+        final SubscriptionEvent event = Mockito.mock(SubscriptionEvent.class);
+        Mockito.when(event.getId()).thenReturn(UUID.randomUUID());
+        Mockito.when(event.getRequestedTransitionTime()).thenReturn(new DateTime(DateTimeZone.UTC));
+        Mockito.when(event.getNextPlan()).thenReturn(UUID.randomUUID().toString());
+        Mockito.when(event.getEffectiveTransitionTime()).thenReturn(new DateTime(DateTimeZone.UTC));
+        Mockito.when(event.getSubscriptionStartDate()).thenReturn(new DateTime(DateTimeZone.UTC));
+        recorder.subscriptionCreated(event);
+
+        Assert.assertEquals(dao.getTransitions(key.toString()).size(), 2);
+        final BusinessSubscriptionTransition transition = dao.getTransitions(key.toString()).get(1);
+        Assert.assertEquals(transition.getId(), event.getId());
+        Assert.assertEquals(transition.getAccountKey(), key.toString());
+        // Make sure all the prev_ columns are null
+        Assert.assertNull(transition.getPreviousSubscription());
+    }
+}