killbill-aplcache

Details

diff --git a/entitlement/killbill-entitlement.iml b/entitlement/killbill-entitlement.iml
index 5aac51c..b72ca26 100644
--- a/entitlement/killbill-entitlement.iml
+++ b/entitlement/killbill-entitlement.iml
@@ -51,9 +51,9 @@
     <orderEntry type="module" module-name="killbill-catalog" scope="TEST" production-on-test="" />
     <orderEntry type="library" scope="TEST" name="Maven: com.ning.billing:killbill-catalog:test-jar:tests:0.3.6-SNAPSHOT" level="project" />
     <orderEntry type="module" module-name="killbill-catalog" scope="TEST" />
+    <orderEntry type="module" module-name="killbill-subscription" scope="TEST" />
     <orderEntry type="module" module-name="killbill-util" scope="TEST" production-on-test="" />
     <orderEntry type="library" scope="TEST" name="Maven: com.ning.billing:killbill-util:test-jar:tests:0.3.6-SNAPSHOT" level="project" />
-    <orderEntry type="module" module-name="killbill-subscription" scope="TEST" />
     <orderEntry type="library" scope="TEST" name="Maven: com.ning.billing.commons:killbill-clock:test-jar:tests:0.1.7" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: com.ning.billing.commons:killbill-queue:test-jar:tests:0.1.7" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: mysql:mysql-connector-mxj:5.0.12" level="project" />
diff --git a/entitlement/pom.xml b/entitlement/pom.xml
index 2d62a73..fd23f09 100644
--- a/entitlement/pom.xml
+++ b/entitlement/pom.xml
@@ -74,13 +74,12 @@
         </dependency>
         <dependency>
             <groupId>com.ning.billing</groupId>
-            <artifactId>killbill-util</artifactId>
+            <artifactId>killbill-subscription</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>com.ning.billing</groupId>
             <artifactId>killbill-util</artifactId>
-            <type>test-jar</type>
-            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>com.ning.billing</groupId>
@@ -90,7 +89,8 @@
         </dependency>
         <dependency>
             <groupId>com.ning.billing</groupId>
-            <artifactId>killbill-subscription</artifactId>
+            <artifactId>killbill-util</artifactId>
+            <type>test-jar</type>
             <scope>test</scope>
         </dependency>
         <dependency>
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlementApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlementApi.java
index 94cb080..df1ce61 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlementApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlementApi.java
@@ -223,7 +223,7 @@ public class DefaultEntitlementApi implements EntitlementApi {
     }
 
     @Override
