killbill-memoizeit

beatrix: add cancellation tests for Analytics They don't

7/2/2012 6:41:03 PM

Details

diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
index 4aa125a..8a72880 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestAnalytics.java
@@ -55,8 +55,12 @@ import com.ning.billing.util.api.TagDefinitionApiException;
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.tag.TagDefinition;
 
+import static org.testng.Assert.assertTrue;
+
 @Guice(modules = BeatrixModule.class)
 public class TestAnalytics extends TestIntegrationBase {
+    private Plan subscriptionPlan;
+
     @BeforeMethod(groups = "slow")
     public void setUpAnalyticsHandler() throws Exception {
         busService.getBus().register(analyticsListener);
@@ -68,7 +72,7 @@ public class TestAnalytics extends TestIntegrationBase {
     }
 
     @Test(groups = "slow")
-    public void testAnalyticsFutureEvents() throws Exception {
+    public void testCreateAndCancelSubscription() throws Exception {
         // Create an account
         final Account account = verifyAccountCreation();
 
@@ -76,7 +80,7 @@ public class TestAnalytics extends TestIntegrationBase {
         final SubscriptionBundle bundle = verifyFirstBundle(account);
 
         // Add a subscription
-        final Subscription subscription = verifyFirstSubscription(account, bundle);
+        Subscription subscription = verifyFirstSubscription(account, bundle);
 
         // Move after trial
         clock.addDeltaFromReality(AT_LEAST_ONE_MONTH_MS);
@@ -87,10 +91,26 @@ public class TestAnalytics extends TestIntegrationBase {
 
         // Check BST - nothing should have changed
         verifyBSTWithTrialAndEvergreenPhases(account, bundle, subscription);
+
+        // Cancel end of term - refetch the subscription to have the CTD set
+        // (otherwise, cancellation would be immediate)
+        subscription = entitlementUserApi.getSubscriptionFromId(subscription.getId());
+        subscription.cancel(clock.getUTCNow(), true, context);
+
+        waitALittle();
+        verifyBSTWithTrialAndEvergreenPhasesAndCancellation(account, bundle, subscription);
+
+        // Move after cancel date
+        clock.addDeltaFromReality(AT_LEAST_ONE_MONTH_MS);
+        assertTrue(busHandler.isCompleted(DELAY));
+        waitALittle();
+
+        // Check BST received the system cancel event
+        verifyBSTWithTrialAndEvergreenPhasesAndCancellationAndSystemCancellation(account, bundle, subscription);
     }
 
     @Test(groups = "slow")
-    public void testAnalyticsEvents() throws Exception {
+    public void testCreateAndUpdateSubscription() throws Exception {
         // Create an account
         final Account account = verifyAccountCreation();
 
@@ -217,6 +237,7 @@ public class TestAnalytics extends TestIntegrationBase {
         final String planSetName = PriceListSet.DEFAULT_PRICELIST_NAME;
         final PlanPhaseSpecifier phaseSpecifier = new PlanPhaseSpecifier(productName, ProductCategory.BASE, term, planSetName, null);
         final Subscription subscription = entitlementUserApi.createSubscription(bundle.getId(), phaseSpecifier, null, context);
+        subscriptionPlan = subscription.getCurrentPlan();
 
         waitALittle();
 
@@ -266,8 +287,31 @@ public class TestAnalytics extends TestIntegrationBase {
         final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey());
         Assert.assertEquals(transitions.size(), 2);
 
-        final Plan currentPlan = subscription.getCurrentPlan();
-        final Product currentProduct = currentPlan.getProduct();
+        verifyTrialAndEvergreenPhases(account, bundle, subscription);
+    }
+
+    private void verifyBSTWithTrialAndEvergreenPhasesAndCancellation(final Account account, final SubscriptionBundle bundle, final Subscription subscription) throws CatalogApiException {
+        // BST should have three transitions
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey());
+        Assert.assertEquals(transitions.size(), 3);
+
+        verifyTrialAndEvergreenPhases(account, bundle, subscription);
+        verifyCancellationTransition(account, bundle, subscription);
+    }
+
+    private void verifyBSTWithTrialAndEvergreenPhasesAndCancellationAndSystemCancellation(final Account account, final SubscriptionBundle bundle, final Subscription subscription) throws CatalogApiException {
+        // BST should have four transitions
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey());
+        Assert.assertEquals(transitions.size(), 4);
+
+        verifyTrialAndEvergreenPhases(account, bundle, subscription);
+        verifyCancellationTransition(account, bundle, subscription);
+        verifySystemCancellationTransition(account, bundle, subscription);
+    }
+
+    private void verifyTrialAndEvergreenPhases(final Account account, final SubscriptionBundle bundle, final Subscription subscription) throws CatalogApiException {
+        final Product currentProduct = subscriptionPlan.getProduct();
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey());
 
         // Check the first transition (into trial phase)
         final BusinessSubscriptionTransition initialTransition = transitions.get(0);
@@ -291,7 +335,7 @@ public class TestAnalytics extends TestIntegrationBase {
         Assert.assertEquals(initialTransition.getNextSubscription().getProductType(), currentProduct.getCatalogName());
         Assert.assertEquals(initialTransition.getNextSubscription().getSlug(), currentProduct.getName().toLowerCase() + "-monthly-trial");
         Assert.assertEquals(initialTransition.getNextSubscription().getStartDate(), subscription.getStartDate());
-        Assert.assertEquals(initialTransition.getNextSubscription().getState(), subscription.getState());
+        Assert.assertEquals(initialTransition.getNextSubscription().getState(), Subscription.SubscriptionState.ACTIVE);
         Assert.assertEquals(initialTransition.getNextSubscription().getSubscriptionId(), subscription.getId());
 
         // Check the second transition (from trial to evergreen)
@@ -317,10 +361,42 @@ public class TestAnalytics extends TestIntegrationBase {
         Assert.assertEquals(futureTransition.getNextSubscription().getSlug(), currentProduct.getName().toLowerCase() + "-monthly-evergreen");
         // 30 days trial
         Assert.assertEquals(futureTransition.getNextSubscription().getStartDate(), subscription.getStartDate().plusDays(30));
-        Assert.assertEquals(futureTransition.getNextSubscription().getState(), subscription.getState());
+        Assert.assertEquals(futureTransition.getNextSubscription().getState(), Subscription.SubscriptionState.ACTIVE);
         Assert.assertEquals(futureTransition.getNextSubscription().getSubscriptionId(), subscription.getId());
     }
 
+    private void verifyCancellationTransition(final Account account, final SubscriptionBundle bundle, final Subscription subscription) throws CatalogApiException {
+        final Product currentProduct = subscriptionPlan.getProduct();
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey());
+
+        final BusinessSubscriptionTransition cancellationRequest = transitions.get(2);
+        Assert.assertEquals(cancellationRequest.getExternalKey(), bundle.getKey());
+        Assert.assertEquals(cancellationRequest.getAccountKey(), account.getExternalKey());
+        Assert.assertEquals(cancellationRequest.getEvent().getCategory(), currentProduct.getCategory());
+        Assert.assertEquals(cancellationRequest.getEvent().getEventType(), BusinessSubscriptionEvent.EventType.CANCEL);
+
+        Assert.assertNull(cancellationRequest.getNextSubscription());
+        // The actual content has already been checked in verifyTrialAndEvergreenPhases
+        Assert.assertEquals(cancellationRequest.getPreviousSubscription(), transitions.get(1).getNextSubscription());
+    }
+
+    private void verifySystemCancellationTransition(final Account account, final SubscriptionBundle bundle, final Subscription subscription) throws CatalogApiException {
+        final Plan currentPlan = subscription.getCurrentPlan();
+        final Product currentProduct = currentPlan.getProduct();
+
+        final List<BusinessSubscriptionTransition> transitions = analyticsUserApi.getTransitionsForBundle(bundle.getKey());
+
+        final BusinessSubscriptionTransition systemCancellation = transitions.get(3);
+        Assert.assertEquals(systemCancellation.getExternalKey(), bundle.getKey());
+        Assert.assertEquals(systemCancellation.getAccountKey(), account.getExternalKey());
+        Assert.assertEquals(systemCancellation.getEvent().getCategory(), currentProduct.getCategory());
+        Assert.assertEquals(systemCancellation.getEvent().getEventType(), BusinessSubscriptionEvent.EventType.SYSTEM_CANCEL);
+
+        Assert.assertNull(systemCancellation.getNextSubscription());
+        // The actual content has already been checked in verifyTrialAndEvergreenPhases
+        Assert.assertEquals(systemCancellation.getPreviousSubscription(), transitions.get(1).getNextSubscription());
+    }
+
     private void verifyChangePlan(final Account account, final SubscriptionBundle bundle, final Subscription subscription) throws EntitlementUserApiException, InterruptedException {
         final String newProductName = "Assault-Rifle";
         final BillingPeriod newTerm = BillingPeriod.MONTHLY;
@@ -378,6 +454,6 @@ public class TestAnalytics extends TestIntegrationBase {
 
     private void waitALittle() throws InterruptedException {
         // We especially need to wait for entitlement events
-        Thread.sleep(2000);
+        Thread.sleep(4000);
     }
 }