killbill-uncached

#219 - Added new Integration tests for a migration with multiple

11/11/2016 1:48:46 PM

Details

diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestMigrationSubscriptions.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestMigrationSubscriptions.java
index 567b3b4..16eadea 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestMigrationSubscriptions.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestMigrationSubscriptions.java
@@ -237,42 +237,17 @@ public class TestMigrationSubscriptions extends TestIntegrationBase {
         specifierList.add(addOnEntitlementSpecifier1);
 
         busHandler.pushExpectedEvents(NextEvent.BLOCK, NextEvent.BLOCK);
-        BaseEntitlementWithAddOnsSpecifier baseEntitlementWithAddOnsSpecifier = new BaseEntitlementWithAddOnsSpecifier() {
-            @Override
-            public UUID getBundleId() {
-                return null;
-            }
-            @Override
-            public String getExternalKey() {
-                return externalKey;
-            }
-            @Override
-            public Iterable<EntitlementSpecifier> getEntitlementSpecifier() {
-                return specifierList;
-            }
-            @Override
-            public LocalDate getEntitlementEffectiveDate() {
-                return entitlementMigrationDate;
-            }
-            @Override
-            public LocalDate getBillingEffectiveDate() {
-                return billingMigrationDate;
-            }
-            @Override
-            public boolean isMigrated() {
-                return false;
-            }
-        };
+        BaseEntitlementWithAddOnsSpecifier baseEntitlementWithAddOnsSpecifier = buildBaseEntitlementWithAddOnsSpecifier(entitlementMigrationDate, billingMigrationDate, externalKey, specifierList);
         List<BaseEntitlementWithAddOnsSpecifier> baseEntitlementWithAddOnsSpecifierList = new ArrayList<BaseEntitlementWithAddOnsSpecifier>();
         baseEntitlementWithAddOnsSpecifierList.add(baseEntitlementWithAddOnsSpecifier);
 
-        final List<Entitlement> baseEntitlement = entitlementApi.createBaseEntitlementsWithAddOns(
+        final List<Entitlement> baseEntitlements = entitlementApi.createBaseEntitlementsWithAddOns(
                 account.getId(),
                 baseEntitlementWithAddOnsSpecifierList,
                 ImmutableList.<PluginProperty>of(),
                 callContext);
         assertListenerStatus();
-        Assert.assertEquals(baseEntitlement.get(0).getState(), EntitlementState.ACTIVE);
+        Assert.assertEquals(baseEntitlements.get(0).getState(), EntitlementState.ACTIVE);
 
         // Billing starts straight on EVERGREEN
         clock.addMonths(1);
@@ -281,4 +256,98 @@ public class TestMigrationSubscriptions extends TestIntegrationBase {
         assertListenerStatus();
     }
 
+
+    @Test(groups = "slow")
+    public void testMigrationWithMultipleBundlesAndDifferentDates() throws Exception {
+
+        clock.setDay(new LocalDate(2016, 1, 1));
+        final AccountData accountData = getAccountData(1);
+        final Account account = createAccountWithNonOsgiPaymentMethod(accountData);
+        accountChecker.checkAccount(account.getId(), accountData, callContext);
+
+        // We set both entitlement and billing date with desired value
+        final LocalDate entitlementMigrationDateBundle1 = new LocalDate(2015, 12, 20);
+        final LocalDate billingMigrationDateBundle1 = new LocalDate(2016, 2, 1);
+
+        // We set both entitlement and billing date with desired value
+        final LocalDate entitlementMigrationDateBundle2 = new LocalDate(2015, 12, 20);
+        final LocalDate billingMigrationDateBundle2 = new LocalDate(2016, 3, 1);
+
+        final PlanPhaseSpecifier baseSpec = new PlanPhaseSpecifier("Shotgun", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, PhaseType.EVERGREEN);
+        final PlanPhaseSpecifier addOnSpec1 = new PlanPhaseSpecifier("Telescopic-Scope", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, PhaseType.EVERGREEN);
+
+        final String externalKey = "baseExternalKey";
+        EntitlementSpecifier baseEntitlementSpecifier = new DefaultEntitlementSpecifier(baseSpec, null);
+        EntitlementSpecifier addOnEntitlementSpecifier1 = new DefaultEntitlementSpecifier(addOnSpec1, null);
+
+        final List<EntitlementSpecifier> specifierList = new ArrayList<EntitlementSpecifier>();
+        specifierList.add(baseEntitlementSpecifier);
+        specifierList.add(addOnEntitlementSpecifier1);
+
+        busHandler.pushExpectedEvents(NextEvent.BLOCK, NextEvent.BLOCK, NextEvent.BLOCK, NextEvent.BLOCK);
+        BaseEntitlementWithAddOnsSpecifier baseEntitlementWithAddOnsSpecifierBundle1 =
+                buildBaseEntitlementWithAddOnsSpecifier(entitlementMigrationDateBundle1, billingMigrationDateBundle1, externalKey, specifierList);
+        List<BaseEntitlementWithAddOnsSpecifier> baseEntitlementWithAddOnsSpecifierList = new ArrayList<BaseEntitlementWithAddOnsSpecifier>();
+        BaseEntitlementWithAddOnsSpecifier baseEntitlementWithAddOnsSpecifierBundle2 =
+                buildBaseEntitlementWithAddOnsSpecifier(entitlementMigrationDateBundle2, billingMigrationDateBundle2, externalKey, specifierList);
+        baseEntitlementWithAddOnsSpecifierList.add(baseEntitlementWithAddOnsSpecifierBundle1);
+        baseEntitlementWithAddOnsSpecifierList.add(baseEntitlementWithAddOnsSpecifierBundle2);
+
+        final List<Entitlement> baseEntitlements = entitlementApi.createBaseEntitlementsWithAddOns(
+                account.getId(),
+                baseEntitlementWithAddOnsSpecifierList,
+                ImmutableList.<PluginProperty>of(),
+                callContext);
+        assertListenerStatus();
+        Assert.assertEquals(baseEntitlements.get(0).getState(), EntitlementState.ACTIVE);
+        Assert.assertEquals(baseEntitlements.get(1).getState(), EntitlementState.ACTIVE);
+
+        // Billing starts straight on EVERGREEN for Bundle 1 after 1 month
+        clock.addMonths(1);
+        busHandler.pushExpectedEvents(NextEvent.CREATE, NextEvent.CREATE, NextEvent.INVOICE, NextEvent.NULL_INVOICE,
+                                      NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
+        assertListenerStatus();
+
+        // Billing starts straight on EVERGREEN for Bundle 2 after 2 months
+        clock.addMonths(1);
+        busHandler.pushExpectedEvents(NextEvent.CREATE, NextEvent.CREATE, NextEvent.INVOICE,
+                                      NextEvent.NULL_INVOICE, NextEvent.NULL_INVOICE,
+                                      NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
+        assertListenerStatus();
+
+        // Next month we should still get one single invoice and payment / invoice payment
+        clock.addMonths(1);
+        busHandler.pushExpectedEvents(NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
+        assertListenerStatus();
+    }
+
+    private BaseEntitlementWithAddOnsSpecifier buildBaseEntitlementWithAddOnsSpecifier(final LocalDate entitlementMigrationDate, final LocalDate billingMigrationDate, final String externalKey, final List<EntitlementSpecifier> specifierList) {
+        return new BaseEntitlementWithAddOnsSpecifier() {
+                @Override
+                public UUID getBundleId() {
+                    return null;
+                }
+                @Override
+                public String getExternalKey() {
+                    return externalKey;
+                }
+                @Override
+                public Iterable<EntitlementSpecifier> getEntitlementSpecifier() {
+                    return specifierList;
+                }
+                @Override
+                public LocalDate getEntitlementEffectiveDate() {
+                    return entitlementMigrationDate;
+                }
+                @Override
+                public LocalDate getBillingEffectiveDate() {
+                    return billingMigrationDate;
+                }
+                @Override
+                public boolean isMigrated() {
+                    return false;
+                }
+            };
+    }
+
 }