killbill-uncached
Changes
account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApi.java 14(+14 -0)
entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java 21(+20 -1)
Details
diff --git a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
index 0a64a07..8c75df8 100644
--- a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
+++ b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
@@ -18,7 +18,6 @@
package org.killbill.billing.account.api.user;
-import java.sql.SQLDataException;
import java.util.List;
import java.util.UUID;
@@ -35,7 +34,6 @@ import org.killbill.billing.account.dao.AccountEmailModelDao;
import org.killbill.billing.account.dao.AccountModelDao;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
-import org.killbill.billing.tenant.api.TenantApiException;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
@@ -96,14 +94,12 @@ public class DefaultAccountUserApi extends DefaultAccountApiBase implements Acco
final AccountModelDao account = new AccountModelDao(data);
- try {
- accountDao.create(account, internalCallContextFactory.createInternalCallContextWithoutAccountRecordId(context));
- } catch (final Exception e) {
- if (e.getCause() instanceof SQLDataException) {
- throw new AccountApiException(e, ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED);
- }
+ if (null != account.getExternalKey() && account.getExternalKey().length() > 255) {
+ throw new AccountApiException(ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED);
}
+ accountDao.create(account, internalCallContextFactory.createInternalCallContextWithoutAccountRecordId(context));
+
return new DefaultAccount(account);
}
diff --git a/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApi.java b/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApi.java
index 78df7a1..486f6b3 100644
--- a/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApi.java
+++ b/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApi.java
@@ -23,6 +23,7 @@ import java.util.List;
import java.util.UUID;
import java.util.concurrent.Callable;
+import org.killbill.billing.ErrorCode;
import org.killbill.billing.account.AccountTestSuiteWithEmbeddedDB;
import org.killbill.billing.account.api.Account;
import org.killbill.billing.account.api.AccountApiException;
@@ -41,6 +42,7 @@ import com.google.common.eventbus.Subscribe;
import static com.jayway.awaitility.Awaitility.await;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.killbill.billing.account.AccountTestUtils.createTestAccount;
+import static org.testng.Assert.assertEquals;
public class TestDefaultAccountUserApi extends AccountTestSuiteWithEmbeddedDB {
@@ -162,4 +164,16 @@ public class TestDefaultAccountUserApi extends AccountTestSuiteWithEmbeddedDB {
}
+ @Test(groups = "slow", description = "Test Account creation with External Key over limit")
+ public void testCreateAccountWithExternalKeyOverLimit() throws Exception {
+ AccountModelDao accountModelDao = createTestAccount();
+ // Set an externalKey of 256 characters (over limit)
+ accountModelDao.setExternalKey("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis,.");
+ final AccountData accountData = new DefaultAccount(accountModelDao);
+ try {
+ accountUserApi.createAccount(accountData, callContext);
+ } catch (final AccountApiException e) {
+ assertEquals(e.getCode(), ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED.getCode());
+ }
+ }
}
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java
index 18a4beb..a1ff7a0 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java
@@ -32,7 +32,6 @@ import org.killbill.billing.catalog.api.BillingPeriod;
import org.killbill.billing.catalog.api.PlanPhaseSpecifier;
import org.killbill.billing.catalog.api.PlanSpecifier;
import org.killbill.billing.catalog.api.PriceListSet;
-import org.killbill.billing.catalog.api.ProductCategory;
import org.killbill.billing.entitlement.EntitlementService;
import org.killbill.billing.entitlement.EntitlementTestSuiteWithEmbeddedDB;
import org.killbill.billing.entitlement.api.Entitlement.EntitlementActionPolicy;
@@ -526,6 +525,26 @@ public class TestDefaultSubscriptionApi extends EntitlementTestSuiteWithEmbedded
}
}
+ @Test(groups = "slow")
+ public void testSubscriptionCreationWithExternalKeyOverLimit() throws AccountApiException, SubscriptionApiException, EntitlementApiException {
+ final String externalKey = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis,.";
+
+ final LocalDate initialDate = new LocalDate(2013, 8, 7);
+ clock.setDay(initialDate);
+
+ final Account account = createAccount(getAccountData(7));
+
+ final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
+
+ //2013-08-07
+ final LocalDate effectiveDate = initialDate.plusMonths(1);
+
+ try {
+ entitlementApi.createBaseEntitlement(account.getId(), spec, externalKey, null, effectiveDate, effectiveDate, false, ImmutableList.<PluginProperty>of(), callContext);
+ } catch (final EntitlementApiException e) {
+ assertEquals(e.getCode(), ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED.getCode());
+ }
+ }
private void verifyBlockingStates(final Iterable<BlockingState> result, final List<BlockingState> expected) {
int i = 0;
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java
index 54bfd9d..e2bcac5 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultApiBase.java
@@ -65,4 +65,10 @@ public class DefaultApiBase {
throw new PaymentApiException(ErrorCode.PAYMENT_INVALID_PARAMETER, parameterName, "should not be null");
}
}
+
+ protected void checkExternalKeyLength(final String externalKey) throws PaymentApiException {
+ if (null != externalKey && externalKey.length() > 255) {
+ throw new PaymentApiException(ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED);
+ }
+ }
}
diff --git a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
index e24e4fa..96ad05e 100644
--- a/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
+++ b/payment/src/main/java/org/killbill/billing/payment/api/DefaultPaymentApi.java
@@ -79,6 +79,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
checkNotNullParameter(currency, "currency");
}
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentExternalKey);
final String transactionType = TransactionType.AUTHORIZE.name();
Payment payment = null;
@@ -125,6 +126,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
checkNotNullParameter(currency, "currency");
}
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentExternalKey);
final String transactionType = TransactionType.AUTHORIZE.name();
@@ -165,6 +167,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
checkNotNullParameter(amount, "amount");
checkNotNullParameter(currency, "currency");
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.CAPTURE.name();
Payment payment = null;
@@ -208,6 +211,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
checkNotNullParameter(amount, "amount");
checkNotNullParameter(currency, "currency");
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.CAPTURE.name();
Payment payment = null;
@@ -249,6 +253,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
checkNotNullParameter(currency, "currency");
}
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.PURCHASE.name();
Payment payment = null;
@@ -294,6 +299,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
}
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentTransactionExternalKey);
if (paymentMethodId == null && !paymentOptions.isExternalPayment()) {
throw new PaymentApiException(ErrorCode.PAYMENT_NO_DEFAULT_PAYMENT_METHOD, "paymentMethodId", "should not be null");
@@ -343,6 +349,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
checkNotNullParameter(account, "account");
checkNotNullParameter(paymentId, "paymentId");
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.VOID.name();
Payment payment = null;
@@ -384,6 +391,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
checkNotNullParameter(account, "account");
checkNotNullParameter(paymentId, "paymentId");
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.VOID.name();
Payment payment = null;
@@ -423,6 +431,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
}
checkNotNullParameter(paymentId, "paymentId");
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.REFUND.name();
Payment payment = null;
@@ -467,6 +476,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
}
checkNotNullParameter(paymentId, "paymentId");
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.REFUND.name();
Payment payment = null;
@@ -507,6 +517,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
checkNotNullParameter(currency, "currency");
}
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.CREDIT.name();
Payment payment = null;
@@ -556,6 +567,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
checkNotNullParameter(currency, "currency");
}
checkNotNullParameter(properties, "plugin properties");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.CREDIT.name();
Payment payment = null;
@@ -655,6 +667,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
checkNotNullParameter(amount, "amount");
checkNotNullParameter(currency, "currency");
checkNotNullParameter(paymentId, "paymentId");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.CHARGEBACK.name();
Payment payment = null;
@@ -730,6 +743,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
public Payment createChargebackReversal(final Account account, final UUID paymentId, final String paymentTransactionExternalKey, final CallContext callContext) throws PaymentApiException {
checkNotNullParameter(account, "account");
checkNotNullParameter(paymentId, "paymentId");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.CHARGEBACK.name();
Payment payment = null;
@@ -768,6 +782,7 @@ public class DefaultPaymentApi extends DefaultApiBase implements PaymentApi {
checkNotNullParameter(account, "account");
checkNotNullParameter(paymentId, "paymentId");
+ checkExternalKeyLength(paymentTransactionExternalKey);
final String transactionType = TransactionType.CHARGEBACK.name();
Payment payment = null;
diff --git a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
index e141506..7e626ef 100644
--- a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
+++ b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
@@ -868,7 +868,36 @@ public class TestPaymentApi extends PaymentTestSuiteWithEmbeddedDB {
assertEquals(attempts.size(), 1);
}
+ @Test(groups = "slow")
+ public void testCreatePurchaseWithExternalKeyOverLimit() throws PaymentApiException, InvoiceApiException, EventBusException {
+ final BigDecimal requestedAmount = BigDecimal.TEN;
+ final UUID subscriptionId = UUID.randomUUID();
+ final UUID bundleId = UUID.randomUUID();
+ final LocalDate now = clock.getUTCToday();
+
+ final Invoice invoice = testHelper.createTestInvoice(account, now, Currency.USD);
+ final String paymentExternalKey = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis,.";
+ final String transactionExternalKey = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis,.";
+
+ invoice.addInvoiceItem(new MockRecurringInvoiceItem(invoice.getId(), account.getId(),
+ subscriptionId,
+ bundleId,
+ "test plan", "test phase", null,
+ now,
+ now.plusMonths(1),
+ requestedAmount,
+ new BigDecimal("1.0"),
+ Currency.USD));
+
+ try {
+ paymentApi.createPurchaseWithPaymentControl(account, account.getPaymentMethodId(), null, requestedAmount, Currency.USD, paymentExternalKey, transactionExternalKey,
+ createPropertiesForInvoice(invoice), INVOICE_PAYMENT, callContext);
+ } catch (final PaymentApiException e) {
+ assertEquals(e.getCode(), ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED.getCode());
+ }
+
+ }
@Test(groups = "slow")
public void testCreateFailedPurchaseWithPaymentControl() throws PaymentApiException, InvoiceApiException, EventBusException {
diff --git a/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java b/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
index 016211d..4b18a23 100644
--- a/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
+++ b/subscription/src/main/java/org/killbill/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
@@ -18,7 +18,6 @@
package org.killbill.billing.subscription.api.svcs;
-import java.sql.SQLDataException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -319,15 +318,11 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
final DateTime now = clock.getUTCNow();
final DateTime originalCreatedDate = existingBundles.size() > 0 ? existingBundles.get(0).getCreatedDate() : now;
final DefaultSubscriptionBaseBundle bundle = new DefaultSubscriptionBaseBundle(bundleKey, accountId, now, originalCreatedDate, now, now);
- SubscriptionBaseBundle subscriptionBundle = null;
- try {
- subscriptionBundle = dao.createSubscriptionBundle(bundle, context);
- } catch (final Exception e) {
- if (e.getCause() instanceof SQLDataException) {
- throw new SubscriptionBaseApiException(e, ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED);
- }
+
+ if (null != bundleKey && bundleKey.length() > 255) {
+ throw new SubscriptionBaseApiException(ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED);
}
- return subscriptionBundle;
+ return dao.createSubscriptionBundle(bundle, context);
}
@Override
diff --git a/tenant/src/main/java/org/killbill/billing/tenant/api/user/DefaultTenantUserApi.java b/tenant/src/main/java/org/killbill/billing/tenant/api/user/DefaultTenantUserApi.java
index 5a79da9..b9a22bc 100644
--- a/tenant/src/main/java/org/killbill/billing/tenant/api/user/DefaultTenantUserApi.java
+++ b/tenant/src/main/java/org/killbill/billing/tenant/api/user/DefaultTenantUserApi.java
@@ -18,7 +18,6 @@
package org.killbill.billing.tenant.api.user;
-import java.sql.SQLDataException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -88,13 +87,14 @@ public class DefaultTenantUserApi implements TenantUserApi {
public Tenant createTenant(final TenantData data, final CallContext context) throws TenantApiException {
final Tenant tenant = new DefaultTenant(data);
+ if (null != tenant.getExternalKey() && tenant.getExternalKey().length() > 255) {
+ throw new TenantApiException(ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED);
+ }
+
try {
tenantDao.create(new TenantModelDao(tenant), internalCallContextFactory.createInternalCallContextWithoutAccountRecordId(context));
- } catch (final Exception e) {
- if (e.getCause() instanceof SQLDataException) {
- throw new TenantApiException(e, ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED);
- }
- else throw new TenantApiException(e, ErrorCode.TENANT_CREATION_FAILED);
+ } catch (final TenantApiException e) {
+ throw new TenantApiException(e, ErrorCode.TENANT_CREATION_FAILED);
}
return tenant;
}
diff --git a/tenant/src/test/java/org/killbill/billing/tenant/api/user/TestDefaultTenantUserApi.java b/tenant/src/test/java/org/killbill/billing/tenant/api/user/TestDefaultTenantUserApi.java
index 2d4faa4..4f01f8a 100644
--- a/tenant/src/test/java/org/killbill/billing/tenant/api/user/TestDefaultTenantUserApi.java
+++ b/tenant/src/test/java/org/killbill/billing/tenant/api/user/TestDefaultTenantUserApi.java
@@ -20,9 +20,11 @@ package org.killbill.billing.tenant.api.user;
import java.util.List;
import java.util.UUID;
+import org.killbill.billing.ErrorCode;
import org.killbill.billing.tenant.TenantTestSuiteWithEmbeddedDb;
import org.killbill.billing.tenant.api.DefaultTenant;
import org.killbill.billing.tenant.api.Tenant;
+import org.killbill.billing.tenant.api.TenantApiException;
import org.killbill.billing.tenant.api.TenantData;
import org.killbill.billing.tenant.api.TenantKV.TenantKey;
import org.testng.Assert;
@@ -141,4 +143,18 @@ public class TestDefaultTenantUserApi extends TenantTestSuiteWithEmbeddedDb {
value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext);
Assert.assertEquals(value.size(), 0);
}
+
+ @Test(groups = "slow", description = "Test Tenant creation with External Key over limit")
+ public void testCreateTenantWithExternalKeyOverLimit() throws Exception {
+ final TenantData tenantdata = new DefaultTenant(UUID.randomUUID(),
+ clock.getUTCNow(),
+ clock.getUTCNow(),
+ "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis,.",
+ "TTR445ee2", "dskjhfs^^54R");
+ try {
+ tenantUserApi.createTenant(tenantdata, callContext);
+ } catch (final TenantApiException e) {
+ Assert.assertEquals(e.getCode(), ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED.getCode());
+ }
+ }
}