Details
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java
index 211ba43..abb5214 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/migration/DefaultEntitlementMigrationApi.java
@@ -82,7 +82,8 @@ public class DefaultEntitlementMigrationApi implements EntitlementMigrationApi {
}
@Override
- public void undoMigration(UUID accountKey) {
+ public void undoMigration(UUID accountId) {
+ dao.undoMigration(accountId);
}
private AccountMigrationData createAccountMigrationData(EntitlementAccountMigration toBeMigrated)
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java
index 915138c..dbcc46d 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/engine/dao/EntitlementDao.java
@@ -72,5 +72,5 @@ public interface EntitlementDao {
public void migrate(AccountMigrationData data);
- public void undoMigration(List<UUID> bundleIds, List<UUID> subscriptionIds);
+ public void undoMigration(UUID accountId);
}
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 791ab23..f16eb61 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
@@ -372,7 +372,8 @@ public class EntitlementSqlDao implements EntitlementDao {
}
@Override
- public void undoMigration(final List<UUID> bundleIds, final List<UUID> subscriptionIds) {
+ public void undoMigration(final UUID accountId) {
+
eventsDao.inTransaction(new Transaction<Void, EventSqlDao>() {
@Override
@@ -382,13 +383,14 @@ public class EntitlementSqlDao implements EntitlementDao {
SubscriptionSqlDao transSubDao = transEventDao.become(SubscriptionSqlDao.class);
BundleSqlDao transBundleDao = transEventDao.become(BundleSqlDao.class);
- for (UUID curBundle : bundleIds) {
- transBundleDao.removeBundle(curBundle.toString());
- }
-
- for (UUID curSubscription : subscriptionIds) {
- transSubDao.removeSubscription(curSubscription.toString());
- eventsDao.removeEvents(curSubscription.toString());
+ final List<SubscriptionBundle> bundles = transBundleDao.getBundleFromAccount(accountId.toString());
+ for (SubscriptionBundle curBundle : bundles) {
+ List<Subscription> subscriptions = transSubDao.getSubscriptionsFromBundleId(curBundle.getId().toString());
+ for (Subscription cur : subscriptions) {
+ eventsDao.removeEvents(cur.getId().toString());
+ transSubDao.removeSubscription(cur.getId().toString());
+ }
+ transBundleDao.removeBundle(curBundle.getId().toString());
}
return null;
}
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestMigration.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestMigration.java
new file mode 100644
index 0000000..f07adab
--- /dev/null
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestMigration.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2010-2011 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.entitlement.api.user;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Stage;
+import com.ning.billing.catalog.PriceListDefault;
+import com.ning.billing.catalog.api.BillingPeriod;
+import com.ning.billing.catalog.api.PhaseType;
+import com.ning.billing.catalog.api.PlanPhaseSpecifier;
+import com.ning.billing.catalog.api.PriceListSet;
+import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.entitlement.alignment.MigrationPlanAligner;
+import com.ning.billing.entitlement.api.migration.EntitlementMigrationApiException;
+import com.ning.billing.entitlement.api.migration.EntitlementMigrationApi.EntitlementAccountMigration;
+import com.ning.billing.entitlement.api.migration.EntitlementMigrationApi.EntitlementBundleMigration;
+import com.ning.billing.entitlement.api.migration.EntitlementMigrationApi.EntitlementSubscriptionMigration;
+import com.ning.billing.entitlement.api.migration.EntitlementMigrationApi.EntitlementSubscriptionMigrationCase;
+import com.ning.billing.entitlement.glue.MockEngineModuleSql;
+
+public class TestMigration extends TestUserApiBase {
+
+ @Override
+ protected Injector getInjector() {
+ return Guice.createInjector(Stage.DEVELOPMENT, new MockEngineModuleSql());
+ }
+
+
+
+ @Test(enabled=true, groups="sql")
+ public void testSimple() {
+
+ try {
+ migrationApi.migrate(null);
+ } catch (EntitlementMigrationApiException e) {
+ Assert.fail("", e);
+ }
+ }
+
+
+ private EntitlementAccountMigration createAccountWithSingleBasePlan(final List<EntitlementSubscriptionMigrationCase> cases) {
+
+ return new EntitlementAccountMigration() {
+
+ @Override
+ public EntitlementBundleMigration[] getBundles() {
+ List<EntitlementBundleMigration> bundles = new ArrayList<EntitlementBundleMigration>();
+ EntitlementBundleMigration bundle0 = new EntitlementBundleMigration() {
+
+ @Override
+ public EntitlementSubscriptionMigration[] getSubscriptions() {
+ EntitlementSubscriptionMigration subscription = new EntitlementSubscriptionMigration() {
+ @Override
+ public EntitlementSubscriptionMigrationCase[] getSubscriptionCases() {
+ return cases.toArray(new EntitlementSubscriptionMigrationCase[cases.size()]);
+ }
+ @Override
+ public ProductCategory getCategory() {
+ return ProductCategory.BASE;
+ }
+ };
+ EntitlementSubscriptionMigration[] result = new EntitlementSubscriptionMigration[1];
+ result[0] = subscription;
+ return result;
+ }
+ @Override
+ public String getBundleKey() {
+ return "12345";
+ }
+ };
+ bundles.add(bundle0);
+ return bundles.toArray(new EntitlementBundleMigration[bundles.size()]);
+ }
+
+ @Override
+ public UUID getAccountKey() {
+ return UUID.randomUUID();
+ }
+ };
+ }
+
+ private EntitlementAccountMigration createAccountWithRegularBasePlan() {
+ List<EntitlementSubscriptionMigrationCase> cases = new LinkedList<EntitlementSubscriptionMigrationCase>();
+ cases.add(new EntitlementSubscriptionMigrationCase() {
+ @Override
+ public PlanPhaseSpecifier getPlanPhaseSpecifer() {
+ return new PlanPhaseSpecifier("Assault-Rifle", ProductCategory.BASE, BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME, PhaseType.EVERGREEN);
+ }
+ @Override
+ public DateTime getEffectiveDate() {
+ return new DateTime().minusMonths(3);
+ }
+ @Override
+ public DateTime getCancelledDate() {
+ return null;
+ }
+ });
+ return createAccountWithSingleBasePlan(cases);
+ }
+
+ private EntitlementAccountMigration createAccountWithRegularBasePlanFutreCancelled() {
+ List<EntitlementSubscriptionMigrationCase> cases = new LinkedList<EntitlementSubscriptionMigrationCase>();
+ final DateTime effectiveDate = new DateTime().minusMonths(3);
+ cases.add(new EntitlementSubscriptionMigrationCase() {
+ @Override
+ public PlanPhaseSpecifier getPlanPhaseSpecifer() {
+ return new PlanPhaseSpecifier("Assault-Rifle", ProductCategory.BASE, BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME, PhaseType.EVERGREEN);
+ }
+ @Override
+ public DateTime getEffectiveDate() {
+ return effectiveDate;
+ }
+ @Override
+ public DateTime getCancelledDate() {
+ return effectiveDate.plusYears(1);
+ }
+ });
+ return createAccountWithSingleBasePlan(cases);
+ }
+
+
+ private EntitlementAccountMigration createAccountFuturePendingPhase() {
+ List<EntitlementSubscriptionMigrationCase> cases = new LinkedList<EntitlementSubscriptionMigrationCase>();
+ final DateTime trialDate = new DateTime().minusDays(10);
+ cases.add(new EntitlementSubscriptionMigrationCase() {
+ @Override
+ public PlanPhaseSpecifier getPlanPhaseSpecifer() {
+ return new PlanPhaseSpecifier("Assault-Rifle", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, PhaseType.TRIAL);
+ }
+ @Override
+ public DateTime getEffectiveDate() {
+ return trialDate;
+ }
+ @Override
+ public DateTime getCancelledDate() {
+ return trialDate.plusDays(30);
+ }
+ });
+ cases.add(new EntitlementSubscriptionMigrationCase() {
+ @Override
+ public PlanPhaseSpecifier getPlanPhaseSpecifer() {
+ return new PlanPhaseSpecifier("Assault-Rifle", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, PhaseType.EVERGREEN);
+ }
+ @Override
+ public DateTime getEffectiveDate() {
+ return trialDate.plusDays(31);
+ }
+ @Override
+ public DateTime getCancelledDate() {
+ return null;
+ }
+ });
+ return createAccountWithSingleBasePlan(cases);
+ }
+
+ private EntitlementAccountMigration createAccountFuturePendingChange() {
+ List<EntitlementSubscriptionMigrationCase> cases = new LinkedList<EntitlementSubscriptionMigrationCase>();
+ final DateTime effectiveDate = new DateTime().minusDays(10);
+ cases.add(new EntitlementSubscriptionMigrationCase() {
+ @Override
+ public PlanPhaseSpecifier getPlanPhaseSpecifer() {
+ return new PlanPhaseSpecifier("Assault-Rifle", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, PhaseType.EVERGREEN);
+ }
+ @Override
+ public DateTime getEffectiveDate() {
+ return effectiveDate;
+ }
+ @Override
+ public DateTime getCancelledDate() {
+ return effectiveDate.plusMonths(1);
+ }
+ });
+ cases.add(new EntitlementSubscriptionMigrationCase() {
+ @Override
+ public PlanPhaseSpecifier getPlanPhaseSpecifer() {
+ return new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME, PhaseType.EVERGREEN);
+ }
+ @Override
+ public DateTime getEffectiveDate() {
+ return effectiveDate.plusMonths(1).plusDays(1);
+ }
+ @Override
+ public DateTime getCancelledDate() {
+ return null;
+ }
+ });
+ return createAccountWithSingleBasePlan(cases);
+ }
+
+}
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
index 8bb1659..34164e0 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
@@ -25,6 +25,7 @@ import com.ning.billing.entitlement.api.ApiTestListener;
import com.ning.billing.entitlement.api.ApiTestListener.NextEvent;
import com.ning.billing.entitlement.api.EntitlementService;
import com.ning.billing.entitlement.api.billing.EntitlementBillingApi;
+import com.ning.billing.entitlement.api.migration.EntitlementMigrationApi;
import com.ning.billing.entitlement.engine.core.Engine;
import com.ning.billing.entitlement.engine.dao.EntitlementDao;
import com.ning.billing.entitlement.engine.dao.MockEntitlementDao;
@@ -64,6 +65,9 @@ public abstract class TestUserApiBase {
protected EntitlementService entitlementService;
protected EntitlementUserApi entitlementApi;
protected EntitlementBillingApi billingApi;
+
+ protected EntitlementMigrationApi migrationApi;
+
protected CatalogService catalogService;
protected EntitlementConfig config;
protected EntitlementDao dao;
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
index d36b443..c821edb 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/engine/dao/MockEntitlementDaoMemory.java
@@ -355,7 +355,7 @@ public class MockEntitlementDaoMemory implements EntitlementDao, MockEntitlement
}
@Override
- public void undoMigration(List<UUID> bundleIds, List<UUID> subscriptionIds) {
+ public void undoMigration(UUID accountId) {
}
}