-    public void block(final UUID bundleId, final String serviceName, final LocalDate effectiveDate, final CallContext context) throws EntitlementApiException {
+    public void block(final UUID bundleId, final LocalDate effectiveDate, final CallContext context) throws EntitlementApiException {
         final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(context);
         final BlockingState currentState =  blockingStateDao.getBlockingStateForService(bundleId, EntitlementService.ENTITLEMENT_SERVICE_NAME, internalContext);
         if (currentState != null && currentState.getStateName().equals(ENT_STATE_BLOCKED)) {
@@ -233,7 +233,7 @@ public class DefaultEntitlementApi implements EntitlementApi {
     }
 
     @Override
-    public void unblock(final UUID bundleId, final String serviceName, final LocalDate effectiveDate, final CallContext context) throws EntitlementApiException {
+    public void unblock(final UUID bundleId, final LocalDate effectiveDate, final CallContext context) throws EntitlementApiException {
         final InternalCallContext internalContext = internalCallContextFactory.createInternalCallContext(context);
         final BlockingState currentState =  blockingStateDao.getBlockingStateForService(bundleId, EntitlementService.ENTITLEMENT_SERVICE_NAME, internalContext);
         if (currentState == null || currentState.getStateName().equals(ENT_STATE_CLEAR)) {
diff --git a/entitlement/src/main/resources/com/ning/billing/entitlement/dao/BlockingStateSqlDao.sql.stg b/entitlement/src/main/resources/com/ning/billing/entitlement/dao/BlockingStateSqlDao.sql.stg
index 79b5491..0a12fb5 100644
--- a/entitlement/src/main/resources/com/ning/billing/entitlement/dao/BlockingStateSqlDao.sql.stg
+++ b/entitlement/src/main/resources/com/ning/billing/entitlement/dao/BlockingStateSqlDao.sql.stg
@@ -43,12 +43,19 @@ limit 1
 
 getBlockingState() ::= <<
  select
- <allTableFields()>
+ <allTableFields("t.")>
  from
- <tableName()>
- where blockable_id = :blockableId
- <AND_CHECK_TENANT()>
- order by record_id asc
+ <tableName()> t
+ join (
+   select max(record_id) record_id
+         , service
+         from blocking_states
+         where blockable_id = :blockableId
+         <AND_CHECK_TENANT()>
+         group by service
+ ) tmp
+ on t.record_id = tmp.record_id
+ order by t.record_id asc
  ;
  >>
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultEntitlementApi.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultEntitlementApi.java
index 9711717..9c06450 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultEntitlementApi.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultEntitlementApi.java
@@ -6,6 +6,7 @@ import org.joda.time.LocalDate;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.catalog.api.BillingPeriod;
@@ -165,4 +166,71 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
         }
     }
 
+
+    @Test(groups = "slow")
+    public void testBlockUnblock() {
+
+        try {
+
+            final LocalDate initialDate = new LocalDate(2013, 8, 7);
+            clock.setDay(initialDate);
+
+            final Account account = accountApi.createAccount(getAccountData(7), callContext);
+
+            final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME, null);
+
+            // Create entitlement and check each field
+            final Entitlement baseEntitlement = entitlementApi.createBaseEntitlement(account.getId(), spec, account.getExternalKey(), callContext);
+
+            clock.addDays(1);
+
+            final PlanPhaseSpecifier spec1 = new PlanPhaseSpecifier("Telescopic-Scope", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
+            final Entitlement telescopicEntitlement = entitlementApi.addEntitlement(baseEntitlement.getBundleId(), spec1, callContext);
+
+            // Block all entitlement in the bundle
+            clock.addDays(5);
+            entitlementApi.block(baseEntitlement.getBundleId(), new LocalDate(clock.getUTCNow()), callContext);
+
+            // Verify blocking state
+            final Entitlement baseEntitlement2 = entitlementApi.getEntitlementForId(baseEntitlement.getId(), callContext);
+            assertEquals(baseEntitlement2.getState(), EntitlementState.BLOCKED);
+
+            final Entitlement telescopicEntitlement2 = entitlementApi.getEntitlementForId(telescopicEntitlement.getId(), callContext);
+            assertEquals(telescopicEntitlement2.getState(), EntitlementState.BLOCKED);
+
+            final List<Entitlement> bundleEntitlements2 = entitlementApi.getAllEntitlementsForBundle(telescopicEntitlement2.getBundleId(), callContext);
+            assertEquals(bundleEntitlements2.size(), 2);
+            for (Entitlement cur : bundleEntitlements2) {
+                assertEquals(cur.getState(), EntitlementState.BLOCKED);
+            }
+
+            // Try to add an ADD_ON, it should fail
+            try {
+                final PlanPhaseSpecifier spec3 = new PlanPhaseSpecifier("Telescopic-Scope", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
+                final Entitlement telescopicEntitlement3 = entitlementApi.addEntitlement(baseEntitlement.getBundleId(), spec1, callContext);
+            } catch (EntitlementApiException e) {
+                assertEquals(e.getCode(), ErrorCode.BLOCK_BLOCKED_ACTION.getCode());
+            }
+
+            clock.addDays(3);
+            entitlementApi.unblock(baseEntitlement.getBundleId(), new LocalDate(), callContext);
+
+            // Verify blocking state
+            final Entitlement baseEntitlement3 = entitlementApi.getEntitlementForId(baseEntitlement.getId(), callContext);
+            assertEquals(baseEntitlement3.getState(), EntitlementState.ACTIVE);
+
+            final Entitlement telescopicEntitlement3 = entitlementApi.getEntitlementForId(telescopicEntitlement.getId(), callContext);
+            assertEquals(telescopicEntitlement3.getState(), EntitlementState.ACTIVE);
+
+            final List<Entitlement> bundleEntitlements3 = entitlementApi.getAllEntitlementsForBundle(telescopicEntitlement2.getBundleId(), callContext);
+            assertEquals(bundleEntitlements3.size(), 2);
+            for (Entitlement cur : bundleEntitlements3) {
+                assertEquals(cur.getState(), EntitlementState.ACTIVE);
+            }
+        } catch (AccountApiException e) {
+            Assert.fail("Test failed " + e.getMessage());
+        } catch (EntitlementApiException e) {
+            Assert.fail("Test failed " + e.getMessage());
+        }
+    }
 }