killbill-memoizeit
Changes
account/src/main/java/org/killbill/billing/account/api/svcs/DefaultAccountInternalApi.java 38(+10 -28)
account/src/main/java/org/killbill/billing/account/api/svcs/DefaultImmutableAccountInternalApi.java 103(+103 -0)
account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApi.java 10(+5 -5)
beatrix/pom.xml 6(+6 -0)
beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModuleNoDB.java 38(+38 -0)
entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlement.java 16(+8 -8)
entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlementApi.java 35(+18 -17)
entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java 12(+6 -6)
entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEntitlementDateHelper.java 23(+10 -13)
entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestDefaultBlockingStateDao.java 5(+1 -4)
entitlement/src/test/java/org/killbill/billing/entitlement/engine/core/TestEntitlementUtils.java 28(+19 -9)
entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java 17(+17 -0)
invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java 34(+11 -23)
junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteWithEmbeddedDB.java 17(+17 -0)
junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultInternalBillingApi.java 6(+2 -4)
payment/src/test/java/org/killbill/billing/payment/core/sm/TestPaymentLeavingStateCallback.java 10(+5 -5)
subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java 8(+4 -4)
subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java 10(+6 -4)
subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleNoDB.java 4(+2 -2)
subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java 8(+6 -2)
subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java 19(+18 -1)
tenant/src/test/java/org/killbill/billing/tenant/dao/TestNoCachingTenantBroadcastDao.java 32(+11 -21)
util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java 63(+43 -20)
util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java 2(+1 -1)
Details
diff --git a/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultAccountInternalApi.java b/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultAccountInternalApi.java
index 0903c13..57203fc 100644
--- a/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultAccountInternalApi.java
+++ b/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultAccountInternalApi.java
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -28,9 +30,9 @@ import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountEmail;
import org.killbill.billing.account.api.AccountInternalApi;
import org.killbill.billing.account.api.DefaultAccountEmail;
-import org.killbill.billing.account.api.DefaultImmutableAccountData;
import org.killbill.billing.account.api.DefaultMutableAccountData;
import org.killbill.billing.account.api.ImmutableAccountData;
+import org.killbill.billing.account.api.ImmutableAccountInternalApi;
import org.killbill.billing.account.api.MutableAccountData;
import org.killbill.billing.account.api.user.DefaultAccountApiBase;
import org.killbill.billing.account.dao.AccountDao;
@@ -43,7 +45,6 @@ import org.killbill.billing.util.cache.Cachable.CacheType;
import org.killbill.billing.util.cache.CacheController;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.cache.CacheLoaderArgument;
-import org.killbill.billing.util.cache.ImmutableAccountCacheLoader.LoaderCallback;
import org.killbill.billing.util.dao.NonEntityDao;
import com.google.common.base.Function;
@@ -52,21 +53,18 @@ import com.google.common.collect.ImmutableList;
public class DefaultAccountInternalApi extends DefaultAccountApiBase implements AccountInternalApi {
+ private final ImmutableAccountInternalApi immutableAccountInternalApi;
private final AccountDao accountDao;
- private final CacheControllerDispatcher cacheControllerDispatcher;
- private final CacheController accountCacheController;
private final CacheController bcdCacheController;
- private final NonEntityDao nonEntityDao;
@Inject
- public DefaultAccountInternalApi(final AccountDao accountDao,
+ public DefaultAccountInternalApi(final ImmutableAccountInternalApi immutableAccountInternalApi,
+ final AccountDao accountDao,
final NonEntityDao nonEntityDao,
final CacheControllerDispatcher cacheControllerDispatcher) {
super(accountDao, nonEntityDao, cacheControllerDispatcher);
+ this.immutableAccountInternalApi = immutableAccountInternalApi;
this.accountDao = accountDao;
- this.nonEntityDao = nonEntityDao;
- this.cacheControllerDispatcher = cacheControllerDispatcher;
- this.accountCacheController = cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_IMMUTABLE);
this.bcdCacheController = cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_BCD);
}
@@ -142,14 +140,12 @@ public class DefaultAccountInternalApi extends DefaultAccountApiBase implements
@Override
public ImmutableAccountData getImmutableAccountDataById(final UUID accountId, final InternalTenantContext context) throws AccountApiException {
- final Long recordId = nonEntityDao.retrieveRecordIdFromObject(accountId, ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID));
- return getImmutableAccountDataByRecordId(recordId, context);
+ return immutableAccountInternalApi.getImmutableAccountDataById(accountId, context);
}
@Override
public ImmutableAccountData getImmutableAccountDataByRecordId(final Long recordId, final InternalTenantContext context) throws AccountApiException {
- final CacheLoaderArgument arg = createImmutableAccountCacheLoaderArgument(context);
- return (ImmutableAccountData) accountCacheController.get(recordId, arg);
+ return immutableAccountInternalApi.getImmutableAccountDataByRecordId(recordId, context);
}
private AccountModelDao getAccountModelDaoByRecordId(final Long recordId, final InternalTenantContext context) throws AccountApiException {
@@ -165,20 +161,6 @@ public class DefaultAccountInternalApi extends DefaultAccountApiBase implements
return bcd != null ? bcd : DefaultMutableAccountData.DEFAULT_BILLING_CYCLE_DAY_LOCAL;
}
- private CacheLoaderArgument createImmutableAccountCacheLoaderArgument(final InternalTenantContext context) {
- final LoaderCallback loaderCallback = new LoaderCallback() {
- @Override
- public Object loadAccount(final Long recordId, final InternalTenantContext context) {
- final Account account = getAccountByRecordIdInternal(recordId, context);
- return account != null ? new DefaultImmutableAccountData(account) : null;
- }
- };
- final Object[] args = new Object[1];
- args[0] = loaderCallback;
- final ObjectType irrelevant = null;
- return new CacheLoaderArgument(irrelevant, args, context);
- }
-
private CacheLoaderArgument createBCDCacheLoaderArgument(final InternalTenantContext context) {
final AccountBCDCacheLoader.LoaderCallback loaderCallback = new AccountBCDCacheLoader.LoaderCallback() {
@Override
diff --git a/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultImmutableAccountInternalApi.java b/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultImmutableAccountInternalApi.java
new file mode 100644
index 0000000..250d47a
--- /dev/null
+++ b/account/src/main/java/org/killbill/billing/account/api/svcs/DefaultImmutableAccountInternalApi.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2016 Groupon, Inc
+ * Copyright 2016 The Billing Project, LLC
+ *
+ * The Billing Project 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 org.killbill.billing.account.api.svcs;
+
+import java.util.UUID;
+
+import org.killbill.billing.ObjectType;
+import org.killbill.billing.account.api.Account;
+import org.killbill.billing.account.api.AccountApiException;
+import org.killbill.billing.account.api.DefaultAccount;
+import org.killbill.billing.account.api.DefaultImmutableAccountData;
+import org.killbill.billing.account.api.ImmutableAccountData;
+import org.killbill.billing.account.api.ImmutableAccountInternalApi;
+import org.killbill.billing.account.dao.AccountModelDao;
+import org.killbill.billing.account.dao.AccountSqlDao;
+import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.util.cache.Cachable.CacheType;
+import org.killbill.billing.util.cache.CacheController;
+import org.killbill.billing.util.cache.CacheControllerDispatcher;
+import org.killbill.billing.util.cache.CacheLoaderArgument;
+import org.killbill.billing.util.cache.ImmutableAccountCacheLoader.LoaderCallback;
+import org.killbill.billing.util.dao.NonEntityDao;
+import org.killbill.billing.util.entity.dao.EntitySqlDao;
+import org.killbill.billing.util.entity.dao.EntitySqlDaoTransactionWrapper;
+import org.killbill.billing.util.entity.dao.EntitySqlDaoTransactionalJdbiWrapper;
+import org.killbill.billing.util.entity.dao.EntitySqlDaoWrapperFactory;
+import org.killbill.clock.Clock;
+import org.skife.jdbi.v2.IDBI;
+
+import com.google.inject.Inject;
+
+public class DefaultImmutableAccountInternalApi implements ImmutableAccountInternalApi {
+
+ private final EntitySqlDaoTransactionalJdbiWrapper transactionalSqlDao;
+ private final NonEntityDao nonEntityDao;
+ private final CacheControllerDispatcher cacheControllerDispatcher;
+ private final CacheController accountCacheController;
+
+ @Inject
+ public DefaultImmutableAccountInternalApi(final IDBI dbi,
+ final Clock clock,
+ final NonEntityDao nonEntityDao,
+ final CacheControllerDispatcher cacheControllerDispatcher) {
+ // This API will directly issue queries instead of relying on the DAO (introduced to avoid Guice circular dependencies with InternalCallContextFactory)
+ this.transactionalSqlDao = new EntitySqlDaoTransactionalJdbiWrapper(dbi, clock, cacheControllerDispatcher, nonEntityDao, null);
+ this.nonEntityDao = nonEntityDao;
+ this.cacheControllerDispatcher = cacheControllerDispatcher;
+ this.accountCacheController = cacheControllerDispatcher.getCacheController(CacheType.ACCOUNT_IMMUTABLE);
+ }
+
+ @Override
+ public ImmutableAccountData getImmutableAccountDataById(final UUID accountId, final InternalTenantContext context) throws AccountApiException {
+ final Long recordId = nonEntityDao.retrieveRecordIdFromObject(accountId, ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID));
+ return getImmutableAccountDataByRecordId(recordId, context);
+ }
+
+ @Override
+ public ImmutableAccountData getImmutableAccountDataByRecordId(final Long recordId, final InternalTenantContext context) throws AccountApiException {
+ final CacheLoaderArgument arg = createImmutableAccountCacheLoaderArgument(context);
+ return (ImmutableAccountData) accountCacheController.get(recordId, arg);
+ }
+
+ private CacheLoaderArgument createImmutableAccountCacheLoaderArgument(final InternalTenantContext context) {
+ final LoaderCallback loaderCallback = new LoaderCallback() {
+ @Override
+ public Object loadAccount(final Long recordId, final InternalTenantContext context) {
+ final Account account = getAccountByRecordIdInternal(recordId, context);
+ return account != null ? new DefaultImmutableAccountData(account) : null;
+ }
+ };
+
+ final Object[] args = {loaderCallback};
+ return new CacheLoaderArgument(null, args, context);
+ }
+
+ private Account getAccountByRecordIdInternal(final Long recordId, final InternalTenantContext context) {
+ final AccountModelDao accountModelDao = transactionalSqlDao.execute(new EntitySqlDaoTransactionWrapper<AccountModelDao>() {
+
+ @Override
+ public AccountModelDao inTransaction(final EntitySqlDaoWrapperFactory entitySqlDaoWrapperFactory) throws Exception {
+ final EntitySqlDao<AccountModelDao, Account> transactional = entitySqlDaoWrapperFactory.become(AccountSqlDao.class);
+ return transactional.getByRecordId(recordId, context);
+ }
+ });
+
+ return accountModelDao != null ? new DefaultAccount(accountModelDao) : null;
+ }
+}
diff --git a/account/src/main/java/org/killbill/billing/account/glue/DefaultAccountModule.java b/account/src/main/java/org/killbill/billing/account/glue/DefaultAccountModule.java
index 705ae60..c5931f6 100644
--- a/account/src/main/java/org/killbill/billing/account/glue/DefaultAccountModule.java
+++ b/account/src/main/java/org/killbill/billing/account/glue/DefaultAccountModule.java
@@ -22,7 +22,9 @@ import org.killbill.billing.account.api.AccountInternalApi;
import org.killbill.billing.account.api.AccountService;
import org.killbill.billing.account.api.AccountUserApi;
import org.killbill.billing.account.api.DefaultAccountService;
+import org.killbill.billing.account.api.ImmutableAccountInternalApi;
import org.killbill.billing.account.api.svcs.DefaultAccountInternalApi;
+import org.killbill.billing.account.api.svcs.DefaultImmutableAccountInternalApi;
import org.killbill.billing.account.api.user.DefaultAccountUserApi;
import org.killbill.billing.account.dao.AccountDao;
import org.killbill.billing.account.dao.DefaultAccountDao;
@@ -51,6 +53,7 @@ public class DefaultAccountModule extends KillBillModule implements AccountModul
@Override
public void installInternalApi() {
bind(AccountInternalApi.class).to(DefaultAccountInternalApi.class).asEagerSingleton();
+ bind(ImmutableAccountInternalApi.class).to(DefaultImmutableAccountInternalApi.class).asEagerSingleton();
}
private void installAccountService() {
diff --git a/account/src/test/java/org/killbill/billing/account/AccountTestSuiteWithEmbeddedDB.java b/account/src/test/java/org/killbill/billing/account/AccountTestSuiteWithEmbeddedDB.java
index b441e7b..88bcf6b 100644
--- a/account/src/test/java/org/killbill/billing/account/AccountTestSuiteWithEmbeddedDB.java
+++ b/account/src/test/java/org/killbill/billing/account/AccountTestSuiteWithEmbeddedDB.java
@@ -16,6 +16,11 @@
package org.killbill.billing.account;
+import org.killbill.billing.ObjectType;
+import org.killbill.billing.account.api.Account;
+import org.killbill.billing.account.api.AccountApiException;
+import org.killbill.billing.account.api.AccountData;
+import org.killbill.billing.util.cache.Cachable.CacheType;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
@@ -80,4 +85,14 @@ public abstract class AccountTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
public void afterMethod() throws Exception {
bus.stop();
}
+
+ protected Account createAccount(final AccountData accountData) throws AccountApiException {
+ final Account account = accountUserApi.createAccount(accountData, callContext);
+
+ final Long accountRecordId = nonEntityDao.retrieveRecordIdFromObject(account.getId(), ObjectType.ACCOUNT, controlCacheDispatcher.getCacheController(CacheType.RECORD_ID));
+ internalCallContext.setAccountRecordId(accountRecordId);
+ internalCallContext.setReferenceDateTimeZone(account.getTimeZone());
+
+ return 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 39bbb72..1b4f12a 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
@@ -50,7 +50,7 @@ public class TestDefaultAccountUserApi extends AccountTestSuiteWithEmbeddedDB {
final AccountModelDao accountModelDao = createTestAccount();
final AccountData defaultAccount = new DefaultAccount(accountModelDao);
- final Account account = accountUserApi.createAccount(defaultAccount, callContext);
+ final Account account = createAccount(defaultAccount);
await().atMost(10, SECONDS).until(new Callable<Boolean>() {
@Override
@@ -67,7 +67,7 @@ public class TestDefaultAccountUserApi extends AccountTestSuiteWithEmbeddedDB {
@Test(groups = "slow", description = "Test Account update with null values")
public void testShouldBeAbleToPassNullForSomeFieldsToAvoidUpdate() throws Exception {
- final Account account = accountUserApi.createAccount(new DefaultAccount(createTestAccount()), callContext);
+ final Account account = createAccount(new DefaultAccount(createTestAccount()));
// Update the address and leave other fields null
final MutableAccountData mutableAccountData = new DefaultMutableAccountData(null, null, null, 0, null, 0, null,
@@ -88,7 +88,7 @@ public class TestDefaultAccountUserApi extends AccountTestSuiteWithEmbeddedDB {
@Test(groups = "slow", expectedExceptions = IllegalArgumentException.class, description = "Test updating Account BCD does throws an exception")
public void testShouldntBeAbleToUpdateBillCycleDay() throws Exception {
- final Account account = accountUserApi.createAccount(new DefaultAccount(createTestAccount()), callContext);
+ final Account account = createAccount(new DefaultAccount(createTestAccount()));
final MutableAccountData otherAccount = new DefaultAccount(account.getId(), account).toMutableAccountData();
otherAccount.setBillCycleDayLocal(account.getBillCycleDayLocal() + 2);
@@ -98,7 +98,7 @@ public class TestDefaultAccountUserApi extends AccountTestSuiteWithEmbeddedDB {
@Test(groups = "slow", expectedExceptions = IllegalArgumentException.class, description = "Test updating Account currency throws an exception")
public void testShouldntBeAbleToUpdateCurrency() throws Exception {
- final Account account = accountUserApi.createAccount(new DefaultAccount(createTestAccount()), callContext);
+ final Account account = createAccount(new DefaultAccount(createTestAccount()));
final MutableAccountData otherAccount = new DefaultAccount(account.getId(), account).toMutableAccountData();
otherAccount.setCurrency(Currency.GBP);
@@ -108,7 +108,7 @@ public class TestDefaultAccountUserApi extends AccountTestSuiteWithEmbeddedDB {
@Test(groups = "slow", expectedExceptions = IllegalArgumentException.class, description = "Test updating Account externalKey throws an exception")
public void testShouldntBeAbleToUpdateExternalKey() throws Exception {
- final Account account = accountUserApi.createAccount(new DefaultAccount(createTestAccount()), callContext);
+ final Account account = createAccount(new DefaultAccount(createTestAccount()));
final MutableAccountData otherAccount = new DefaultAccount(account.getId(), account).toMutableAccountData();
otherAccount.setExternalKey(UUID.randomUUID().toString());
diff --git a/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java b/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
index fc3fece..1592f85 100644
--- a/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
+++ b/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
@@ -113,28 +113,31 @@ public class TestAccountDao extends AccountTestSuiteWithEmbeddedDB {
final AccountModelDao account1 = createTestAccount();
accountDao.create(account1, internalCallContext);
final Long account1RecordId = nonEntityDao.retrieveAccountRecordIdFromObject(account1.getId(), ObjectType.ACCOUNT, null);
- final InternalCallContext internalCallContext1 = new InternalCallContext(internalCallContext, account1RecordId);
+ internalCallContext.setAccountRecordId(account1RecordId);
+ internalCallContext.setReferenceDateTimeZone(account1.getTimeZone());
// Verify audits via account record id
- final DefaultAccountAuditLogs auditLogsForAccount1ViaAccountRecordId1 = auditDao.getAuditLogsForAccountRecordId(AuditLevel.FULL, internalCallContext1);
+ final DefaultAccountAuditLogs auditLogsForAccount1ViaAccountRecordId1 = auditDao.getAuditLogsForAccountRecordId(AuditLevel.FULL, internalCallContext);
Assert.assertEquals(auditLogsForAccount1ViaAccountRecordId1.getAuditLogsForAccount().size(), 1);
Assert.assertEquals(auditLogsForAccount1ViaAccountRecordId1.getAuditLogsForAccount().get(0).getChangeType(), ChangeType.INSERT);
// Add an entry in the account_history table to make sure we pick up the right
// record id / target record id / account record id in the audit_log table
- accountDao.updatePaymentMethod(account1.getId(), UUID.randomUUID(), internalCallContext1);
+ accountDao.updatePaymentMethod(account1.getId(), UUID.randomUUID(), internalCallContext);
final AccountModelDao account2 = createTestAccount();
accountDao.create(account2, internalCallContext);
final Long account2RecordId = nonEntityDao.retrieveAccountRecordIdFromObject(account2.getId(), ObjectType.ACCOUNT, null);
- final InternalTenantContext internalTenantContext2 = new InternalCallContext(internalCallContext, account2RecordId);
+ internalCallContext.setAccountRecordId(account2RecordId);
+ internalCallContext.setReferenceDateTimeZone(account2.getTimeZone());
// Verify audits via account record id
- final DefaultAccountAuditLogs auditLogsForAccount2ViaAccountRecordId = auditDao.getAuditLogsForAccountRecordId(AuditLevel.FULL, internalTenantContext2);
+ final DefaultAccountAuditLogs auditLogsForAccount2ViaAccountRecordId = auditDao.getAuditLogsForAccountRecordId(AuditLevel.FULL, internalCallContext);
Assert.assertEquals(auditLogsForAccount2ViaAccountRecordId.getAuditLogsForAccount().size(), 1);
Assert.assertEquals(auditLogsForAccount2ViaAccountRecordId.getAuditLogsForAccount().get(0).getChangeType(), ChangeType.INSERT);
- final DefaultAccountAuditLogs auditLogsForAccount1ViaAccountRecordId2 = auditDao.getAuditLogsForAccountRecordId(AuditLevel.FULL, internalCallContext1);
+ internalCallContext.setAccountRecordId(account1RecordId);
+ final DefaultAccountAuditLogs auditLogsForAccount1ViaAccountRecordId2 = auditDao.getAuditLogsForAccountRecordId(AuditLevel.FULL, internalCallContext);
Assert.assertEquals(auditLogsForAccount1ViaAccountRecordId2.getAuditLogsForAccount().size(), 2);
Assert.assertEquals(auditLogsForAccount1ViaAccountRecordId2.getAuditLogsForAccount().get(0).getChangeType(), ChangeType.INSERT);
Assert.assertEquals(auditLogsForAccount1ViaAccountRecordId2.getAuditLogsForAccount().get(1).getChangeType(), ChangeType.UPDATE);
diff --git a/api/src/main/java/org/killbill/billing/account/api/AccountInternalApi.java b/api/src/main/java/org/killbill/billing/account/api/AccountInternalApi.java
index 4f7a92f..ad70272 100644
--- a/api/src/main/java/org/killbill/billing/account/api/AccountInternalApi.java
+++ b/api/src/main/java/org/killbill/billing/account/api/AccountInternalApi.java
@@ -1,7 +1,9 @@
/*
- * Copyright 2010-2011 Ning, Inc.
+ * Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -22,7 +24,7 @@ import java.util.UUID;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
-public interface AccountInternalApi {
+public interface AccountInternalApi extends ImmutableAccountInternalApi {
Account getAccountByKey(String key, InternalTenantContext context) throws AccountApiException;
@@ -41,9 +43,4 @@ public interface AccountInternalApi {
void updatePaymentMethod(UUID accountId, UUID paymentMethodId, InternalCallContext context) throws AccountApiException;
UUID getByRecordId(Long recordId, InternalTenantContext context) throws AccountApiException;
-
- ImmutableAccountData getImmutableAccountDataById(UUID accountId, InternalTenantContext context) throws AccountApiException;
-
- ImmutableAccountData getImmutableAccountDataByRecordId(Long recordId, InternalTenantContext context) throws AccountApiException;
-
}
diff --git a/api/src/main/java/org/killbill/billing/account/api/ImmutableAccountInternalApi.java b/api/src/main/java/org/killbill/billing/account/api/ImmutableAccountInternalApi.java
new file mode 100644
index 0000000..abf6c9e
--- /dev/null
+++ b/api/src/main/java/org/killbill/billing/account/api/ImmutableAccountInternalApi.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2016 Groupon, Inc
+ * Copyright 2016 The Billing Project, LLC
+ *
+ * The Billing Project 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 org.killbill.billing.account.api;
+
+import java.util.UUID;
+
+import org.killbill.billing.callcontext.InternalTenantContext;
+
+public interface ImmutableAccountInternalApi {
+
+ ImmutableAccountData getImmutableAccountDataById(UUID accountId, InternalTenantContext context) throws AccountApiException;
+
+ ImmutableAccountData getImmutableAccountDataByRecordId(Long recordId, InternalTenantContext context) throws AccountApiException;
+}
diff --git a/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java b/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java
index 7dced4f..dee6931 100644
--- a/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java
+++ b/api/src/main/java/org/killbill/billing/callcontext/InternalCallContext.java
@@ -1,7 +1,9 @@
/*
- * Copyright 2010-2012 Ning, Inc.
+ * Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -21,7 +23,6 @@ import java.util.UUID;
import javax.annotation.Nullable;
import org.joda.time.DateTime;
-
import org.joda.time.DateTimeZone;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.CallOrigin;
@@ -42,10 +43,18 @@ public class InternalCallContext extends InternalTenantContext {
private final DateTime createdDate;
private final DateTime updatedDate;
- public InternalCallContext(final Long tenantRecordId, @Nullable final Long accountRecordId, final UUID userToken, final String userName,
- final CallOrigin callOrigin, final UserType userType, final String reasonCode, final String comment,
- final DateTime createdDate, final DateTime updatedDate) {
- super(tenantRecordId, accountRecordId);
+ public InternalCallContext(final Long tenantRecordId,
+ @Nullable final Long accountRecordId,
+ @Nullable final DateTimeZone referenceDateTimeZone,
+ final UUID userToken,
+ final String userName,
+ final CallOrigin callOrigin,
+ final UserType userType,
+ final String reasonCode,
+ final String comment,
+ final DateTime createdDate,
+ final DateTime updatedDate) {
+ super(tenantRecordId, accountRecordId, referenceDateTimeZone);
this.userToken = userToken;
this.createdBy = userName;
this.updatedBy = userName;
@@ -57,20 +66,14 @@ public class InternalCallContext extends InternalTenantContext {
this.updatedDate = toUTCDateTime(updatedDate);
}
- public InternalCallContext(final Long tenantRecordId, @Nullable final Long accountRecordId, final CallContext callContext) {
- this(tenantRecordId, accountRecordId, callContext.getUserToken(), callContext.getUserName(), callContext.getCallOrigin(),
+ public InternalCallContext(final Long tenantRecordId, final CallContext callContext) {
+ this(tenantRecordId, null, null, callContext.getUserToken(), callContext.getUserName(), callContext.getCallOrigin(),
callContext.getUserType(), callContext.getReasonCode(), callContext.getComments(), callContext.getCreatedDate(),
callContext.getUpdatedDate());
}
- public InternalCallContext(final InternalCallContext context, final Long accountRecordId) {
- this(context.getTenantRecordId(), accountRecordId, context.getUserToken(), context.getCreatedBy(), context.getCallOrigin(),
- context.getContextUserType(), context.getReasonCode(), context.getComments(), context.getCreatedDate(),
- context.getUpdatedDate());
- }
-
- public InternalCallContext(final InternalCallContext context, final Long accountRecordId, final Long tenantRecordId) {
- this(tenantRecordId, accountRecordId, context.getUserToken(), context.getCreatedBy(), context.getCallOrigin(),
+ public InternalCallContext(final InternalCallContext context, final Long accountRecordId, final DateTimeZone referenceDateTimeZone) {
+ this(context.getTenantRecordId(), accountRecordId, referenceDateTimeZone, context.getUserToken(), context.getCreatedBy(), context.getCallOrigin(),
context.getContextUserType(), context.getReasonCode(), context.getComments(), context.getCreatedDate(),
context.getUpdatedDate());
}
diff --git a/api/src/main/java/org/killbill/billing/callcontext/InternalTenantContext.java b/api/src/main/java/org/killbill/billing/callcontext/InternalTenantContext.java
index 8995fd1..003fb19 100644
--- a/api/src/main/java/org/killbill/billing/callcontext/InternalTenantContext.java
+++ b/api/src/main/java/org/killbill/billing/callcontext/InternalTenantContext.java
@@ -1,7 +1,9 @@
/*
- * Copyright 2010-2012 Ning, Inc.
+ * Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -20,6 +22,7 @@ import java.util.UUID;
import javax.annotation.Nullable;
+import org.joda.time.DateTimeZone;
import org.killbill.billing.util.callcontext.TenantContext;
/**
@@ -30,13 +33,16 @@ public class InternalTenantContext extends TimeAwareContext {
protected final Long tenantRecordId;
protected final Long accountRecordId;
- public InternalTenantContext(final Long tenantRecordId, @Nullable final Long accountRecordId) {
+ public InternalTenantContext(final Long tenantRecordId,
+ @Nullable final Long accountRecordId,
+ @Nullable final DateTimeZone referenceDateTimeZone) {
+ super(referenceDateTimeZone);
this.tenantRecordId = tenantRecordId;
this.accountRecordId = accountRecordId;
}
- public InternalTenantContext(final long defaultTenantRecordId) {
- this(defaultTenantRecordId, null);
+ public InternalTenantContext(final Long defaultTenantRecordId) {
+ this(defaultTenantRecordId, null, null);
}
public TenantContext toTenantContext(final UUID tenantId) {
@@ -55,8 +61,8 @@ public class InternalTenantContext extends TimeAwareContext {
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("InternalTenantContext");
- sb.append("{accountRecordId=").append(accountRecordId);
- sb.append(", tenantRecordId=").append(tenantRecordId);
+ sb.append("{accountRecordId=").append(getAccountRecordId());
+ sb.append(", tenantRecordId=").append(getTenantRecordId());
sb.append('}');
return sb.toString();
}
@@ -72,10 +78,10 @@ public class InternalTenantContext extends TimeAwareContext {
final InternalTenantContext that = (InternalTenantContext) o;
- if (accountRecordId != null ? !accountRecordId.equals(that.accountRecordId) : that.accountRecordId != null) {
+ if (getAccountRecordId() != null ? !getAccountRecordId().equals(that.getAccountRecordId()) : that.getAccountRecordId() != null) {
return false;
}
- if (tenantRecordId != null ? !tenantRecordId.equals(that.tenantRecordId) : that.tenantRecordId != null) {
+ if (getTenantRecordId() != null ? !getTenantRecordId().equals(that.getTenantRecordId()) : that.getTenantRecordId() != null) {
return false;
}
@@ -84,8 +90,8 @@ public class InternalTenantContext extends TimeAwareContext {
@Override
public int hashCode() {
- int result = accountRecordId != null ? accountRecordId.hashCode() : 0;
- result = 31 * result + (tenantRecordId != null ? tenantRecordId.hashCode() : 0);
+ int result = getAccountRecordId() != null ? getAccountRecordId().hashCode() : 0;
+ result = 31 * result + (getTenantRecordId() != null ? getTenantRecordId().hashCode() : 0);
return result;
}
}
diff --git a/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java b/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java
index 1dfc111..943436a 100644
--- a/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java
+++ b/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java
@@ -24,9 +24,15 @@ import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
-// TODO Cache the accountTimeZone, reference time and clock in the context
+// TODO Cache the reference time and clock in the context
public class TimeAwareContext {
+ private final DateTimeZone referenceDateTimeZone;
+
+ public TimeAwareContext(final DateTimeZone referenceDateTimeZone) {
+ this.referenceDateTimeZone = referenceDateTimeZone;
+ }
+
/// Generic functions
/// TODO Move to ClockUtil
@@ -48,8 +54,10 @@ public class TimeAwareContext {
/// DateTime <-> LocalDate transformations
// Create a DateTime object using the specified reference time and timezone (usually, the one on the account)
- public DateTime toUTCDateTime(final LocalDate localDate, final DateTime referenceDateTime, final DateTimeZone accountTimeZone) {
- final DateTimeZone normalizedAccountTimezone = getNormalizedAccountTimezone(referenceDateTime, accountTimeZone);
+ public DateTime toUTCDateTime(final LocalDate localDate, final DateTime referenceDateTime, final DateTimeZone accountTimeZoneUnused) {
+ validateContext();
+
+ final DateTimeZone normalizedAccountTimezone = getNormalizedAccountTimezone(referenceDateTime, getReferenceDateTimeZone());
final LocalTime referenceLocalTime = toDateTime(referenceDateTime, normalizedAccountTimezone).toLocalTime();
@@ -65,18 +73,31 @@ public class TimeAwareContext {
}
// Create a LocalDate object using the specified timezone (usually, the one on the account), respecting the offset at the time of the referenceDateTime
- public LocalDate toLocalDate(final DateTime dateTime, final DateTime referenceDateTime, final DateTimeZone accountTimeZone) {
- final DateTimeZone normalizedAccountTimezone = getNormalizedAccountTimezone(referenceDateTime, accountTimeZone);
+ public LocalDate toLocalDate(final DateTime dateTime, final DateTime referenceDateTime, final DateTimeZone accountTimeZoneUnused) {
+ validateContext();
+
+ final DateTimeZone normalizedAccountTimezone = getNormalizedAccountTimezone(referenceDateTime, getReferenceDateTimeZone());
return new LocalDate(dateTime, normalizedAccountTimezone);
}
- private DateTimeZone getNormalizedAccountTimezone(final DateTime referenceDateTime, final DateTimeZone accountTimeZone) {
+ private DateTimeZone getNormalizedAccountTimezone(final DateTime referenceDateTime, final DateTimeZone accountTimeZoneUnused) {
// Check if DST was in effect at the reference date time
- final boolean shouldUseDST = !accountTimeZone.isStandardOffset(referenceDateTime.getMillis());
+ final boolean shouldUseDST = !getReferenceDateTimeZone().isStandardOffset(referenceDateTime.getMillis());
if (shouldUseDST) {
- return DateTimeZone.forOffsetMillis(accountTimeZone.getOffset(referenceDateTime.getMillis()));
+ return DateTimeZone.forOffsetMillis(getReferenceDateTimeZone().getOffset(referenceDateTime.getMillis()));
} else {
- return DateTimeZone.forOffsetMillis(accountTimeZone.getStandardOffset(referenceDateTime.getMillis()));
+ return DateTimeZone.forOffsetMillis(getReferenceDateTimeZone().getStandardOffset(referenceDateTime.getMillis()));
}
}
+
+ private void validateContext() {
+ if (getReferenceDateTimeZone() == null) {
+ throw new IllegalArgumentException(String.format("Context mis-configured: getReferenceDateTimeZone()=%s", getReferenceDateTimeZone()));
+ }
+ }
+
+ // For convenience, to be overridden in tests
+ public DateTimeZone getReferenceDateTimeZone() {
+ return referenceDateTimeZone;
+ }
}
beatrix/pom.xml 6(+6 -0)
diff --git a/beatrix/pom.xml b/beatrix/pom.xml
index 0376865..0a1f312 100644
--- a/beatrix/pom.xml
+++ b/beatrix/pom.xml
@@ -267,6 +267,12 @@
</dependency>
<dependency>
<groupId>org.kill-bill.commons</groupId>
+ <artifactId>killbill-queue</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.kill-bill.commons</groupId>
<artifactId>killbill-xmlloader</artifactId>
</dependency>
<dependency>
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/extbus/TestEventJson.java b/beatrix/src/test/java/org/killbill/billing/beatrix/extbus/TestEventJson.java
index 8238496..77ab028 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/extbus/TestEventJson.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/extbus/TestEventJson.java
@@ -24,10 +24,10 @@ import org.testng.Assert;
import org.testng.annotations.Test;
import org.killbill.billing.ObjectType;
-import org.killbill.billing.beatrix.BeatrixTestSuite;
+import org.killbill.billing.beatrix.BeatrixTestSuiteNoDB;
import org.killbill.billing.util.jackson.ObjectMapper;
-public class TestEventJson extends BeatrixTestSuite {
+public class TestEventJson extends BeatrixTestSuiteNoDB {
private final ObjectMapper mapper = new ObjectMapper();
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModuleNoDB.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModuleNoDB.java
new file mode 100644
index 0000000..4c47137
--- /dev/null
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModuleNoDB.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
+ *
+ * The Billing Project 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 org.killbill.billing.beatrix.integration;
+
+import org.killbill.billing.GuicyKillbillTestNoDBModule;
+import org.killbill.billing.mock.glue.MockAccountModule;
+import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
+import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.billing.util.glue.KillBillModule;
+
+public class BeatrixIntegrationModuleNoDB extends KillBillModule {
+
+ public BeatrixIntegrationModuleNoDB(final KillbillConfigSource configSource) {
+ super(configSource);
+ }
+
+ @Override
+ protected void configure() {
+ install(new GuicyKillbillTestNoDBModule(configSource));
+ install(new MockNonEntityDaoModule(configSource));
+ install(new MockAccountModule(configSource));
+ }
+}
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
index fef40bc..ef2b22b 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
@@ -99,8 +99,11 @@ import org.killbill.billing.util.api.RecordIdApi;
import org.killbill.billing.util.api.TagApiException;
import org.killbill.billing.util.api.TagDefinitionApiException;
import org.killbill.billing.util.api.TagUserApi;
+import org.killbill.billing.util.cache.Cachable.CacheType;
+import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.TestCallContext;
+import org.killbill.billing.util.dao.NonEntityDao;
import org.killbill.billing.util.nodes.KillbillNodesApi;
import org.killbill.billing.util.tag.ControlTagType;
import org.killbill.billing.util.tag.Tag;
@@ -247,6 +250,8 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB {
@Inject
protected IDBI idbi;
+ @Inject
+ protected NonEntityDao nonEntityDao;
@Inject
protected TestApiListener busHandler;
@@ -260,6 +265,9 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB {
@Inject
protected KillbillNodesApi nodesApi;
+ @Inject
+ protected CacheControllerDispatcher controllerDispatcher;
+
protected void assertListenerStatus() {
busHandler.assertListenerStatus();
}
@@ -278,6 +286,9 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB {
//Thread.currentThread().setContextClassLoader(null);
log.debug("RESET TEST FRAMEWORK");
+
+ controllerDispatcher.clearAll();
+
overdueConfigCache.loadDefaultOverdueConfig((OverdueConfig) null);
clock.resetDeltaFromReality();
@@ -351,6 +362,10 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB {
final Account account = accountUserApi.createAccount(accountData, callContext);
assertNotNull(account);
+ final Long accountRecordId = nonEntityDao.retrieveRecordIdFromObject(account.getId(), ObjectType.ACCOUNT, controlCacheDispatcher.getCacheController(CacheType.RECORD_ID));
+ internalCallContext.setAccountRecordId(accountRecordId);
+ internalCallContext.setReferenceDateTimeZone(account.getTimeZone());
+
final PaymentMethodPlugin info = createPaymentMethodPlugin();
paymentApi.addPaymentMethod(account, UUID.randomUUID().toString(), paymentPluginName, true, info, PLUGIN_PROPERTIES, callContext);
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPublicBus.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPublicBus.java
index fbe0b9e..f38238b 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPublicBus.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPublicBus.java
@@ -100,6 +100,8 @@ public class TestPublicBus extends TestIntegrationBase {
log.debug("RESET TEST FRAMEWORK");
+ controllerDispatcher.clearAll();
+
overdueConfigCache.loadDefaultOverdueConfig((OverdueConfig) null);
clock.resetDeltaFromReality();
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java b/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java
index dbe3b2b..a47477d 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/VersionedCatalog.java
@@ -75,13 +75,13 @@ public class VersionedCatalog extends ValidatingConfig<StandaloneCatalogWithPric
public VersionedCatalog() {
this.clock = null;
this.versions = new ArrayList<StandaloneCatalogWithPriceOverride>();
- this.internalTenantContext = new InternalTenantContext(null, null);
+ this.internalTenantContext = new InternalTenantContext(null);
}
public VersionedCatalog(final Clock clock) {
this.clock = clock;
this.versions = new ArrayList<StandaloneCatalogWithPriceOverride>();
- this.internalTenantContext = new InternalTenantContext(null, null);
+ this.internalTenantContext = new InternalTenantContext(null);
}
public VersionedCatalog(final Clock clock, final String catalogName, final BillingMode recurringBillingMode, final List<StandaloneCatalogWithPriceOverride> versions, final InternalTenantContext tenantContext) {
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModule.java b/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModule.java
index b6f5354..e3bef69 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModule.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModule.java
@@ -19,6 +19,7 @@
package org.killbill.billing.catalog.glue;
import org.killbill.billing.GuicyKillbillTestNoDBModule;
+import org.killbill.billing.mock.glue.MockAccountModule;
import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
import org.killbill.billing.mock.glue.MockTenantModule;
import org.killbill.billing.platform.api.KillbillConfigSource;
@@ -36,5 +37,6 @@ public class TestCatalogModule extends CatalogModule {
install(new MockNonEntityDaoModule(configSource));
install(new CacheModule(configSource));
install(new MockTenantModule(configSource));
+ install(new MockAccountModule(configSource));
}
}
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlement.java b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlement.java
index e2a2bf1..b085b5c 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlement.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultEntitlement.java
@@ -48,7 +48,7 @@ public class TestDefaultEntitlement extends EntitlementTestSuiteWithEmbeddedDB {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -75,7 +75,7 @@ public class TestDefaultEntitlement extends EntitlementTestSuiteWithEmbeddedDB {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -109,7 +109,7 @@ public class TestDefaultEntitlement extends EntitlementTestSuiteWithEmbeddedDB {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -142,7 +142,7 @@ public class TestDefaultEntitlement extends EntitlementTestSuiteWithEmbeddedDB {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -167,7 +167,7 @@ public class TestDefaultEntitlement extends EntitlementTestSuiteWithEmbeddedDB {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -210,7 +210,7 @@ public class TestDefaultEntitlement extends EntitlementTestSuiteWithEmbeddedDB {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -250,7 +250,7 @@ public class TestDefaultEntitlement extends EntitlementTestSuiteWithEmbeddedDB {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -284,7 +284,7 @@ public class TestDefaultEntitlement extends EntitlementTestSuiteWithEmbeddedDB {
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
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 74fda0c..e060144 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
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -54,7 +56,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -117,7 +119,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -150,7 +152,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -242,7 +244,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -281,7 +283,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -357,7 +359,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
// Create entitlement
testListener.pushExpectedEvent(NextEvent.CREATE);
@@ -402,8 +404,9 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account accountSrc = accountApi.createAccount(getAccountData(7), callContext);
- final Account accountDesc = accountApi.createAccount(getAccountData(15), callContext);
+ final Account accountDesc = createAccount(getAccountData(15));
+ // internal context will be configured for accountSrc
+ final Account accountSrc = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -443,7 +446,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -508,15 +511,13 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
assertEquals(bundleEntitlements.get(0).getState(), EntitlementState.ACTIVE);
}
-
-
- @Test(groups = "slow")
+ @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 Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -561,7 +562,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier baseSpec = new PlanPhaseSpecifier("Pistol", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
final PlanPhaseSpecifier addOnSpec = new PlanPhaseSpecifier("Cleaning", ProductCategory.ADD_ON, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -599,7 +600,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier baseSpec = new PlanPhaseSpecifier("Pistol", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
final PlanPhaseSpecifier addOnSpec = new PlanPhaseSpecifier("Invalid", ProductCategory.ADD_ON, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -629,7 +630,7 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier baseSpec = new PlanPhaseSpecifier("Cleaning", ProductCategory.ADD_ON, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
final PlanPhaseSpecifier addOnSpec = new PlanPhaseSpecifier("Bullets", ProductCategory.ADD_ON, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
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 474eb3e..fd9162d 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
@@ -54,7 +54,7 @@ public class TestDefaultSubscriptionApi extends EntitlementTestSuiteWithEmbedded
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
testListener.pushExpectedEvents(NextEvent.CREATE, NextEvent.CREATE, NextEvent.BLOCK);
final Entitlement entitlement1 = entitlementApi.createBaseEntitlement(account.getId(), spec, UUID.randomUUID().toString(), null, initialDate, ImmutableList.<PluginProperty>of(), callContext);
@@ -97,7 +97,7 @@ public class TestDefaultSubscriptionApi extends EntitlementTestSuiteWithEmbedded
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -165,7 +165,7 @@ public class TestDefaultSubscriptionApi extends EntitlementTestSuiteWithEmbedded
clock.addDays(3);
- final Account account2 = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account2 = createAccount(getAccountData(7));
testListener.pushExpectedEvents(NextEvent.TRANSFER, NextEvent.CANCEL, NextEvent.BLOCK);
entitlementApi.transferEntitlements(account.getId(), account2.getId(), externalKey, new LocalDate(clock.getUTCNow(), account.getTimeZone()), ImmutableList.<PluginProperty>of(), callContext);
@@ -203,7 +203,7 @@ public class TestDefaultSubscriptionApi extends EntitlementTestSuiteWithEmbedded
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
// Create entitlement
testListener.pushExpectedEvent(NextEvent.CREATE);
@@ -259,7 +259,7 @@ public class TestDefaultSubscriptionApi extends EntitlementTestSuiteWithEmbedded
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -297,7 +297,7 @@ public class TestDefaultSubscriptionApi extends EntitlementTestSuiteWithEmbedded
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
+ final Account account = createAccount(getAccountData(7));
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME, null);
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEntitlementDateHelper.java b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEntitlementDateHelper.java
index 65e34c7..35baa6d 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEntitlementDateHelper.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEntitlementDateHelper.java
@@ -21,15 +21,14 @@ package org.killbill.billing.entitlement.api;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
+import org.killbill.billing.account.api.Account;
+import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.entitlement.EntitlementTestSuiteNoDB;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
-import org.killbill.billing.account.api.Account;
-import org.killbill.billing.callcontext.InternalTenantContext;
-import org.killbill.billing.entitlement.EntitlementTestSuiteNoDB;
-
import static org.testng.Assert.assertTrue;
public class TestEntitlementDateHelper extends EntitlementTestSuiteNoDB {
@@ -41,12 +40,11 @@ public class TestEntitlementDateHelper extends EntitlementTestSuiteNoDB {
public void beforeMethod() throws Exception {
super.beforeClass();
-
account = Mockito.mock(Account.class);
Mockito.when(accountInternalApi.getAccountByRecordId(Mockito.anyLong(), Mockito.<InternalTenantContext>any())).thenReturn(account);
Mockito.when(accountInternalApi.getImmutableAccountDataByRecordId(Mockito.anyLong(), Mockito.<InternalTenantContext>any())).thenReturn(account);
dateHelper = new EntitlementDateHelper(accountInternalApi, clock);
- clock.resetDeltaFromReality();;
+ clock.resetDeltaFromReality();
}
@Test(groups = "fast")
@@ -63,7 +61,6 @@ public class TestEntitlementDateHelper extends EntitlementTestSuiteNoDB {
Assert.assertEquals(targetDate, expectedDate);
}
-
@Test(groups = "fast")
public void testWithAccountInUtcMinus8() throws EntitlementApiException {
@@ -73,12 +70,12 @@ public class TestEntitlementDateHelper extends EntitlementTestSuiteNoDB {
final DateTimeZone timeZoneUtcMinus8 = DateTimeZone.forOffsetHours(-8);
Mockito.when(account.getTimeZone()).thenReturn(timeZoneUtcMinus8);
+ internalCallContext.setReferenceDateTimeZone(account.getTimeZone());
// We also use a reference time of 1, 28, 10, 0 -> DateTime in accountTimeZone will be (2013, 8, 7, 1, 28, 10)
final DateTime refererenceDateTime = new DateTime(2013, 1, 1, 1, 28, 10, 0, DateTimeZone.UTC);
final DateTime targetDate = dateHelper.fromLocalDateAndReferenceTime(inputDate, refererenceDateTime, internalCallContext);
-
// Things to verify:
// 1. Verify the resulting DateTime brings us back into the correct LocalDate (in the account timezone)
Assert.assertEquals(new LocalDate(targetDate, timeZoneUtcMinus8), inputDate);
@@ -92,8 +89,6 @@ public class TestEntitlementDateHelper extends EntitlementTestSuiteNoDB {
Assert.assertEquals(targetDate, new DateTime(2013, 8, 8, 1, 28, 10, 0, DateTimeZone.UTC));
}
-
-
@Test(groups = "fast")
public void testWithAccountInUtcPlus5() throws EntitlementApiException {
@@ -102,6 +97,7 @@ public class TestEntitlementDateHelper extends EntitlementTestSuiteNoDB {
final DateTimeZone timeZoneUtcPlus5 = DateTimeZone.forOffsetHours(+5);
Mockito.when(account.getTimeZone()).thenReturn(timeZoneUtcPlus5);
+ internalCallContext.setReferenceDateTimeZone(account.getTimeZone());
// We also use a reference time of 20, 28, 10, 0 -> DateTime in accountTimeZone will be (2013, 8, 7, 20, 28, 10)
final DateTime refererenceDateTime = new DateTime(2013, 1, 1, 20, 28, 10, 0, DateTimeZone.UTC);
@@ -123,13 +119,14 @@ public class TestEntitlementDateHelper extends EntitlementTestSuiteNoDB {
@Test(groups = "fast")
public void testWhereLocalDateInAccountTimeZoneContainsNow() throws EntitlementApiException {
- final DateTime initialNow = new DateTime(2013, 8, 22,22, 07, 01, 0, DateTimeZone.UTC);
+ final DateTime initialNow = new DateTime(2013, 8, 22, 22, 07, 01, 0, DateTimeZone.UTC);
clock.setTime(initialNow);
final LocalDate inputDate = new LocalDate(2013, 8, 22);
final DateTimeZone timeZoneUtcMinus8 = DateTimeZone.forOffsetHours(-8);
Mockito.when(account.getTimeZone()).thenReturn(timeZoneUtcMinus8);
+ internalCallContext.setReferenceDateTimeZone(account.getTimeZone());
final DateTime referenceDateTimeThatDoesNotMatter = new DateTime();
final DateTime targetDate = dateHelper.fromLocalDateAndReferenceTime(inputDate, referenceDateTimeThatDoesNotMatter, internalCallContext);
@@ -139,13 +136,13 @@ public class TestEntitlementDateHelper extends EntitlementTestSuiteNoDB {
Assert.assertTrue(targetDate.compareTo(now) <= 0);
}
-
@Test(groups = "fast")
public void testIsBeforeOrEqualsToday() {
clock.setTime(new DateTime(2013, 8, 7, 3, 28, 10, 0, DateTimeZone.UTC));
final DateTimeZone timeZoneUtcMinus8 = DateTimeZone.forOffsetHours(-8);
-
+ Mockito.when(account.getTimeZone()).thenReturn(timeZoneUtcMinus8);
+ internalCallContext.setReferenceDateTimeZone(account.getTimeZone());
final DateTime inputDateEquals = new DateTime(2013, 8, 6, 23, 28, 10, 0, timeZoneUtcMinus8);
// Check that our input date is greater than now
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java b/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java
index 984955c..e8b76b0 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project 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
@@ -88,8 +88,7 @@ public class TestBlockingApi extends EntitlementTestSuiteWithEmbeddedDB {
final boolean blockEntitlement = false;
final boolean blockBilling = false;
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
- final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+ final Account account = createAccount(getAccountData(7));
testListener.pushExpectedEvent(NextEvent.BLOCK);
final BlockingState state1 = new DefaultBlockingState(account.getId(), BlockingStateType.ACCOUNT, overdueStateName, service, blockChange, blockEntitlement, blockBilling, clock.getUTCNow());
@@ -118,7 +117,6 @@ public class TestBlockingApi extends EntitlementTestSuiteWithEmbeddedDB {
Assert.assertEquals(history.get(1).getStateName(), overdueStateName2);
}
-
@Test(groups = "slow")
public void testBlockingAcrossTypes() throws Exception {
@@ -130,8 +128,7 @@ public class TestBlockingApi extends EntitlementTestSuiteWithEmbeddedDB {
final boolean blockEntitlement = true;
final boolean blockBilling = false;
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
- final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+ final Account account = createAccount(getAccountData(7));
testListener.pushExpectedEvent(NextEvent.BLOCK);
final BlockingState state1 = new DefaultBlockingState(account.getId(), BlockingStateType.ACCOUNT, stateNameBlock, service, blockChange, blockEntitlement, blockBilling, clock.getUTCNow());
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestBlockingDao.java b/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestBlockingDao.java
index f078f2f..a9478c7 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestBlockingDao.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestBlockingDao.java
@@ -40,10 +40,7 @@ public class TestBlockingDao extends EntitlementTestSuiteWithEmbeddedDB {
@BeforeMethod(groups = "slow")
public void setUp() throws Exception {
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
-
- // Override the context with the right account record id
- internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+ final Account account = createAccount(getAccountData(7));
}
@Test(groups = "slow", description = "Check BlockingStateDao with a single service")
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestDefaultBlockingStateDao.java b/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestDefaultBlockingStateDao.java
index 62a2919..19f605f 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestDefaultBlockingStateDao.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/dao/TestDefaultBlockingStateDao.java
@@ -50,10 +50,7 @@ public class TestDefaultBlockingStateDao extends EntitlementTestSuiteWithEmbedde
@BeforeMethod(groups = "slow")
public void setUp() throws Exception {
- account = accountApi.createAccount(getAccountData(7), callContext);
-
- // Override the context with the right account record id
- internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+ account = createAccount(getAccountData(7));
}
@Test(groups = "slow", description = "Verify we don't insert extra add-on events")
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/engine/core/TestEntitlementUtils.java b/entitlement/src/test/java/org/killbill/billing/entitlement/engine/core/TestEntitlementUtils.java
index b69e58b..c58a695 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/engine/core/TestEntitlementUtils.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/engine/core/TestEntitlementUtils.java
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -24,7 +26,10 @@ import javax.annotation.Nullable;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
+import org.killbill.billing.ObjectType;
+import org.killbill.billing.entitlement.AccountEventsStreams;
import org.killbill.billing.payment.api.PluginProperty;
+import org.killbill.billing.util.cache.Cachable.CacheType;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@@ -71,10 +76,7 @@ public class TestEntitlementUtils extends EntitlementTestSuiteWithEmbeddedDB {
sqlDao = dbi.onDemand(BlockingStateSqlDao.class);
clock.setDay(initialDate);
- account = accountApi.createAccount(getAccountData(7), callContext);
-
- // Override the context with the right account record id
- internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+ account = createAccount(getAccountData(7));
testListener.pushExpectedEvents(NextEvent.CREATE, NextEvent.CREATE);
@@ -450,8 +452,10 @@ public class TestEntitlementUtils extends EntitlementTestSuiteWithEmbeddedDB {
}
private Collection<BlockingState> computeFutureBlockingStatesForAssociatedAddonsViaAccount(final DefaultEntitlement baseEntitlement) throws EntitlementApiException {
- final InternalTenantContext context = internalCallContextFactory.createInternalTenantContext(baseEntitlement.getAccountId(), callContext);
- final EventsStream eventsStream = Iterables.<EventsStream>find(Iterables.<EventsStream>concat(eventsStreamBuilder.buildForAccount(context).getEventsStreams().values()),
+ setContextAccountRecordId();
+ final AccountEventsStreams accountEventsStreams = eventsStreamBuilder.buildForAccount(internalCallContext);
+
+ final EventsStream eventsStream = Iterables.<EventsStream>find(Iterables.<EventsStream>concat(accountEventsStreams.getEventsStreams().values()),
new Predicate<EventsStream>() {
@Override
public boolean apply(final EventsStream input) {
@@ -467,8 +471,10 @@ public class TestEntitlementUtils extends EntitlementTestSuiteWithEmbeddedDB {
}
private Collection<BlockingState> computeBlockingStatesForAssociatedAddonsViaAccount(final DefaultEntitlement baseEntitlement, final DateTime effectiveDate) throws EntitlementApiException {
- final InternalTenantContext context = internalCallContextFactory.createInternalTenantContext(baseEntitlement.getAccountId(), callContext);
- final EventsStream eventsStream = Iterables.<EventsStream>find(Iterables.<EventsStream>concat(eventsStreamBuilder.buildForAccount(context).getEventsStreams().values()),
+ setContextAccountRecordId();
+ final AccountEventsStreams accountEventsStreams = eventsStreamBuilder.buildForAccount(internalCallContext);
+
+ final EventsStream eventsStream = Iterables.<EventsStream>find(Iterables.<EventsStream>concat(accountEventsStreams.getEventsStreams().values()),
new Predicate<EventsStream>() {
@Override
public boolean apply(final EventsStream input) {
@@ -487,4 +493,8 @@ public class TestEntitlementUtils extends EntitlementTestSuiteWithEmbeddedDB {
}
}));
}
+
+ private void setContextAccountRecordId() {
+ internalCallContext.setAccountRecordId(nonEntityDao.retrieveRecordIdFromObject(account.getId(), ObjectType.ACCOUNT, controlCacheDispatcher.getCacheController(CacheType.RECORD_ID)));
+ }
}
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java b/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
index 1fe5700..82785c0 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
@@ -32,6 +32,9 @@ import org.apache.shiro.util.ThreadContext;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
+import org.killbill.billing.ObjectType;
+import org.killbill.billing.account.api.Account;
+import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountData;
import org.killbill.billing.account.api.AccountInternalApi;
import org.killbill.billing.account.api.AccountUserApi;
@@ -57,7 +60,9 @@ import org.killbill.billing.subscription.api.SubscriptionBaseService;
import org.killbill.billing.subscription.engine.core.DefaultSubscriptionBaseService;
import org.killbill.billing.tag.TagInternalApi;
import org.killbill.billing.util.api.AuditUserApi;
+import org.killbill.billing.util.cache.Cachable.CacheType;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
+import org.killbill.billing.util.dao.NonEntityDao;
import org.killbill.billing.util.tag.dao.TagDao;
import org.killbill.bus.api.PersistentBus;
import org.killbill.clock.ClockMock;
@@ -118,6 +123,8 @@ public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWi
protected InternalCallContextFactory internalCallContextFactory;
@Inject
protected SecurityApi securityApi;
+ @Inject
+ protected NonEntityDao nonEntityDao;
protected Catalog catalog;
@@ -279,6 +286,16 @@ public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWi
.build();
}
+ protected Account createAccount(final AccountData accountData) throws AccountApiException {
+ final Account account = accountApi.createAccount(accountData, callContext);
+
+ final Long accountRecordId = nonEntityDao.retrieveRecordIdFromObject(account.getId(), ObjectType.ACCOUNT, controlCacheDispatcher.getCacheController(CacheType.RECORD_ID));
+ internalCallContext.setAccountRecordId(accountRecordId);
+ internalCallContext.setReferenceDateTimeZone(account.getTimeZone());
+
+ return account;
+ }
+
protected void assertListenerStatus() {
testListener.assertListenerStatus();
}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java b/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
index 5784606..fd4b071 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/api/migration/TestDefaultInvoiceMigrationApi.java
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -23,20 +25,18 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
import org.killbill.billing.account.api.Account;
-import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
import org.killbill.billing.invoice.api.Invoice;
import org.killbill.billing.invoice.api.InvoiceApiException;
import org.killbill.billing.invoice.dao.InvoiceModelDao;
import org.killbill.billing.invoice.dao.InvoiceModelDaoHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
public class TestDefaultInvoiceMigrationApi extends InvoiceTestSuiteWithEmbeddedDB {
@@ -71,8 +71,7 @@ public class TestDefaultInvoiceMigrationApi extends InvoiceTestSuiteWithEmbedded
Assert.assertNotNull(migrationInvoiceId);
//Double check it was created and values are correct
- final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(accountId, callContext);
- final InvoiceModelDao invoice = invoiceDao.getById(migrationInvoiceId, internalTenantContext);
+ final InvoiceModelDao invoice = invoiceDao.getById(migrationInvoiceId, internalCallContext);
Assert.assertNotNull(invoice);
Assert.assertEquals(invoice.getAccountId(), accountId);
@@ -101,26 +100,15 @@ public class TestDefaultInvoiceMigrationApi extends InvoiceTestSuiteWithEmbedded
Assert.assertEquals(unpaid.size(), 2);
}
-
// ACCOUNT balance should reflect total of migration and non-migration invoices
@Test(groups = "slow")
public void testBalance() throws InvoiceApiException {
- final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(accountId, callContext);
- final InvoiceModelDao migrationInvoice = invoiceDao.getById(migrationInvoiceId, internalTenantContext);
- final InvoiceModelDao regularInvoice = invoiceDao.getById(regularInvoiceId, internalTenantContext);
+ final InvoiceModelDao migrationInvoice = invoiceDao.getById(migrationInvoiceId, internalCallContext);
+ final InvoiceModelDao regularInvoice = invoiceDao.getById(regularInvoiceId, internalCallContext);
final BigDecimal balanceOfAllInvoices = InvoiceModelDaoHelper.getBalance(migrationInvoice).add(InvoiceModelDaoHelper.getBalance(regularInvoice));
final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId, callContext);
log.info("ACCOUNT balance: " + accountBalance + " should equal the Balance Of All Invoices: " + balanceOfAllInvoices);
Assert.assertEquals(accountBalance.compareTo(balanceOfAllInvoices), 0);
}
-
- private boolean checkContains(final List<Invoice> invoices, final UUID invoiceId) {
- for (final Invoice invoice : invoices) {
- if (invoice.getId().equals(invoiceId)) {
- return true;
- }
- }
- return false;
- }
}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java
index a2f5751..cf36e03 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java
@@ -35,6 +35,7 @@ import org.killbill.billing.currency.api.Rate;
import org.killbill.billing.invoice.dao.InvoiceDao;
import org.killbill.billing.invoice.dao.MockInvoiceDao;
import org.killbill.billing.mock.api.MockAccountUserApi;
+import org.killbill.billing.mock.glue.MockAccountModule;
import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
import org.killbill.billing.platform.api.KillbillConfigSource;
import org.mockito.Mockito;
@@ -55,8 +56,7 @@ public class TestInvoiceModuleNoDB extends TestInvoiceModule {
install(new GuicyKillbillTestNoDBModule(configSource));
install(new MockNonEntityDaoModule(configSource));
- bind(AccountInternalApi.class).toInstance(Mockito.mock(AccountInternalApi.class));
- bind(AccountUserApi.class).to(MockAccountUserApi.class);
+ install(new MockAccountModule(configSource));
installCurrencyConversionApi();
}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
index 8b8946b..3857664 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoiceHelper.java
@@ -29,6 +29,7 @@ import javax.inject.Inject;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
+import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.Account;
import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountData;
@@ -36,6 +37,7 @@ import org.killbill.billing.account.api.AccountInternalApi;
import org.killbill.billing.account.api.AccountUserApi;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.callcontext.MutableInternalCallContext;
import org.killbill.billing.catalog.MockPlan;
import org.killbill.billing.catalog.MockPlanPhase;
import org.killbill.billing.catalog.api.BillingActionPolicy;
@@ -76,10 +78,13 @@ import org.killbill.billing.subscription.api.SubscriptionBase;
import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
import org.killbill.billing.subscription.api.SubscriptionBaseTransitionType;
import org.killbill.billing.subscription.api.user.SubscriptionBaseApiException;
+import org.killbill.billing.util.cache.Cachable.CacheType;
+import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.config.InvoiceConfig;
import org.killbill.billing.util.currency.KillBillMoney;
+import org.killbill.billing.util.dao.NonEntityDao;
import org.killbill.billing.util.timezone.DefaultAccountDateAndTimeZoneContext;
import org.killbill.clock.Clock;
import org.killbill.commons.locker.GlobalLocker;
@@ -155,7 +160,9 @@ public class TestInvoiceHelper {
private final InvoiceDao invoiceDao;
private final GlobalLocker locker;
private final Clock clock;
- private final InternalCallContext internalCallContext;
+ private final NonEntityDao nonEntityDao;
+ private final CacheControllerDispatcher cacheControllerDispatcher;
+ private final MutableInternalCallContext internalCallContext;
private final InternalCallContextFactory internalCallContextFactory;
private final InvoiceConfig invoiceConfig;
// Low level SqlDao used by the tests to directly insert rows
@@ -166,7 +173,7 @@ public class TestInvoiceHelper {
@Inject
public TestInvoiceHelper(final InvoiceGenerator generator, final IDBI dbi,
final BillingInternalApi billingApi, final AccountInternalApi accountApi, final InvoicePluginDispatcher invoicePluginDispatcher, final AccountUserApi accountUserApi, final SubscriptionBaseInternalApi subscriptionApi, final BusService busService,
- final InvoiceDao invoiceDao, final GlobalLocker locker, final Clock clock, final InternalCallContext internalCallContext, final InvoiceConfig invoiceConfig,
+ final InvoiceDao invoiceDao, final GlobalLocker locker, final Clock clock, final NonEntityDao nonEntityDao, final CacheControllerDispatcher cacheControllerDispatcher, final MutableInternalCallContext internalCallContext, final InvoiceConfig invoiceConfig,
final InternalCallContextFactory internalCallContextFactory) {
this.generator = generator;
this.billingApi = billingApi;
@@ -178,6 +185,8 @@ public class TestInvoiceHelper {
this.invoiceDao = invoiceDao;
this.locker = locker;
this.clock = clock;
+ this.nonEntityDao = nonEntityDao;
+ this.cacheControllerDispatcher = cacheControllerDispatcher;
this.internalCallContext = internalCallContext;
this.internalCallContextFactory = internalCallContextFactory;
this.invoiceItemSqlDao = dbi.onDemand(InvoiceItemSqlDao.class);
@@ -246,7 +255,13 @@ public class TestInvoiceHelper {
.paymentMethodId(UUID.randomUUID())
.timeZone(DateTimeZone.UTC)
.build();
- return accountUserApi.createAccount(accountData, callContext);
+ final Account account = accountUserApi.createAccount(accountData, callContext);
+
+ final Long accountRecordId = nonEntityDao.retrieveRecordIdFromObject(account.getId(), ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID));
+ internalCallContext.setAccountRecordId(accountRecordId);
+ internalCallContext.setReferenceDateTimeZone(account.getTimeZone());
+
+ return account;
}
public void createInvoiceItem(final InvoiceItem invoiceItem, final InternalCallContext internalCallContext) throws EntityPersistenceException {
diff --git a/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteWithEmbeddedDB.java b/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
index 4327199..7c03083 100644
--- a/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
+++ b/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
@@ -23,6 +23,9 @@ import java.util.UUID;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
+import org.killbill.billing.ObjectType;
+import org.killbill.billing.account.api.Account;
+import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountData;
import org.killbill.billing.account.api.AccountUserApi;
import org.killbill.billing.api.TestApiListener;
@@ -40,7 +43,9 @@ import org.killbill.billing.platform.api.KillbillConfigSource;
import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
import org.killbill.billing.subscription.api.SubscriptionBaseService;
import org.killbill.billing.subscription.engine.core.DefaultSubscriptionBaseService;
+import org.killbill.billing.util.cache.Cachable.CacheType;
import org.killbill.billing.util.callcontext.InternalCallContextFactory;
+import org.killbill.billing.util.dao.NonEntityDao;
import org.killbill.bus.api.PersistentBus;
import org.killbill.clock.ClockMock;
import org.slf4j.Logger;
@@ -83,6 +88,8 @@ public abstract class JunctionTestSuiteWithEmbeddedDB extends GuicyKillbillTestS
@Inject
protected EntitlementService entitlementService;
@Inject
+ protected NonEntityDao nonEntityDao;
+ @Inject
protected InternalCallContextFactory internalCallContextFactory;
protected Catalog catalog;
@@ -206,6 +213,16 @@ public abstract class JunctionTestSuiteWithEmbeddedDB extends GuicyKillbillTestS
.build();
}
+ protected Account createAccount(final AccountData accountData) throws AccountApiException {
+ final Account account = accountApi.createAccount(accountData, callContext);
+
+ final Long accountRecordId = nonEntityDao.retrieveRecordIdFromObject(account.getId(), ObjectType.ACCOUNT, controlCacheDispatcher.getCacheController(CacheType.RECORD_ID));
+ internalCallContext.setAccountRecordId(accountRecordId);
+ internalCallContext.setReferenceDateTimeZone(account.getTimeZone());
+
+ return account;
+ }
+
protected void assertListenerStatus() {
testListener.assertListenerStatus();
}
diff --git a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultInternalBillingApi.java b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultInternalBillingApi.java
index d413692..d79b19d 100644
--- a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultInternalBillingApi.java
+++ b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultInternalBillingApi.java
@@ -54,8 +54,7 @@ public class TestDefaultInternalBillingApi extends JunctionTestSuiteWithEmbedded
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
- final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+ final Account account = createAccount(getAccountData(7));
testListener.pushExpectedEvent(NextEvent.CREATE);
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
@@ -191,8 +190,7 @@ public class TestDefaultInternalBillingApi extends JunctionTestSuiteWithEmbedded
final LocalDate initialDate = new LocalDate(2013, 8, 7);
clock.setDay(initialDate);
- final Account account = accountApi.createAccount(getAccountData(7), callContext);
- final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
+ final Account account = createAccount(getAccountData(7));
testListener.pushExpectedEvent(NextEvent.CREATE);
final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPaymentLeavingStateCallback.java b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPaymentLeavingStateCallback.java
index 1717dc4..106c179 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPaymentLeavingStateCallback.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPaymentLeavingStateCallback.java
@@ -1,8 +1,8 @@
/*
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Groupon licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -121,7 +121,7 @@ public class TestPaymentLeavingStateCallback extends PaymentTestSuiteWithEmbedde
transactions.get(0).getId(), TransactionStatus.SUCCESS, BigDecimal.ONE, Currency.BRL,
"foo", "bar", internalCallContext);
- final InternalCallContext internalCallContextForOtherAccount = new InternalCallContext(paymentStateContext.getInternalCallContext(), 123L);
+ internalCallContext.setAccountRecordId(123L);
paymentStateContext = new PaymentStateContext(true,
paymentId,
@@ -137,7 +137,7 @@ public class TestPaymentLeavingStateCallback extends PaymentTestSuiteWithEmbedde
paymentStateContext.shouldLockAccountAndDispatch(),
paymentStateContext.getOverridePluginOperationResult(),
paymentStateContext.getProperties(),
- internalCallContextForOtherAccount,
+ internalCallContext,
callContext);
callback.leavingState(state);
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentProcessor.java b/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentProcessor.java
index caa98f1..19f10b9 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentProcessor.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/TestPaymentProcessor.java
@@ -1,8 +1,8 @@
/*
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Groupon licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -27,7 +27,6 @@ import java.util.concurrent.Callable;
import javax.annotation.Nullable;
import org.killbill.billing.account.api.Account;
-import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.events.BusInternalEvent;
import org.killbill.billing.events.PaymentErrorInternalEvent;
@@ -63,7 +62,6 @@ public class TestPaymentProcessor extends PaymentTestSuiteWithEmbeddedDB {
@BeforeMethod(groups = "slow")
public void setUp() throws Exception {
account = testHelper.createTestAccount(UUID.randomUUID().toString(), true);
- internalCallContext = new InternalCallContext(internalCallContext, 1L);
paymentBusListener = new PaymentBusListener();
eventBus.register(paymentBusListener);
diff --git a/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java b/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java
index 13e8891..ac1860e 100644
--- a/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java
+++ b/payment/src/test/java/org/killbill/billing/payment/dao/TestDefaultPaymentDao.java
@@ -1,8 +1,8 @@
/*
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Groupon licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -21,6 +21,7 @@ import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;
+import org.joda.time.DateTimeZone;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.payment.PaymentTestSuiteWithEmbeddedDB;
@@ -42,21 +43,21 @@ public class TestDefaultPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
public void testPaymentCRUDForAccount(final UUID accountId, final int accountNb) {
// We need to create specific call contexts to make the account_record_id magic work
- final InternalCallContext accountCallContext = new InternalCallContext(internalCallContext, (long) accountNb);
+ internalCallContext.setAccountRecordId((long) accountNb);
final PaymentModelDao specifiedFirstPaymentModelDao = generatePaymentModelDao(accountId);
final PaymentTransactionModelDao specifiedFirstPaymentTransactionModelDao = generatePaymentTransactionModelDao(specifiedFirstPaymentModelDao.getId());
// Create and verify the payment and transaction
- final PaymentModelDao firstPaymentModelDao = paymentDao.insertPaymentWithFirstTransaction(specifiedFirstPaymentModelDao, specifiedFirstPaymentTransactionModelDao, accountCallContext);
+ final PaymentModelDao firstPaymentModelDao = paymentDao.insertPaymentWithFirstTransaction(specifiedFirstPaymentModelDao, specifiedFirstPaymentTransactionModelDao, internalCallContext);
verifyPayment(firstPaymentModelDao, specifiedFirstPaymentModelDao);
- verifyPaymentAndTransactions(accountCallContext, specifiedFirstPaymentModelDao, specifiedFirstPaymentTransactionModelDao);
+ verifyPaymentAndTransactions(internalCallContext, specifiedFirstPaymentModelDao, specifiedFirstPaymentTransactionModelDao);
// Create a second transaction for the same payment
final PaymentTransactionModelDao specifiedSecondPaymentTransactionModelDao = generatePaymentTransactionModelDao(specifiedFirstPaymentModelDao.getId());
- final PaymentTransactionModelDao secondTransactionModelDao = paymentDao.updatePaymentWithNewTransaction(specifiedFirstPaymentTransactionModelDao.getPaymentId(), specifiedSecondPaymentTransactionModelDao, accountCallContext);
+ final PaymentTransactionModelDao secondTransactionModelDao = paymentDao.updatePaymentWithNewTransaction(specifiedFirstPaymentTransactionModelDao.getPaymentId(), specifiedSecondPaymentTransactionModelDao, internalCallContext);
verifyPaymentTransaction(secondTransactionModelDao, specifiedSecondPaymentTransactionModelDao);
- verifyPaymentAndTransactions(accountCallContext, specifiedFirstPaymentModelDao, specifiedFirstPaymentTransactionModelDao, specifiedSecondPaymentTransactionModelDao);
+ verifyPaymentAndTransactions(internalCallContext, specifiedFirstPaymentModelDao, specifiedFirstPaymentTransactionModelDao, specifiedSecondPaymentTransactionModelDao);
// Update the latest transaction
final BigDecimal processedAmount = new BigDecimal("902341.23232");
@@ -74,9 +75,9 @@ public class TestDefaultPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
processedCurrency,
gatewayErrorCode,
gatewayErrorMsg,
- accountCallContext);
+ internalCallContext);
- final PaymentTransactionModelDao updatedSecondPaymentTransactionModelDao = paymentDao.getPaymentTransaction(specifiedSecondPaymentTransactionModelDao.getId(), accountCallContext);
+ final PaymentTransactionModelDao updatedSecondPaymentTransactionModelDao = paymentDao.getPaymentTransaction(specifiedSecondPaymentTransactionModelDao.getId(), internalCallContext);
Assert.assertEquals(updatedSecondPaymentTransactionModelDao.getTransactionStatus(), TransactionStatus.PAYMENT_FAILURE);
Assert.assertEquals(updatedSecondPaymentTransactionModelDao.getGatewayErrorMsg(), gatewayErrorMsg);
Assert.assertEquals(updatedSecondPaymentTransactionModelDao.getGatewayErrorMsg(), gatewayErrorMsg);
@@ -86,14 +87,14 @@ public class TestDefaultPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
final PaymentModelDao paymentModelDao = generatePaymentModelDao(accountId);
final PaymentTransactionModelDao paymentTransactionModelDao = generatePaymentTransactionModelDao(paymentModelDao.getId());
- final PaymentModelDao insertedPaymentModelDao = paymentDao.insertPaymentWithFirstTransaction(paymentModelDao, paymentTransactionModelDao, accountCallContext);
+ final PaymentModelDao insertedPaymentModelDao = paymentDao.insertPaymentWithFirstTransaction(paymentModelDao, paymentTransactionModelDao, internalCallContext);
verifyPayment(insertedPaymentModelDao, paymentModelDao);
// Verify search APIs
Assert.assertEquals(ImmutableList.<PaymentModelDao>copyOf(paymentDao.searchPayments(paymentModelDao.getPaymentMethodId().toString(), 0L, 100L, internalCallContext).iterator()).size(), 1);
Assert.assertEquals(ImmutableList.<PaymentModelDao>copyOf(paymentDao.searchPayments(paymentModelDao.getExternalKey(), 0L, 100L, internalCallContext).iterator()).size(), 1);
}
- Assert.assertEquals(paymentDao.getPaymentsForAccount(specifiedFirstPaymentModelDao.getAccountId(), accountCallContext).size(), 4);
+ Assert.assertEquals(paymentDao.getPaymentsForAccount(specifiedFirstPaymentModelDao.getAccountId(), internalCallContext).size(), 4);
// Verify search APIs
Assert.assertEquals(ImmutableList.<PaymentModelDao>copyOf(paymentDao.searchPayments(accountId.toString(), 0L, 100L, internalCallContext).iterator()).size(), 4);
diff --git a/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java b/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java
index 94d024a..d75b656 100644
--- a/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java
+++ b/payment/src/test/java/org/killbill/billing/payment/dao/TestPaymentDao.java
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -23,6 +25,7 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.payment.PaymentTestSuiteWithEmbeddedDB;
@@ -286,16 +289,14 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
clock.addDays(1);
final DateTime newTime = clock.getUTCNow();
- final InternalCallContext internalCallContextWithNewTime = new InternalCallContext(InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID, 1687L, UUID.randomUUID(),
- UUID.randomUUID().toString(), CallOrigin.TEST,
- UserType.TEST, "Testing", "This is a test",
- newTime, newTime);
+ internalCallContext.setCreatedDate(newTime);
+ internalCallContext.setUpdatedDate(newTime);
final PaymentTransactionModelDao transaction4 = new PaymentTransactionModelDao(initialTime, initialTime, null, transactionExternalKey4,
paymentModelDao.getId(), TransactionType.AUTHORIZE, newTime,
TransactionStatus.PENDING, BigDecimal.TEN, Currency.AED,
"pending", "");
- paymentDao.updatePaymentWithNewTransaction(paymentModelDao.getId(), transaction4, internalCallContextWithNewTime);
+ paymentDao.updatePaymentWithNewTransaction(paymentModelDao.getId(), transaction4, internalCallContext);
final List<PaymentTransactionModelDao> result = getPendingTransactions(paymentModelDao.getId());
Assert.assertEquals(result.size(), 3);
@@ -363,17 +364,10 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
TransactionStatus.UNKNOWN, BigDecimal.TEN, Currency.AED,
"unknown", "");
- final InternalCallContext context1 = new InternalCallContext(1L,
- 1L,
- internalCallContext.getUserToken(),
- internalCallContext.getCreatedBy(),
- internalCallContext.getCallOrigin(),
- internalCallContext.getContextUserType(),
- internalCallContext.getReasonCode(),
- internalCallContext.getComments(),
- createdDate1,
- createdDate1);
- paymentDao.insertPaymentWithFirstTransaction(paymentModelDao1, transaction1, context1);
+ internalCallContext.setAccountRecordId(1L);
+ internalCallContext.setCreatedDate(createdDate1);
+ internalCallContext.setUpdatedDate(createdDate1);
+ paymentDao.insertPaymentWithFirstTransaction(paymentModelDao1, transaction1, internalCallContext);
// Right after createdAfterDate, so it should be returned
final DateTime createdDate2 = createdAfterDate.plusHours(1);
@@ -384,17 +378,10 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
TransactionStatus.UNKNOWN, BigDecimal.TEN, Currency.AED,
"unknown", "");
- final InternalCallContext context2 = new InternalCallContext(2L,
- 2L,
- internalCallContext.getUserToken(),
- internalCallContext.getCreatedBy(),
- internalCallContext.getCallOrigin(),
- internalCallContext.getContextUserType(),
- internalCallContext.getReasonCode(),
- internalCallContext.getComments(),
- createdDate2,
- createdDate2);
- paymentDao.insertPaymentWithFirstTransaction(paymentModelDao2, transaction2, context2);
+ internalCallContext.setAccountRecordId(2L);
+ internalCallContext.setCreatedDate(createdDate2);
+ internalCallContext.setUpdatedDate(createdDate2);
+ paymentDao.insertPaymentWithFirstTransaction(paymentModelDao2, transaction2, internalCallContext);
// Right before createdBeforeDate, so it should be returned
final DateTime createdDate3 = createdBeforeDate.minusDays(1);
@@ -405,18 +392,10 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
TransactionStatus.UNKNOWN, BigDecimal.TEN, Currency.AED,
"unknown", "");
- final InternalCallContext context3 = new InternalCallContext(3L,
- 3L,
- internalCallContext.getUserToken(),
- internalCallContext.getCreatedBy(),
- internalCallContext.getCallOrigin(),
- internalCallContext.getContextUserType(),
- internalCallContext.getReasonCode(),
- internalCallContext.getComments(),
- createdDate3,
- createdDate3);
-
- paymentDao.insertPaymentWithFirstTransaction(paymentModelDao3, transaction3, context3);
+ internalCallContext.setAccountRecordId(3L);
+ internalCallContext.setCreatedDate(createdDate3);
+ internalCallContext.setUpdatedDate(createdDate3);
+ paymentDao.insertPaymentWithFirstTransaction(paymentModelDao3, transaction3, internalCallContext);
// Right before createdBeforeDate but with a SUCCESS state so it should NOT be returned
final DateTime createdDate4 = createdBeforeDate.minusDays(1);
@@ -427,18 +406,10 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
TransactionStatus.UNKNOWN, BigDecimal.TEN, Currency.AED,
"unknown", "");
- final InternalCallContext context4 = new InternalCallContext(4L,
- 4L,
- internalCallContext.getUserToken(),
- internalCallContext.getCreatedBy(),
- internalCallContext.getCallOrigin(),
- internalCallContext.getContextUserType(),
- internalCallContext.getReasonCode(),
- internalCallContext.getComments(),
- createdDate4,
- createdDate4);
-
- paymentDao.insertPaymentWithFirstTransaction(paymentModelDao4, transaction4, context4);
+ internalCallContext.setAccountRecordId(4L);
+ internalCallContext.setCreatedDate(createdDate4);
+ internalCallContext.setUpdatedDate(createdDate4);
+ paymentDao.insertPaymentWithFirstTransaction(paymentModelDao4, transaction4, internalCallContext);
// Right after createdBeforeDate, so it should NOT be returned
final DateTime createdDate5 = createdBeforeDate.plusDays(1);
@@ -449,18 +420,10 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
TransactionStatus.UNKNOWN, BigDecimal.TEN, Currency.AED,
"unknown", "");
- final InternalCallContext context5 = new InternalCallContext(5L,
- 5L,
- internalCallContext.getUserToken(),
- internalCallContext.getCreatedBy(),
- internalCallContext.getCallOrigin(),
- internalCallContext.getContextUserType(),
- internalCallContext.getReasonCode(),
- internalCallContext.getComments(),
- createdDate5,
- createdDate5);
-
- paymentDao.insertPaymentWithFirstTransaction(paymentModelDao5, transaction5, context5);
+ internalCallContext.setAccountRecordId(5L);
+ internalCallContext.setCreatedDate(createdDate5);
+ internalCallContext.setUpdatedDate(createdDate5);
+ paymentDao.insertPaymentWithFirstTransaction(paymentModelDao5, transaction5, internalCallContext);
final String[] errorStates = {"AUTH_ERRORED", "CAPTURE_ERRORED", "REFUND_ERRORED", "CREDIT_ERRORED"};
final List<PaymentModelDao> result = paymentDao.getPaymentsByStatesAcrossTenants(errorStates, createdBeforeDate, createdAfterDate, 10);
@@ -480,17 +443,10 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
TransactionStatus.UNKNOWN, BigDecimal.TEN, Currency.AED,
"unknown", "");
- final InternalCallContext context1 = new InternalCallContext(1L,
- 1L,
- internalCallContext.getUserToken(),
- internalCallContext.getCreatedBy(),
- internalCallContext.getCallOrigin(),
- internalCallContext.getContextUserType(),
- internalCallContext.getReasonCode(),
- internalCallContext.getComments(),
- createdDate1,
- createdDate1);
- paymentDao.insertPaymentWithFirstTransaction(paymentModelDao1, transaction1, context1);
+ internalCallContext.setAccountRecordId(1L);
+ internalCallContext.setCreatedDate(createdDate1);
+ internalCallContext.setUpdatedDate(createdDate1);
+ paymentDao.insertPaymentWithFirstTransaction(paymentModelDao1, transaction1, internalCallContext);
}
final Pagination<PaymentTransactionModelDao> result = paymentDao.getByTransactionStatusAcrossTenants(ImmutableList.of(TransactionStatus.UNKNOWN), clock.getUTCNow(), createdDate1, 0L, new Long(NB_ENTRIES));
@@ -529,29 +485,15 @@ public class TestPaymentDao extends PaymentTestSuiteWithEmbeddedDB {
UUID.randomUUID(), transactionExternalKey2, TransactionType.AUTHORIZE, stateName, BigDecimal.ONE, Currency.USD,
ImmutableList.<String>of(pluginName), null);
- final InternalCallContext context1 = new InternalCallContext(1L,
- 1L,
- internalCallContext.getUserToken(),
- internalCallContext.getCreatedBy(),
- internalCallContext.getCallOrigin(),
- internalCallContext.getContextUserType(),
- internalCallContext.getReasonCode(),
- internalCallContext.getComments(),
- createdAfterDate,
- createdAfterDate);
- paymentDao.insertPaymentAttemptWithProperties(attempt1, context1);
-
- final InternalCallContext context2 = new InternalCallContext(2L,
- 2L,
- internalCallContext.getUserToken(),
- internalCallContext.getCreatedBy(),
- internalCallContext.getCallOrigin(),
- internalCallContext.getContextUserType(),
- internalCallContext.getReasonCode(),
- internalCallContext.getComments(),
- createdAfterDate,
- createdAfterDate);
- paymentDao.insertPaymentAttemptWithProperties(attempt2, context2);
+ internalCallContext.setAccountRecordId(1L);
+ internalCallContext.setCreatedDate(createdAfterDate);
+ internalCallContext.setUpdatedDate(createdAfterDate);
+ paymentDao.insertPaymentAttemptWithProperties(attempt1, internalCallContext);
+
+ internalCallContext.setAccountRecordId(2L);
+ internalCallContext.setCreatedDate(createdAfterDate);
+ internalCallContext.setUpdatedDate(createdAfterDate);
+ paymentDao.insertPaymentAttemptWithProperties(attempt2, internalCallContext);
final Pagination<PaymentAttemptModelDao> result = paymentDao.getPaymentAttemptsByStateAcrossTenants(stateName, createdBeforeDate, 0L, 2L);
Assert.assertEquals(result.getTotalNbRecords().longValue(), 2L);
diff --git a/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteWithEmbeddedDB.java b/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteWithEmbeddedDB.java
index 14072c3..dc7b36f 100644
--- a/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteWithEmbeddedDB.java
+++ b/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteWithEmbeddedDB.java
@@ -34,6 +34,7 @@ import org.killbill.billing.payment.plugin.api.PaymentPluginApi;
import org.killbill.billing.payment.provider.MockPaymentProviderPlugin;
import org.killbill.billing.platform.api.KillbillConfigSource;
import org.killbill.billing.util.config.PaymentConfig;
+import org.killbill.billing.util.dao.NonEntityDao;
import org.killbill.bus.api.PersistentBus;
import org.killbill.commons.profiling.Profiling;
import org.testng.annotations.AfterMethod;
@@ -73,6 +74,8 @@ public abstract class PaymentTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
protected TestPaymentHelper testHelper;
@Inject
protected PaymentExecutors paymentExecutors;
+ @Inject
+ protected NonEntityDao nonEntityDao;
@Override
protected KillbillConfigSource getConfigSource() {
diff --git a/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java b/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java
index 0ba6343..ccf0a1c 100644
--- a/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java
+++ b/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java
@@ -288,7 +288,6 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
testListener.assertListenerStatus();
// Artificially move the transaction status to UNKNOWN
- final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
final String paymentStateName = paymentSMHelper.getErroredStateForTransaction(TransactionType.AUTHORIZE).toString();
testListener.pushExpectedEvent(NextEvent.PAYMENT_PLUGIN_ERROR);
paymentDao.updatePaymentAndTransactionOnCompletion(account.getId(), payment.getId(), TransactionType.AUTHORIZE, paymentStateName, paymentStateName,
@@ -321,7 +320,6 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
testListener.assertListenerStatus();
// Artificially move the transaction status to UNKNOWN
- final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
final String paymentStateName = paymentSMHelper.getErroredStateForTransaction(TransactionType.AUTHORIZE).toString();
testListener.pushExpectedEvent(NextEvent.PAYMENT_PLUGIN_ERROR);
paymentDao.updatePaymentAndTransactionOnCompletion(account.getId(), payment.getId(), TransactionType.AUTHORIZE, paymentStateName, paymentStateName,
@@ -367,8 +365,6 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
final Payment payment = paymentApi.getPaymentByExternalKey(paymentExternalKey, false, ImmutableList.<PluginProperty>of(), callContext);
// Artificially move the transaction status to UNKNOWN
- final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-
final String paymentStateName = paymentSMHelper.getErroredStateForTransaction(TransactionType.AUTHORIZE).toString();
testListener.pushExpectedEvent(NextEvent.PAYMENT_PLUGIN_ERROR);
paymentDao.updatePaymentAndTransactionOnCompletion(account.getId(), payment.getId(), TransactionType.AUTHORIZE, paymentStateName, paymentStateName,
@@ -401,8 +397,6 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
transactionExternalKey, ImmutableList.<PluginProperty>of(), callContext);
testListener.assertListenerStatus();
- final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-
// Artificially move the transaction status to PENDING
final String paymentStateName = paymentSMHelper.getPendingStateForTransaction(TransactionType.AUTHORIZE).toString();
testListener.pushExpectedEvent(NextEvent.PAYMENT);
@@ -434,8 +428,6 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
transactionExternalKey, ImmutableList.<PluginProperty>of(), callContext);
testListener.assertListenerStatus();
- final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
-
// Artificially move the transaction status to PENDING AND update state on the plugin as well
final List<PaymentTransactionInfoPlugin> paymentTransactions = mockPaymentProviderPlugin.getPaymentInfo(account.getId(), payment.getId(), ImmutableList.<PluginProperty>of(), callContext);
final PaymentTransactionInfoPlugin oTx = paymentTransactions.remove(0);
diff --git a/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java b/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java
index 2aaa167..f32c37e 100644
--- a/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java
+++ b/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java
@@ -21,11 +21,13 @@ package org.killbill.billing.payment;
import java.util.UUID;
import org.joda.time.LocalDate;
+import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.Account;
import org.killbill.billing.account.api.AccountInternalApi;
import org.killbill.billing.account.api.AccountUserApi;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.callcontext.MutableInternalCallContext;
import org.killbill.billing.catalog.api.Currency;
import org.killbill.billing.dao.MockNonEntityDao;
import org.killbill.billing.events.InvoiceCreationInternalEvent;
@@ -38,7 +40,10 @@ import org.killbill.billing.payment.api.PaymentMethodPlugin;
import org.killbill.billing.payment.api.PluginProperty;
import org.killbill.billing.payment.provider.DefaultNoOpPaymentMethodPlugin;
import org.killbill.billing.payment.provider.MockPaymentProviderPlugin;
+import org.killbill.billing.util.cache.Cachable.CacheType;
+import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.callcontext.CallContext;
+import org.killbill.billing.util.dao.NonEntityDao;
import org.killbill.bus.api.PersistentBus;
import org.killbill.bus.api.PersistentBus.EventBusException;
import org.killbill.clock.Clock;
@@ -55,8 +60,10 @@ public class TestPaymentHelper {
protected PaymentApi paymentApi;
private final PersistentBus eventBus;
private final Clock clock;
+ private final NonEntityDao nonEntityDao;
private final MockNonEntityDao mockNonEntityDao;
- private final InternalCallContext internalCallContext;
+ private final CacheControllerDispatcher cacheControllerDispatcher;
+ private final MutableInternalCallContext internalCallContext;
private final CallContext context;
@Inject
@@ -66,8 +73,10 @@ public class TestPaymentHelper {
final PaymentApi paymentApi,
final PersistentBus eventBus,
final Clock clock,
+ final NonEntityDao nonEntityDao,
final MockNonEntityDao mockNonEntityDao,
- final InternalCallContext internalCallContext,
+ final CacheControllerDispatcher cacheControllerDispatcher,
+ final MutableInternalCallContext internalCallContext,
final CallContext context) {
this.accountApi = accountApi;
this.eventBus = eventBus;
@@ -75,7 +84,9 @@ public class TestPaymentHelper {
this.invoiceApi = invoiceApi;
this.paymentApi = paymentApi;
this.clock = clock;
+ this.nonEntityDao = nonEntityDao;
this.mockNonEntityDao = mockNonEntityDao;
+ this.cacheControllerDispatcher = cacheControllerDispatcher;
this.internalCallContext = internalCallContext;
this.context = context;
}
@@ -140,8 +151,13 @@ public class TestPaymentHelper {
mockNonEntityDao.addAccountRecordIdMapping(account.getId(), internalCallContext);
} else {
account = accountApi.createAccount(accountData, context);
+
+ final Long accountRecordId = nonEntityDao.retrieveRecordIdFromObject(account.getId(), ObjectType.ACCOUNT, cacheControllerDispatcher.getCacheController(CacheType.RECORD_ID));
+ internalCallContext.setAccountRecordId(accountRecordId);
}
+ internalCallContext.setReferenceDateTimeZone(account.getTimeZone());
+
if (addPaymentMethod) {
final PaymentMethodPlugin pm = new DefaultNoOpPaymentMethodPlugin(UUID.randomUUID().toString(), true, null);
account = addTestPaymentMethod(account, pm);
diff --git a/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java b/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
index f289f57..b5462f5 100644
--- a/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
+++ b/payment/src/test/java/org/killbill/billing/payment/TestRetryService.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project 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
@@ -75,7 +75,6 @@ public class TestRetryService extends PaymentTestSuiteNoDB {
mockPaymentProviderPlugin.clear();
retryService.initialize();
retryService.start();
-
}
@Override
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/server/log/ServerTestSuiteNoDB.java b/profiles/killbill/src/test/java/org/killbill/billing/server/log/ServerTestSuiteNoDB.java
index f2328af..7bdf408 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/server/log/ServerTestSuiteNoDB.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/server/log/ServerTestSuiteNoDB.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project 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
@@ -17,7 +17,18 @@
package org.killbill.billing.server.log;
+import org.killbill.billing.GuicyKillbillTestModule;
import org.killbill.billing.GuicyKillbillTestSuiteNoDB;
+import org.testng.annotations.BeforeClass;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
public abstract class ServerTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
+
+ @BeforeClass(groups = "fast")
+ protected void beforeClass() throws Exception {
+ final Injector injector = Guice.createInjector(new GuicyKillbillTestModule(configSource));
+ injector.injectMembers(this);
+ }
}
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/api/TestEventJson.java b/subscription/src/test/java/org/killbill/billing/subscription/api/TestEventJson.java
index 90b3822..cee8006 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/api/TestEventJson.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/api/TestEventJson.java
@@ -1,7 +1,9 @@
/*
* Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -19,16 +21,15 @@ package org.killbill.billing.subscription.api;
import java.util.UUID;
import org.joda.time.DateTime;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import org.killbill.billing.GuicyKillbillTestSuiteNoDB;
import org.killbill.billing.entitlement.api.Entitlement.EntitlementState;
-import org.killbill.billing.subscription.api.user.DefaultEffectiveSubscriptionEvent;
import org.killbill.billing.events.EffectiveSubscriptionInternalEvent;
+import org.killbill.billing.subscription.SubscriptionTestSuiteNoDB;
+import org.killbill.billing.subscription.api.user.DefaultEffectiveSubscriptionEvent;
import org.killbill.billing.util.jackson.ObjectMapper;
+import org.testng.Assert;
+import org.testng.annotations.Test;
-public class TestEventJson extends GuicyKillbillTestSuiteNoDB {
+public class TestEventJson extends SubscriptionTestSuiteNoDB {
private final ObjectMapper mapper = new ObjectMapper();
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java b/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java
index 6483634..721183d 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestDefaultSubscriptionTransferApi.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project 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
@@ -22,6 +22,7 @@ import java.util.List;
import java.util.UUID;
import org.joda.time.DateTime;
+import org.killbill.billing.account.api.AccountInternalApi;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
@@ -64,10 +65,9 @@ public class TestDefaultSubscriptionTransferApi extends SubscriptionTestSuiteNoD
super.beforeMethod();
final NonEntityDao nonEntityDao = Mockito.mock(NonEntityDao.class);
final SubscriptionDao dao = Mockito.mock(SubscriptionDao.class);
- final CatalogService catalogService = new MockCatalogService(new MockCatalog(), cacheControllerDispatcher);
+ final CatalogService catalogService = new MockCatalogService(new MockCatalog(), cacheControllerDispatcher);
final SubscriptionBaseApiService apiService = Mockito.mock(SubscriptionBaseApiService.class);
final SubscriptionBaseTimelineApi timelineApi = Mockito.mock(SubscriptionBaseTimelineApi.class);
- final InternalCallContextFactory internalCallContextFactory = new InternalCallContextFactory(clock, nonEntityDao, new CacheControllerDispatcher());
transferApi = new DefaultSubscriptionBaseTransferApi(clock, dao, timelineApi, catalogService, apiService, internalCallContextFactory);
}
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java b/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java
index 4751213..cce6cb0 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java
@@ -61,12 +61,14 @@ public class TestTransfer extends SubscriptionTestSuiteWithEmbeddedDB {
// Note: this will cleanup all tables
super.beforeMethod();
- final AccountData accountData = subscriptionTestInitializer.initAccountData();
- final Account account = accountUserApi.createAccount(accountData, callContext);
- newAccountId = account.getId();
final AccountData accountData2 = subscriptionTestInitializer.initAccountData();
- final Account account2 = accountUserApi.createAccount(accountData2, callContext);
+ final Account account2 = createAccount(accountData2);
finalNewAccountId = account2.getId();
+
+ // internal context will be configured for newAccountId
+ final AccountData accountData = subscriptionTestInitializer.initAccountData();
+ final Account account = createAccount(accountData);
+ newAccountId = account.getId();
}
@Test(groups = "slow")
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleNoDB.java b/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleNoDB.java
index 1bb0955..571f6ff 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleNoDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleNoDB.java
@@ -20,6 +20,7 @@ package org.killbill.billing.subscription.glue;
import org.killbill.billing.GuicyKillbillTestNoDBModule;
import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.mock.glue.MockAccountModule;
import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
import org.killbill.billing.platform.api.KillbillConfigSource;
import org.killbill.billing.subscription.engine.dao.MockSubscriptionDaoMemory;
@@ -40,8 +41,7 @@ public class TestDefaultSubscriptionModuleNoDB extends TestDefaultSubscriptionMo
@Override
protected void configure() {
install(new GuicyKillbillTestNoDBModule(configSource));
-
- bind(AccountUserApi.class).toInstance(Mockito.mock(AccountUserApi.class));
+ install(new MockAccountModule(configSource));
super.configure();
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
index 9b74d30..c57adde 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project 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
@@ -41,6 +41,7 @@ import org.killbill.billing.subscription.engine.dao.MockSubscriptionDaoMemory;
import org.killbill.billing.subscription.engine.dao.SubscriptionDao;
import org.killbill.billing.subscription.glue.TestDefaultSubscriptionModuleNoDB;
import org.killbill.billing.util.cache.CacheControllerDispatcher;
+import org.killbill.billing.util.callcontext.InternalCallContextFactory;
import org.killbill.billing.util.config.SubscriptionConfig;
import org.killbill.clock.ClockMock;
import org.mockito.Mockito;
@@ -101,6 +102,9 @@ public class SubscriptionTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
@Inject
protected MockNonEntityDao mockNonEntityDao;
+ @Inject
+ protected InternalCallContextFactory internalCallContextFactory;
+
protected Catalog catalog;
protected AccountData accountData;
protected SubscriptionBaseBundle bundle;
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
index e335d8f..0dc88d7 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
@@ -21,7 +21,9 @@ package org.killbill.billing.subscription;
import javax.inject.Inject;
import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
+import org.killbill.billing.ObjectType;
import org.killbill.billing.account.api.Account;
+import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountData;
import org.killbill.billing.account.api.AccountUserApi;
import org.killbill.billing.api.TestApiListener;
@@ -38,7 +40,9 @@ import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
import org.killbill.billing.subscription.api.user.TestSubscriptionHelper;
import org.killbill.billing.subscription.engine.dao.SubscriptionDao;
import org.killbill.billing.subscription.glue.TestDefaultSubscriptionModuleWithEmbeddedDB;
+import org.killbill.billing.util.cache.Cachable.CacheType;
import org.killbill.billing.util.config.SubscriptionConfig;
+import org.killbill.billing.util.dao.NonEntityDao;
import org.killbill.clock.ClockMock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -88,6 +92,9 @@ public class SubscriptionTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteW
@Inject
protected SubscriptionTestInitializer subscriptionTestInitializer;
+ @Inject
+ protected NonEntityDao nonEntityDao;
+
protected Catalog catalog;
protected AccountData accountData;
protected SubscriptionBaseBundle bundle;
@@ -111,7 +118,7 @@ public class SubscriptionTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteW
this.catalog = subscriptionTestInitializer.initCatalog(catalogService, internalCallContext);
this.accountData = subscriptionTestInitializer.initAccountData();
- final Account account = accountUserApi.createAccount(accountData, callContext);
+ final Account account = createAccount(accountData);
this.bundle = subscriptionTestInitializer.initBundle(account.getId(), subscriptionInternalApi, internalCallContext);
// Make sure we start with a clean state
@@ -126,6 +133,16 @@ public class SubscriptionTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteW
subscriptionTestInitializer.stopTestFramework(testListener, busService, subscriptionBaseService);
}
+ protected Account createAccount(final AccountData accountData) throws AccountApiException {
+ final Account account = accountUserApi.createAccount(accountData, callContext);
+
+ final Long accountRecordId = nonEntityDao.retrieveRecordIdFromObject(account.getId(), ObjectType.ACCOUNT, controlCacheDispatcher.getCacheController(CacheType.RECORD_ID));
+ internalCallContext.setAccountRecordId(accountRecordId);
+ internalCallContext.setReferenceDateTimeZone(account.getTimeZone());
+
+ return account;
+ }
+
protected void assertListenerStatus() {
testListener.assertListenerStatus();
}
diff --git a/tenant/src/main/java/org/killbill/billing/tenant/api/TenantCacheInvalidation.java b/tenant/src/main/java/org/killbill/billing/tenant/api/TenantCacheInvalidation.java
index 02ac812..a49f041 100644
--- a/tenant/src/main/java/org/killbill/billing/tenant/api/TenantCacheInvalidation.java
+++ b/tenant/src/main/java/org/killbill/billing/tenant/api/TenantCacheInvalidation.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project 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
@@ -178,7 +178,7 @@ public class TenantCacheInvalidation {
if (tenantKeyAndCookie != null) {
final CacheInvalidationCallback callback = parent.getCacheInvalidation(tenantKeyAndCookie.getTenantKey());
if (callback != null) {
- final InternalTenantContext tenantContext = new InternalTenantContext(cur.getTenantRecordId(), null);
+ final InternalTenantContext tenantContext = new InternalTenantContext(cur.getTenantRecordId());
callback.invalidateCache(tenantKeyAndCookie.getTenantKey(), tenantKeyAndCookie.getCookie(), tenantContext);
final Long tenantKvsTargetRecordId = cur.getTargetRecordId();
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 3c1c575..f8fc8a0 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
@@ -102,7 +102,7 @@ public class DefaultTenantUserApi implements TenantUserApi {
@Override
public Tenant getTenantById(final UUID id) throws TenantApiException {
// TODO - API cleanup?
- final TenantModelDao tenant = tenantDao.getById(id, new InternalTenantContext(null, null));
+ final TenantModelDao tenant = tenantDao.getById(id, new InternalTenantContext(null));
if (tenant == null) {
throw new TenantApiException(ErrorCode.TENANT_DOES_NOT_EXIST_FOR_ID, id);
}
diff --git a/tenant/src/test/java/org/killbill/billing/tenant/dao/TestNoCachingTenantBroadcastDao.java b/tenant/src/test/java/org/killbill/billing/tenant/dao/TestNoCachingTenantBroadcastDao.java
index 4d6a43a..8796587 100644
--- a/tenant/src/test/java/org/killbill/billing/tenant/dao/TestNoCachingTenantBroadcastDao.java
+++ b/tenant/src/test/java/org/killbill/billing/tenant/dao/TestNoCachingTenantBroadcastDao.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project 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
@@ -20,10 +20,7 @@ package org.killbill.billing.tenant.dao;
import java.util.List;
import java.util.UUID;
-import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.tenant.TenantTestSuiteWithEmbeddedDb;
-import org.killbill.billing.util.callcontext.CallOrigin;
-import org.killbill.billing.util.callcontext.UserType;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -33,13 +30,15 @@ public class TestNoCachingTenantBroadcastDao extends TenantTestSuiteWithEmbedded
public void testBasic() throws Exception {
final TenantBroadcastModelDao model = new TenantBroadcastModelDao(0L, "foo", UUID.randomUUID());
- final InternalCallContext context79 = createContext(79L);
- tenantBroadcastDao.create(model, context79);
+ internalCallContext.setTenantRecordId(79L);
+ tenantBroadcastDao.create(model, internalCallContext);
- final TenantBroadcastModelDao result1 = tenantBroadcastDao.getById(model.getId(), context79);
+ final TenantBroadcastModelDao result1 = tenantBroadcastDao.getById(model.getId(), internalCallContext);
Assert.assertEquals(result1.getTenantRecordId(), new Long(79L));
Assert.assertEquals(result1.getType(), "foo");
+ internalCallContext.reset();
+
final TenantBroadcastModelDao resultNull = tenantBroadcastDao.getById(model.getId(), internalCallContext);
Assert.assertNull(resultNull);
@@ -50,15 +49,15 @@ public class TestNoCachingTenantBroadcastDao extends TenantTestSuiteWithEmbedded
@Test(groups = "slow")
public void testLatestEntries() throws Exception {
+ internalCallContext.setTenantRecordId(81L);
- final InternalCallContext context79 = createContext(81L);
TenantBroadcastModelDao latestInsert = null;
for (int i = 0; i < 100; i++) {
final TenantBroadcastModelDao model = new TenantBroadcastModelDao(0L, "foo-" + i, UUID.randomUUID());
- tenantBroadcastDao.create(model, context79);
+ tenantBroadcastDao.create(model, internalCallContext);
latestInsert = model;
}
- final TenantBroadcastModelDao latestInsertRefreshed = tenantBroadcastDao.getById(latestInsert.getId(), context79);
+ final TenantBroadcastModelDao latestInsertRefreshed = tenantBroadcastDao.getById(latestInsert.getId(), internalCallContext);
final TenantBroadcastModelDao lastEntry = noCachingTenantBroadcastDao.getLatestEntry();
Assert.assertEquals(lastEntry.getRecordId(), latestInsertRefreshed.getRecordId());
@@ -69,17 +68,8 @@ public class TestNoCachingTenantBroadcastDao extends TenantTestSuiteWithEmbedded
Assert.assertEquals(result.size(), expectedEntries);
long i = 0;
- for (TenantBroadcastModelDao cur : result) {
+ for (final TenantBroadcastModelDao cur : result) {
Assert.assertEquals(cur.getRecordId().longValue(), (fromRecordId + i++ + 1L));
}
-
- }
-
- private InternalCallContext createContext(final Long tenantRecordId) {
- return new InternalCallContext(tenantRecordId, 0L, UUID.randomUUID(),
- UUID.randomUUID().toString(), CallOrigin.TEST,
- UserType.TEST, "Testing TestNoCachingTenantBroadcastDao", "This is a test for TestNoCachingTenantBroadcastDao",
- clock.getUTCNow(), clock.getUTCNow());
-
}
}
diff --git a/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleWithEmbeddedDB.java b/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleWithEmbeddedDB.java
index 0bae0d1..8c14902 100644
--- a/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleWithEmbeddedDB.java
+++ b/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleWithEmbeddedDB.java
@@ -19,6 +19,7 @@
package org.killbill.billing.tenant.glue;
import org.killbill.billing.GuicyKillbillTestWithEmbeddedDBModule;
+import org.killbill.billing.mock.glue.MockAccountModule;
import org.killbill.billing.platform.api.KillbillConfigSource;
import org.killbill.billing.util.glue.NonEntityDaoModule;
import org.killbill.billing.util.glue.SecurityModule;
@@ -38,5 +39,6 @@ public class TestTenantModuleWithEmbeddedDB extends TestTenantModule {
install(new NonEntityDaoModule(configSource));
install(new SecurityModule(configSource));
install(new ShiroModuleNoDB(configSource));
+ install(new MockAccountModule(configSource));
}
}
diff --git a/util/src/main/java/org/killbill/billing/util/cache/OverriddenPlanCacheLoader.java b/util/src/main/java/org/killbill/billing/util/cache/OverriddenPlanCacheLoader.java
index ab2e833..52c4a07 100644
--- a/util/src/main/java/org/killbill/billing/util/cache/OverriddenPlanCacheLoader.java
+++ b/util/src/main/java/org/killbill/billing/util/cache/OverriddenPlanCacheLoader.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project 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
@@ -17,15 +17,12 @@
package org.killbill.billing.util.cache;
-import java.util.List;
-
import javax.inject.Inject;
import javax.inject.Singleton;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.catalog.api.CatalogApiException;
import org.killbill.billing.catalog.api.StaticCatalog;
-import org.killbill.billing.tenant.api.TenantInternalApi;
import org.killbill.billing.util.cache.Cachable.CacheType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,9 +32,8 @@ public class OverriddenPlanCacheLoader extends BaseCacheLoader {
private final Logger log = LoggerFactory.getLogger(OverriddenPlanCacheLoader.class);
-
@Inject
- public OverriddenPlanCacheLoader(final TenantInternalApi tenantApi) {
+ public OverriddenPlanCacheLoader() {
super();
}
diff --git a/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java b/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java
index 1d0dfca..0460fd4 100644
--- a/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java
+++ b/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java
@@ -24,7 +24,12 @@ import javax.annotation.Nullable;
import javax.inject.Inject;
import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
import org.killbill.billing.ObjectType;
+import org.killbill.billing.account.api.AccountApiException;
+import org.killbill.billing.account.api.AccountInternalApi;
+import org.killbill.billing.account.api.ImmutableAccountData;
+import org.killbill.billing.account.api.ImmutableAccountInternalApi;
import org.killbill.billing.callcontext.InternalCallContext;
import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.util.cache.Cachable.CacheType;
@@ -32,19 +37,24 @@ import org.killbill.billing.util.cache.CacheControllerDispatcher;
import org.killbill.billing.util.dao.NonEntityDao;
import org.killbill.clock.Clock;
-import com.google.common.base.Objects;
+import com.google.common.base.MoreObjects;
// Internal contexts almost always expect accountRecordId and tenantRecordId to be populated
public class InternalCallContextFactory {
public static final long INTERNAL_TENANT_RECORD_ID = 0L;
+ private final ImmutableAccountInternalApi accountInternalApi;
private final Clock clock;
private final NonEntityDao nonEntityDao;
private final CacheControllerDispatcher cacheControllerDispatcher;
@Inject
- public InternalCallContextFactory(final Clock clock, final NonEntityDao nonEntityDao, @Nullable final CacheControllerDispatcher cacheControllerDispatcher) {
+ public InternalCallContextFactory(@Nullable final ImmutableAccountInternalApi accountInternalApi,
+ final Clock clock,
+ final NonEntityDao nonEntityDao,
+ @Nullable final CacheControllerDispatcher cacheControllerDispatcher) {
+ this.accountInternalApi = accountInternalApi;
this.clock = clock;
this.nonEntityDao = nonEntityDao;
this.cacheControllerDispatcher = cacheControllerDispatcher;
@@ -120,8 +130,11 @@ public class InternalCallContextFactory {
* @return internal tenant callcontext
*/
public InternalTenantContext createInternalTenantContext(final Long tenantRecordId, @Nullable final Long accountRecordId) {
- //Preconditions.checkNotNull(tenantRecordId, "tenantRecordId cannot be null");
- return new InternalTenantContext(tenantRecordId, accountRecordId);
+ if (accountRecordId == null) {
+ return new InternalTenantContext(tenantRecordId);
+ } else {
+ return new InternalTenantContext(tenantRecordId, accountRecordId, getAccountTimeZone(tenantRecordId, accountRecordId));
+ }
}
//
@@ -175,17 +188,16 @@ public class InternalCallContextFactory {
* This is used by notification queue and persistent bus - accountRecordId is expected to be non null
*
* @param tenantRecordId tenant record id - if null, the default tenant record id value will be used
- * @param accountRecordId account record id (cannot be null)
+ * @param accountRecordId account record id (can be null in specific use-cases, e.g. config change events in BeatrixListener)
* @param userName user name
* @param callOrigin call origin
* @param userType user type
* @param userToken user token, if any
* @return internal call callcontext
*/
- public InternalCallContext createInternalCallContext(@Nullable final Long tenantRecordId, final Long accountRecordId, final String userName,
+ public InternalCallContext createInternalCallContext(@Nullable final Long tenantRecordId, @Nullable final Long accountRecordId, final String userName,
final CallOrigin callOrigin, final UserType userType, @Nullable final UUID userToken) {
- return new InternalCallContext(tenantRecordId, accountRecordId, userToken, userName, callOrigin, userType, null, null,
- clock.getUTCNow(), clock.getUTCNow());
+ return createInternalCallContext(tenantRecordId, accountRecordId, userName, callOrigin, userType, userToken, null, null, clock.getUTCNow(), clock.getUTCNow());
}
/**
@@ -200,18 +212,13 @@ public class InternalCallContextFactory {
public InternalCallContext createInternalCallContext(final CallContext context) {
// If tenant id is null, this will default to the default tenant record id (multi-tenancy disabled)
final Long tenantRecordId = getTenantRecordIdSafe(context);
- return new InternalCallContext(tenantRecordId, null, context);
- }
-
- public InternalCallContext createInternalCallContext(final InternalCallContext context, final Long accountRecordId) {
- return new InternalCallContext(context, accountRecordId);
+ return new InternalCallContext(tenantRecordId, context);
}
// Used when we need to re-hydrate the callcontext with the account_record_id (when creating the account)
public InternalCallContext createInternalCallContext(final Long accountRecordId, final InternalCallContext context) {
- return new InternalCallContext(context.getTenantRecordId(), accountRecordId, context.getUserToken(), context.getCreatedBy(),
- context.getCallOrigin(), context.getContextUserType(), context.getReasonCode(), context.getComments(),
- context.getCreatedDate(), context.getUpdatedDate());
+ final DateTimeZone accountTimeZone = getAccountTimeZone(context.getTenantRecordId(), accountRecordId);
+ return new InternalCallContext(context, accountRecordId, accountTimeZone);
}
private InternalCallContext createInternalCallContext(final UUID objectId, final ObjectType objectType, final String userName,
@@ -224,17 +231,33 @@ public class InternalCallContextFactory {
reasonCode, comment, createdDate, updatedDate);
}
- private InternalCallContext createInternalCallContext(@Nullable final Long tenantRecordId, final Long accountRecordId, final String userName,
+ private InternalCallContext createInternalCallContext(@Nullable final Long tenantRecordId, @Nullable final Long accountRecordId, final String userName,
final CallOrigin callOrigin, final UserType userType, @Nullable final UUID userToken,
@Nullable final String reasonCode, @Nullable final String comment, final DateTime createdDate,
final DateTime updatedDate) {
- //Preconditions.checkNotNull(accountRecordId, "accountRecordId cannot be null");
- final Long nonNulTenantRecordId = Objects.firstNonNull(tenantRecordId, INTERNAL_TENANT_RECORD_ID);
+ final Long nonNulTenantRecordId = MoreObjects.firstNonNull(tenantRecordId, INTERNAL_TENANT_RECORD_ID);
+ final DateTimeZone accountTimeZone = getAccountTimeZone(tenantRecordId, accountRecordId);
- return new InternalCallContext(nonNulTenantRecordId, accountRecordId, userToken, userName, callOrigin, userType, reasonCode, comment,
+ return new InternalCallContext(nonNulTenantRecordId, accountRecordId, accountTimeZone, userToken, userName, callOrigin, userType, reasonCode, comment,
createdDate, updatedDate);
}
+ private DateTimeZone getAccountTimeZone(final Long tenantRecordId, @Nullable final Long accountRecordId) {
+ if (accountRecordId == null || accountInternalApi == null) {
+ return null;
+ }
+
+ final InternalTenantContext tmp = new InternalTenantContext(tenantRecordId, accountRecordId, null);
+
+ try {
+ final ImmutableAccountData immutableAccountData = accountInternalApi.getImmutableAccountDataByRecordId(accountRecordId, tmp);
+ // Will be null while creating the account
+ return immutableAccountData == null ? null : immutableAccountData.getTimeZone();
+ } catch (final AccountApiException e) {
+ return null;
+ }
+ }
+
//
// Safe NonEntityDao public wrappers
//
diff --git a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
index 2e55d4e..dde8ec7 100644
--- a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
+++ b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDaoWrapperInvocationHandler.java
@@ -469,7 +469,7 @@ public class EntitySqlDaoWrapperInvocationHandler<S extends EntitySqlDao<M, E>,
final InternalCallContext context;
// Populate the account record id when creating the account record
if (TableName.ACCOUNT.equals(tableName) && ChangeType.INSERT.equals(changeType)) {
- context = internalCallContextFactory.createInternalCallContext(contextMaybeWithoutAccountRecordId, entityRecordId);
+ context = internalCallContextFactory.createInternalCallContext(entityRecordId, contextMaybeWithoutAccountRecordId);
} else {
context = contextMaybeWithoutAccountRecordId;
}
diff --git a/util/src/main/java/org/killbill/billing/util/glue/NoCachingInternalCallContextFactoryProvider.java b/util/src/main/java/org/killbill/billing/util/glue/NoCachingInternalCallContextFactoryProvider.java
index 8e6c74b..51aa352 100644
--- a/util/src/main/java/org/killbill/billing/util/glue/NoCachingInternalCallContextFactoryProvider.java
+++ b/util/src/main/java/org/killbill/billing/util/glue/NoCachingInternalCallContextFactoryProvider.java
@@ -37,6 +37,6 @@ public class NoCachingInternalCallContextFactoryProvider implements Provider<Int
@Override
public InternalCallContextFactory get() {
- return new InternalCallContextFactory(clock, nonEntityDao, null);
+ return new InternalCallContextFactory(null, clock, nonEntityDao, null);
}
}
diff --git a/util/src/test/java/org/killbill/billing/callcontext/MutableInternalCallContext.java b/util/src/test/java/org/killbill/billing/callcontext/MutableInternalCallContext.java
new file mode 100644
index 0000000..6882a8b
--- /dev/null
+++ b/util/src/test/java/org/killbill/billing/callcontext/MutableInternalCallContext.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2016 Groupon, Inc
+ * Copyright 2016 The Billing Project, LLC
+ *
+ * The Billing Project 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 org.killbill.billing.callcontext;
+
+import java.util.UUID;
+
+import javax.annotation.Nullable;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.killbill.billing.util.callcontext.CallOrigin;
+import org.killbill.billing.util.callcontext.UserType;
+
+public class MutableInternalCallContext extends InternalCallContext {
+
+ private final Long initialAccountRecordId;
+ private final Long initialTenantRecordId;
+ private final DateTimeZone initialReferenceDateTimeZone;
+ private final DateTime initialCreatedDate;
+ private final DateTime initialUpdatedDate;
+
+ private Long accountRecordId;
+ private Long tenantRecordId;
+ private DateTimeZone referenceDateTimeZone;
+ private DateTime createdDate;
+ private DateTime updatedDate;
+
+ public MutableInternalCallContext(final Long tenantRecordId,
+ @Nullable final Long accountRecordId,
+ @Nullable final DateTimeZone referenceDateTimeZone,
+ final UUID userToken,
+ final String userName,
+ final CallOrigin callOrigin,
+ final UserType userType,
+ final String reasonCode,
+ final String comment,
+ final DateTime createdDate,
+ final DateTime updatedDate) {
+ super(tenantRecordId, accountRecordId, referenceDateTimeZone, userToken, userName, callOrigin, userType, reasonCode, comment, createdDate, updatedDate);
+ this.initialAccountRecordId = accountRecordId;
+ this.initialTenantRecordId = tenantRecordId;
+ this.initialReferenceDateTimeZone = referenceDateTimeZone;
+ this.initialCreatedDate = createdDate;
+ this.initialUpdatedDate = updatedDate;
+
+ reset();
+ }
+
+ @Override
+ public Long getAccountRecordId() {
+ return accountRecordId;
+ }
+
+ public void setAccountRecordId(final Long accountRecordId) {
+ this.accountRecordId = accountRecordId;
+ }
+
+ @Override
+ public Long getTenantRecordId() {
+ return tenantRecordId;
+ }
+
+ public void setTenantRecordId(final Long tenantRecordId) {
+ this.tenantRecordId = tenantRecordId;
+ }
+
+ @Override
+ public DateTimeZone getReferenceDateTimeZone() {
+ return referenceDateTimeZone;
+ }
+
+ public void setReferenceDateTimeZone(final DateTimeZone referenceDateTimeZone) {
+ this.referenceDateTimeZone = referenceDateTimeZone;
+ }
+
+ @Override
+ public DateTime getCreatedDate() {
+ return createdDate;
+ }
+
+ public void setCreatedDate(final DateTime createdDate) {
+ this.createdDate = createdDate;
+ }
+
+ @Override
+ public DateTime getUpdatedDate() {
+ return updatedDate;
+ }
+
+ public void setUpdatedDate(final DateTime updatedDate) {
+ this.updatedDate = updatedDate;
+ }
+
+ public void reset() {
+ setAccountRecordId(initialAccountRecordId);
+ setTenantRecordId(initialTenantRecordId);
+ setReferenceDateTimeZone(initialReferenceDateTimeZone);
+ setCreatedDate(initialCreatedDate);
+ setUpdatedDate(initialUpdatedDate);
+ }
+}
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestModule.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestModule.java
index 7cda860..65f7fa7 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestModule.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestModule.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project 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
@@ -20,7 +20,9 @@ package org.killbill.billing;
import java.util.UUID;
+import org.joda.time.DateTimeZone;
import org.killbill.billing.callcontext.InternalCallContext;
+import org.killbill.billing.callcontext.MutableInternalCallContext;
import org.killbill.billing.platform.api.KillbillConfigSource;
import org.killbill.billing.util.callcontext.CallContext;
import org.killbill.billing.util.callcontext.CallOrigin;
@@ -37,10 +39,17 @@ public class GuicyKillbillTestModule extends KillBillModule {
// That we we have only one clock and all internalContext/callcontext are consistent
//
- private final InternalCallContext internalCallContext = new InternalCallContext(InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID, 1687L, UUID.randomUUID(),
- UUID.randomUUID().toString(), CallOrigin.TEST,
- UserType.TEST, "Testing", "This is a test",
- GuicyKillbillTestSuite.getClock().getUTCNow(), GuicyKillbillTestSuite.getClock().getUTCNow());
+ private final MutableInternalCallContext internalCallContext = new MutableInternalCallContext(InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID,
+ 1687L,
+ DateTimeZone.UTC,
+ UUID.randomUUID(),
+ UUID.randomUUID().toString(),
+ CallOrigin.TEST,
+ UserType.TEST,
+ "Testing",
+ "This is a test",
+ GuicyKillbillTestSuite.getClock().getUTCNow(),
+ GuicyKillbillTestSuite.getClock().getUTCNow());
private final CallContext callContext = internalCallContext.toCallContext(null);
@@ -53,6 +62,7 @@ public class GuicyKillbillTestModule extends KillBillModule {
bind(ClockMock.class).toInstance(GuicyKillbillTestSuite.getClock());
bind(Clock.class).to(ClockMock.class);
bind(InternalCallContext.class).toInstance(internalCallContext);
+ bind(MutableInternalCallContext.class).toInstance(internalCallContext);
bind(CallContext.class).toInstance(callContext);
}
}
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
index 7debdc2..b4c5538 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project 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
@@ -22,7 +22,7 @@ import java.lang.reflect.Method;
import javax.inject.Inject;
-import org.killbill.billing.callcontext.InternalCallContext;
+import org.killbill.billing.callcontext.MutableInternalCallContext;
import org.killbill.billing.platform.api.KillbillConfigSource;
import org.killbill.billing.platform.test.config.TestKillbillConfigSource;
import org.killbill.billing.util.callcontext.CallContext;
@@ -44,7 +44,7 @@ public class GuicyKillbillTestSuite {
private boolean hasFailed = false;
@Inject
- protected InternalCallContext internalCallContext;
+ protected MutableInternalCallContext internalCallContext;
@Inject
protected CallContext callContext;
@@ -100,6 +100,8 @@ public class GuicyKillbillTestSuite {
log.info("***************************************************************************************************");
log.info("*** Starting test {}:{}", method.getDeclaringClass().getName(), method.getName());
log.info("***************************************************************************************************");
+
+ internalCallContext.reset();
}
@AfterMethod(alwaysRun = true)
diff --git a/util/src/test/java/org/killbill/billing/KillbillTestSuite.java b/util/src/test/java/org/killbill/billing/KillbillTestSuite.java
index 7af49d2..ebb0d5b 100644
--- a/util/src/test/java/org/killbill/billing/KillbillTestSuite.java
+++ b/util/src/test/java/org/killbill/billing/KillbillTestSuite.java
@@ -1,7 +1,9 @@
/*
- * Copyright 2010-2012 Ning, Inc.
+ * Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
*
@@ -17,22 +19,15 @@
package org.killbill.billing;
import java.lang.reflect.Method;
-import java.util.UUID;
+import org.killbill.clock.Clock;
+import org.killbill.clock.ClockMock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
-import org.killbill.billing.util.callcontext.CallContext;
-import org.killbill.billing.util.callcontext.CallOrigin;
-import org.killbill.billing.callcontext.InternalCallContext;
-import org.killbill.billing.util.callcontext.InternalCallContextFactory;
-import org.killbill.billing.util.callcontext.UserType;
-import org.killbill.clock.Clock;
-import org.killbill.clock.ClockMock;
-
public class KillbillTestSuite {
// Use the simple name here to save screen real estate
@@ -42,12 +37,6 @@ public class KillbillTestSuite {
protected Clock clock = new ClockMock();
- protected final InternalCallContext internalCallContext = new InternalCallContext(InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID, 1687L, UUID.randomUUID(),
- UUID.randomUUID().toString(), CallOrigin.TEST,
- UserType.TEST, "Testing", "This is a test",
- clock.getUTCNow(), clock.getUTCNow());
- protected final CallContext callContext = internalCallContext.toCallContext(null);
-
@BeforeMethod(alwaysRun = true)
public void startTestSuite(final Method method) throws Exception {
log.info("***************************************************************************************************");
diff --git a/util/src/test/java/org/killbill/billing/mock/glue/MockAccountModule.java b/util/src/test/java/org/killbill/billing/mock/glue/MockAccountModule.java
index 5efae87..3fc2521 100644
--- a/util/src/test/java/org/killbill/billing/mock/glue/MockAccountModule.java
+++ b/util/src/test/java/org/killbill/billing/mock/glue/MockAccountModule.java
@@ -18,12 +18,19 @@
package org.killbill.billing.mock.glue;
+import org.joda.time.DateTimeZone;
+import org.killbill.billing.account.api.AccountApiException;
import org.killbill.billing.account.api.AccountInternalApi;
import org.killbill.billing.account.api.AccountUserApi;
+import org.killbill.billing.account.api.ImmutableAccountData;
+import org.killbill.billing.account.api.ImmutableAccountInternalApi;
+import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.glue.AccountModule;
+import org.killbill.billing.mock.api.MockAccountUserApi;
import org.killbill.billing.platform.api.KillbillConfigSource;
import org.killbill.billing.util.glue.KillBillModule;
import org.mockito.Mockito;
+import org.testng.Assert;
public class MockAccountModule extends KillBillModule implements AccountModule {
@@ -39,11 +46,23 @@ public class MockAccountModule extends KillBillModule implements AccountModule {
@Override
public void installAccountUserApi() {
- bind(AccountUserApi.class).toInstance(Mockito.mock(AccountUserApi.class));
+ bind(AccountUserApi.class).toInstance(new MockAccountUserApi());
}
@Override
public void installInternalApi() {
- bind(AccountInternalApi.class).toInstance(Mockito.mock(AccountInternalApi.class));
+ final ImmutableAccountData immutableAccountData = Mockito.mock(ImmutableAccountData.class);
+ Mockito.when(immutableAccountData.getTimeZone()).thenReturn(DateTimeZone.UTC);
+
+ final AccountInternalApi accountInternalApi = Mockito.mock(AccountInternalApi.class);
+ final ImmutableAccountInternalApi immutableAccountInternalApi = Mockito.mock(ImmutableAccountInternalApi.class);
+ try {
+ Mockito.when(accountInternalApi.getImmutableAccountDataByRecordId(Mockito.anyLong(), Mockito.<InternalTenantContext>any())).thenReturn(immutableAccountData);
+ Mockito.when(immutableAccountInternalApi.getImmutableAccountDataByRecordId(Mockito.anyLong(), Mockito.<InternalTenantContext>any())).thenReturn(immutableAccountData);
+ } catch (final AccountApiException e) {
+ Assert.fail(e.getMessage());
+ }
+ bind(AccountInternalApi.class).toInstance(accountInternalApi);
+ bind(ImmutableAccountInternalApi.class).toInstance(immutableAccountInternalApi);
}
}
diff --git a/util/src/test/java/org/killbill/billing/util/glue/TestUtilModule.java b/util/src/test/java/org/killbill/billing/util/glue/TestUtilModule.java
index 9dee2b4..030cd05 100644
--- a/util/src/test/java/org/killbill/billing/util/glue/TestUtilModule.java
+++ b/util/src/test/java/org/killbill/billing/util/glue/TestUtilModule.java
@@ -1,7 +1,7 @@
/*
* Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2016 Groupon, Inc
+ * Copyright 2014-2016 The Billing Project, LLC
*
* The Billing Project 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
@@ -18,6 +18,7 @@
package org.killbill.billing.util.glue;
+import org.killbill.billing.mock.glue.MockAccountModule;
import org.killbill.billing.mock.glue.MockTenantModule;
import org.killbill.billing.platform.api.KillbillConfigSource;
import org.killbill.billing.subscription.api.timeline.SubscriptionBaseTimelineApi;
@@ -29,9 +30,12 @@ public class TestUtilModule extends KillBillModule {
super(configSource);
}
- // TODO STEPH this is bad-- because DefaultAuditUserApi is using SubscriptionBaseTimeline API
- public void installHack() {
+ // TODO this is bad!
+ public void installHacks() {
+ // DefaultAuditUserApi is using SubscriptionBaseTimeline API
bind(SubscriptionBaseTimelineApi.class).toInstance(Mockito.mock(SubscriptionBaseTimelineApi.class));
+ // InternalCallContextFactory is using AccountInternalApi
+ install(new MockAccountModule(configSource));
}
@Override
@@ -39,6 +43,6 @@ public class TestUtilModule extends KillBillModule {
//install(new CallContextModule());
install(new CacheModule(configSource));
install(new MockTenantModule(configSource));
- installHack();
+ installHacks();
}
}
diff --git a/util/src/test/java/org/killbill/billing/util/timezone/TestDateAndTimeZoneContext.java b/util/src/test/java/org/killbill/billing/util/timezone/TestDateAndTimeZoneContext.java
index 31ec696..8fbc12b 100644
--- a/util/src/test/java/org/killbill/billing/util/timezone/TestDateAndTimeZoneContext.java
+++ b/util/src/test/java/org/killbill/billing/util/timezone/TestDateAndTimeZoneContext.java
@@ -48,10 +48,10 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
@Test(groups = "fast")
public void testComputeUTCDateTimeFromLocalDate1() {
-
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTime1);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(-8);
+ internalCallContext.setReferenceDateTimeZone(timeZone);
final AccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 19);
@@ -61,10 +61,10 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
@Test(groups = "fast")
public void testComputeUTCDateTimeFromLocalDate2() {
-
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTime2);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(-8);
+ internalCallContext.setReferenceDateTimeZone(timeZone);
final AccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 20);
@@ -74,10 +74,10 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
@Test(groups = "fast")
public void testComputeUTCDateTimeFromLocalDate3() {
-
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTime3);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(-8);
+ internalCallContext.setReferenceDateTimeZone(timeZone);
final AccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 20);
@@ -87,10 +87,10 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
@Test(groups = "fast")
public void testComputeUTCDateTimeFromLocalDateA() {
-
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTimeA);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(8);
+ internalCallContext.setReferenceDateTimeZone(timeZone);
final AccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 21);
@@ -100,10 +100,10 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
@Test(groups = "fast")
public void testComputeUTCDateTimeFromLocalDateB() {
-
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTimeB);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(8);
+ internalCallContext.setReferenceDateTimeZone(timeZone);
final AccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 21);
@@ -113,10 +113,10 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
@Test(groups = "fast")
public void testComputeUTCDateTimeFromLocalDateC() {
-
final DateTime effectiveDateTime = DATE_TIME_FORMATTER.parseDateTime(effectiveDateTimeC);
final DateTimeZone timeZone = DateTimeZone.forOffsetHours(8);
+ internalCallContext.setReferenceDateTimeZone(timeZone);
final AccountDateAndTimeZoneContext dateContext = new DefaultAccountDateAndTimeZoneContext(effectiveDateTime, timeZone, internalCallContext);
final LocalDate endDate = new LocalDate(2013, 01, 20);
@@ -132,6 +132,7 @@ public class TestDateAndTimeZoneContext extends UtilTestSuiteNoDB {
// Alaska Standard Time
final DateTimeZone tz = DateTimeZone.forID("America/Juneau");
+ internalCallContext.setReferenceDateTimeZone(tz);
// Time zone is AKDT (UTC-8h) between March and November
final DateTime referenceDateTimeWithDST = new DateTime("2015-09-01T08:01:01.000Z");