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());
+ }
+}