diff --git a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlement.java b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlement.java
index 97583ac..d3e9057 100644
--- a/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlement.java
+++ b/entitlement/src/main/java/org/killbill/billing/entitlement/api/DefaultEntitlement.java
@@ -306,7 +306,7 @@ public class DefaultEntitlement extends EntityBase implements Entitlement {
refresh(callContext);
if (eventsStream.isSubscriptionCancelled()) {
- throw new EntitlementApiException(ErrorCode.SUB_CANCEL_BAD_STATE, getId(), EntitlementState.CANCELLED);
+ throw new EntitlementApiException(ErrorCode.SUB_UNCANCEL_BAD_STATE, getId());
}
final InternalCallContext contextWithValidAccountRecordId = internalCallContextFactory.createInternalCallContext(getAccountId(), callContext);
@@ -326,7 +326,7 @@ public class DefaultEntitlement extends EntityBase implements Entitlement {
}
} else {
// Entitlement is NOT cancelled (or future cancelled), there is nothing to do
- throw new EntitlementApiException(ErrorCode.SUB_CANCEL_BAD_STATE, getId(), EntitlementState.CANCELLED);
+ throw new EntitlementApiException(ErrorCode.SUB_UNCANCEL_BAD_STATE, getId());
}
// If billing was previously cancelled, reactivate
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java
index 45851eb..a60129b 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java
@@ -70,7 +70,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
entitlement.uncancelEntitlement(ImmutableList.<PluginProperty>of(), callContext);
Assert.fail("Entitlement hasn't been cancelled yet");
} catch (final EntitlementApiException e) {
- Assert.assertEquals(e.getCode(), ErrorCode.SUB_CANCEL_BAD_STATE.getCode());
+ Assert.assertEquals(e.getCode(), ErrorCode.SUB_UNCANCEL_BAD_STATE.getCode());
}
clock.addDays(3);
@@ -98,18 +98,17 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
entitlement.uncancelEntitlement(ImmutableList.<PluginProperty>of(), callContext);
Assert.fail("Entitlement is already cancelled");
} catch (final EntitlementApiException e) {
- Assert.assertEquals(e.getCode(), ErrorCode.SUB_CANCEL_BAD_STATE.getCode());
+ Assert.assertEquals(e.getCode(), ErrorCode.SUB_UNCANCEL_BAD_STATE.getCode());
}
try {
addOnEntitlement.uncancelEntitlement(ImmutableList.<PluginProperty>of(), callContext);
Assert.fail("Add-On Entitlement is already cancelled");
} catch (final EntitlementApiException e) {
- Assert.assertEquals(e.getCode(), ErrorCode.SUB_CANCEL_BAD_STATE.getCode());
+ Assert.assertEquals(e.getCode(), ErrorCode.SUB_UNCANCEL_BAD_STATE.getCode());
}
}
-
@Test(groups = "slow")
public void testUncancelEffectiveCancelledEntitlement() throws AccountApiException, EntitlementApiException, SubscriptionBaseApiException {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
@@ -439,4 +438,51 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
assertEquals(newBaseEntitlement.getEffectiveStartDate(), effectiveDate);
assertEquals(newBaseEntitlement.getEffectiveEndDate(), null);
}
+
+ @Test(groups = "slow")
+ public void testCreateEntitlementInThePast() throws AccountApiException, EntitlementApiException, SubscriptionBaseApiException {
+ final LocalDate initialDate = new LocalDate(2013, 8, 7);
+ final LocalDate clockDate = new LocalDate(2013, 10, 7);
+ clock.setDay(clockDate);
+
+ final Account account = accountApi.createAccount(getAccountData(7), callContext);
+
+ final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
+
+ // Keep the same object for the whole test, to make sure we refresh its state before r/w calls
+ testListener.pushExpectedEvents(NextEvent.CREATE, NextEvent.PHASE);
+ final Entitlement entitlement = entitlementApi.createBaseEntitlement(account.getId(), spec, account.getExternalKey(), null, initialDate, ImmutableList.<PluginProperty>of(), callContext);
+ assertListenerStatus();
+
+ assertEquals(entitlement.getAccountId(), account.getId());
+ assertEquals(entitlement.getExternalKey(), account.getExternalKey());
+
+ assertEquals(entitlement.getEffectiveStartDate(), initialDate);
+ assertNull(entitlement.getEffectiveEndDate());
+
+ assertEquals(entitlement.getLastActivePriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
+ assertEquals(entitlement.getLastActiveProduct().getName(), "Shotgun");
+ assertEquals(entitlement.getLastActivePhase().getName(), "shotgun-monthly-evergreen");
+ assertEquals(entitlement.getLastActivePlan().getName(), "shotgun-monthly");
+ assertEquals(entitlement.getLastActiveProductCategory(), ProductCategory.BASE);
+
+ assertEquals(entitlement.getState(), EntitlementState.ACTIVE);
+ assertEquals(entitlement.getSourceType(), EntitlementSourceType.NATIVE);
+
+ assertEquals(entitlement.getLastActivePlan().getName(), "shotgun-monthly");
+ assertEquals(entitlement.getLastActivePriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
+ assertEquals(entitlement.getLastActiveProduct().getName(), "Shotgun");
+ assertEquals(entitlement.getLastActiveProductCategory(), ProductCategory.BASE);
+
+ assertEquals(entitlement.getState(), EntitlementState.ACTIVE);
+ assertEquals(entitlement.getSourceType(), EntitlementSourceType.NATIVE);
+
+ List<Entitlement> bundleEntitlements = entitlementApi.getAllEntitlementsForBundle(entitlement.getBundleId(), callContext);
+ assertEquals(bundleEntitlements.size(), 1);
+
+ bundleEntitlements = entitlementApi.getAllEntitlementsForAccountIdAndExternalKey(account.getId(), account.getExternalKey(), callContext);
+ assertEquals(bundleEntitlements.size(), 1);
+
+ }
+
}