killbill-aplcache

Ongoinf repair test/bug fix

4/20/2012 2:34:43 PM

Details

diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/repair/DefaultEntitlementRepairApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/repair/DefaultEntitlementRepairApi.java
index 4db5523..23e55dc 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/repair/DefaultEntitlementRepairApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/repair/DefaultEntitlementRepairApi.java
@@ -189,10 +189,7 @@ public class DefaultEntitlementRepairApi implements EntitlementRepairApi {
                 return createGetBundleRepair(input.getBundleId(), input.getViewId(), repairs);
             } else {
                 dao.repair(input.getBundleId(), inRepair, context);
-                bundle = dao.getSubscriptionBundleFromId(input.getBundleId());
-                String newViewId = getViewId(((SubscriptionBundleData) bundle).getLastSysUpdateTime(), subscriptions);
-                final List<SubscriptionRepair> repairs = createGetSubscriptionRepairList(subscriptions, Collections.<SubscriptionRepair>emptyList()); 
-                return createGetBundleRepair(input.getBundleId(), viewId, repairs);
+                return getBundleRepair(input.getBundleId());
             }
         } finally {
             repairDao.cleanup();
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementSqlDao.java
index d066389..85c203a 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementSqlDao.java
@@ -609,7 +609,7 @@ public class EntitlementSqlDao implements EntitlementDao {
 
                 EventSqlDao transEventDao = transactional.become(EventSqlDao.class);
                 for (SubscriptionDataRepair cur : inRepair) {
-                    transactional.updateActiveVersion(cur.getId().toString(), cur.getActiveVersion(), context);
+                    transactional.updateForRepair(cur.getId().toString(), cur.getActiveVersion(), cur.getStartDate().toDate(), cur.getBundleStartDate().toDate(), context);
                     for (EntitlementEvent event : cur.getInitialEvents()) {
                         transEventDao.updateVersion(event.getId().toString(), cur.getActiveVersion(), context);
                     }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EventSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EventSqlDao.java
index 5889c95..a927be3 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EventSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EventSqlDao.java
@@ -68,7 +68,7 @@ public interface EventSqlDao extends Transactional<EventSqlDao>, CloseMe, Transm
 
     @SqlUpdate
     public void updateVersion(@Bind("event_id")String eventId,
-                              @Bind("current_version") Long currentVersion, 
+                              @Bind("current_version") Long currentVersion,
                               @CallContextBinder final CallContext context);
     
     @SqlQuery
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
index b61b287..92c37db 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.java
@@ -62,9 +62,14 @@ public interface SubscriptionSqlDao extends Transactional<SubscriptionSqlDao>, C
     public void updateChargedThroughDate(@Bind("id") String id, @Bind("ctd_dt") Date ctd,
                                    @CallContextBinder final CallContext context);
 
+    @SqlUpdate void updateActiveVersion(@Bind("id") String id, @Bind("active_version") long activeVersion,
+            @CallContextBinder final CallContext context);
+    
     @SqlUpdate
-    public void updateActiveVersion(@Bind("id") String id, @Bind("active_version") long activeVersion,
-                                   @CallContextBinder final CallContext context);
+    public void updateForRepair(@Bind("id") String id, @Bind("active_version") long activeVersion,
+            @Bind("start_dt") Date startDate,
+            @Bind("bundle_start_dt") Date bundleStartDate,
+            @CallContextBinder final CallContext context);
 
     public static class SubscriptionBinder extends BinderBase implements Binder<Bind, SubscriptionData> {
         @Override
diff --git a/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg b/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg
index 671be3f..804f6ae 100644
--- a/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg
+++ b/entitlement/src/main/resources/com/ning/billing/entitlement/engine/dao/SubscriptionSqlDao.sql.stg
@@ -79,3 +79,15 @@ updateActiveVersion() ::= <<
     where id = :id
     ;
 >>
+
+updateForRepair() ::= <<
+    update subscriptions
+    set
+      active_version = :active_version
+      , start_dt = :start_dt
+      , bundle_start_dt = :bundle_start_dt
+      , updated_by = :userName
+      , updated_date = :updatedDate
+    where id = :id
+    ;
+>>
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/repair/TestRepair.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/repair/TestRepair.java
index 5d31076..e51d940 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/repair/TestRepair.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/repair/TestRepair.java
@@ -132,7 +132,7 @@ public class TestRepair extends TestApiBase {
         String newBaseProduct = "Assault-Rifle";
         
         DateTime startDate = clock.getUTCNow();
-        int clockShift = -10;
+        int clockShift = -1;
         DateTime restartDate =  startDate.plusDays(clockShift).minusDays(1);
         LinkedList<ExistingEvent> expected = new LinkedList<SubscriptionRepair.ExistingEvent>();
         
@@ -251,12 +251,38 @@ public class TestRepair extends TestApiBase {
             assertEquals(currentPhase.getPhaseType(), PhaseType.EVERGREEN);
         }
         
-        
        // SECOND RE-ISSUE CALL-- NON DRY RUN
         dryRun = false;
         BundleRepair realRunBundleRepair = repairApi.repairBundle(bRepair, dryRun, context);
 
+        subscriptionRepair = realRunBundleRepair.getSubscriptions();
+        assertEquals(subscriptionRepair.size(), 1);
+        cur = subscriptionRepair.get(0);
+        assertEquals(cur.getId(), baseSubscription.getId());
+
+        events = cur.getExistingEvents();
+        assertEquals(expectedEvents.size(), events.size());
+        index = 0;
+        for (ExistingEvent e : expectedEvents) {
+           validateExistingEventForAssertion(e, events.get(index++));           
+        }
+        SubscriptionData realRunBaseSubscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(baseSubscription.getId());
+        assertEquals(realRunBaseSubscription.getAllTransitions().size(), 2);
         
+        
+        assertEquals(realRunBaseSubscription.getActiveVersion(), SubscriptionEvents.INITIAL_VERSION + 1);
+        assertEquals(realRunBaseSubscription.getBundleId(), bundle.getId());
+        assertEquals(realRunBaseSubscription.getStartDate(), newCreateTime);
+
+        currentPlan = realRunBaseSubscription.getCurrentPlan();
+        assertNotNull(currentPlan);
+        assertEquals(currentPlan.getProduct().getName(), newBaseProduct);
+        assertEquals(currentPlan.getProduct().getCategory(), ProductCategory.BASE);
+        assertEquals(currentPlan.getBillingPeriod(), BillingPeriod.MONTHLY);
+
+        currentPhase = realRunBaseSubscription.getCurrentPhase();
+        assertNotNull(currentPhase);
+        assertEquals(currentPhase.getPhaseType(), PhaseType.TRIAL);
     }
 
     @Test(groups={"slow"})
@@ -277,7 +303,7 @@ public class TestRepair extends TestApiBase {
         expected.add(createExistingEventForAssertion(SubscriptionTransitionType.PHASE, newBaseProduct, PhaseType.EVERGREEN,
                     ProductCategory.BASE, PriceListSet.DEFAULT_PRICELIST_NAME, BillingPeriod.MONTHLY, startDate.plusDays(30)));
 
-        testSimpleBPRepairAddChange(true, startDate, clockShift, baseProduct, newBaseProduct, expected);
+        testSimpleBPRepairAddChange(true, startDate, clockShift, baseProduct, newBaseProduct, expected, 3);
     }
 
     @Test(groups={"slow"})
@@ -297,11 +323,11 @@ public class TestRepair extends TestApiBase {
                 ProductCategory.BASE, PriceListSet.DEFAULT_PRICELIST_NAME, BillingPeriod.MONTHLY, startDate.plusDays(30)));
         expected.add(createExistingEventForAssertion(SubscriptionTransitionType.CHANGE, newBaseProduct, PhaseType.EVERGREEN,
                 ProductCategory.BASE, PriceListSet.DEFAULT_PRICELIST_NAME, BillingPeriod.MONTHLY, changeDate));
-        testSimpleBPRepairAddChange(false, startDate, clockShift, baseProduct, newBaseProduct, expected);
+        testSimpleBPRepairAddChange(false, startDate, clockShift, baseProduct, newBaseProduct, expected, 3);
     }
 
     private void testSimpleBPRepairAddChange(boolean inTrial, DateTime startDate, int clockShift, 
-            String baseProduct, String newBaseProduct, List<ExistingEvent> expectedEvents) throws Exception {
+            String baseProduct, String newBaseProduct, List<ExistingEvent> expectedEvents, int expectedTransitions) throws Exception {
 
         // CREATE BP
         Subscription baseSubscription = createSubscription(baseProduct, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, startDate);
@@ -371,6 +397,39 @@ public class TestRepair extends TestApiBase {
        // SECOND RE-ISSUE CALL-- NON DRY RUN
         dryRun = false;
         BundleRepair realRunBundleRepair = repairApi.repairBundle(bRepair, dryRun, context);
+
+        subscriptionRepair = realRunBundleRepair.getSubscriptions();
+        assertEquals(subscriptionRepair.size(), 1);
+        cur = subscriptionRepair.get(0);
+        assertEquals(cur.getId(), baseSubscription.getId());
+
+        events = cur.getExistingEvents();
+        assertEquals(expectedEvents.size(), events.size());
+        index = 0;
+        for (ExistingEvent e : expectedEvents) {
+           validateExistingEventForAssertion(e, events.get(index++));           
+        }
+        SubscriptionData realRunBaseSubscription = (SubscriptionData) entitlementApi.getSubscriptionFromId(baseSubscription.getId());
+        assertEquals(realRunBaseSubscription.getAllTransitions().size(), expectedTransitions);
+        
+        
+        assertEquals(realRunBaseSubscription.getActiveVersion(), SubscriptionEvents.INITIAL_VERSION + 1);
+        assertEquals(realRunBaseSubscription.getBundleId(), bundle.getId());
+        assertEquals(realRunBaseSubscription.getStartDate(), baseSubscription.getStartDate());
+
+        currentPlan = realRunBaseSubscription.getCurrentPlan();
+        assertNotNull(currentPlan);
+        assertEquals(currentPlan.getProduct().getName(), newBaseProduct);
+        assertEquals(currentPlan.getProduct().getCategory(), ProductCategory.BASE);
+        assertEquals(currentPlan.getBillingPeriod(), BillingPeriod.MONTHLY);
+
+        currentPhase = realRunBaseSubscription.getCurrentPhase();
+        assertNotNull(currentPhase);
+        if (inTrial) {
+            assertEquals(currentPhase.getPhaseType(), PhaseType.TRIAL);
+        } else {
+            assertEquals(currentPhase.getPhaseType(), PhaseType.EVERGREEN);
+        }
         
     }
 
@@ -444,12 +503,12 @@ public class TestRepair extends TestApiBase {
     }
     
     private void validateExistingEventForAssertion(final ExistingEvent expected, final ExistingEvent input) {
-        assertEquals(expected.getPlanPhaseSpecifier().getProductName(), input.getPlanPhaseSpecifier().getProductName());
-        assertEquals(expected.getPlanPhaseSpecifier().getPhaseType(), input.getPlanPhaseSpecifier().getPhaseType());
-        assertEquals(expected.getPlanPhaseSpecifier().getProductCategory(), input.getPlanPhaseSpecifier().getProductCategory());                    
-        assertEquals(expected.getPlanPhaseSpecifier().getPriceListName(), input.getPlanPhaseSpecifier().getPriceListName());                    
-        assertEquals(expected.getPlanPhaseSpecifier().getBillingPeriod(), input.getPlanPhaseSpecifier().getBillingPeriod());
-        assertEquals(expected.getEffectiveDate(), input.getEffectiveDate());        
+        assertEquals(input.getPlanPhaseSpecifier().getProductName(), expected.getPlanPhaseSpecifier().getProductName());
+        assertEquals(input.getPlanPhaseSpecifier().getPhaseType(), expected.getPlanPhaseSpecifier().getPhaseType());
+        assertEquals(input.getPlanPhaseSpecifier().getProductCategory(), expected.getPlanPhaseSpecifier().getProductCategory());                    
+        assertEquals(input.getPlanPhaseSpecifier().getPriceListName(), expected.getPlanPhaseSpecifier().getPriceListName());                    
+        assertEquals(input.getPlanPhaseSpecifier().getBillingPeriod(), expected.getPlanPhaseSpecifier().getBillingPeriod());
+        assertEquals(input.getEffectiveDate(), expected.getEffectiveDate());        
     }
     
     private DeletedEvent createDeletedEvent(final UUID eventId) {