diff --git a/api/src/main/java/com/ning/billing/util/api/AuditUserApi.java b/api/src/main/java/com/ning/billing/util/api/AuditUserApi.java
index d6a7a4f..ee9cc2a 100644
--- a/api/src/main/java/com/ning/billing/util/api/AuditUserApi.java
+++ b/api/src/main/java/com/ning/billing/util/api/AuditUserApi.java
@@ -21,6 +21,7 @@ import java.util.UUID;
import com.ning.billing.ObjectType;
import com.ning.billing.entitlement.api.timeline.BundleTimeline;
+import com.ning.billing.entitlement.api.timeline.EntitlementRepairException;
import com.ning.billing.invoice.api.Invoice;
import com.ning.billing.invoice.api.InvoicePayment;
import com.ning.billing.payment.api.Payment;
@@ -36,6 +37,16 @@ import com.ning.billing.util.callcontext.TenantContext;
public interface AuditUserApi {
/**
+ * Fetch all audit logs for a bundle.
+ *
+ * @param bundleId the bundle id to lookup
+ * @param auditLevel audit level (verbosity)
+ * @param context the tenant context
+ * @return all audit logs for these refunds
+ */
+ public AuditLogsForBundles getAuditLogsForBundle(UUID bundleId, AuditLevel auditLevel, TenantContext context) throws EntitlementRepairException;
+
+ /**
* Fetch all audit logs for bundles.
*
* @param bundles the bundles to lookup
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
new file mode 100644
index 0000000..84ace0a
--- /dev/null
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/util/AuditChecker.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning 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 com.ning.billing.beatrix.util;
+
+import java.util.UUID;
+
+import javax.annotation.Nullable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+
+import com.ning.billing.entitlement.api.timeline.EntitlementRepairException;
+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.ChangeType;
+import com.ning.billing.util.callcontext.CallContext;
+
+import com.google.inject.Inject;
+
+public class AuditChecker {
+
+ private static final Logger log = LoggerFactory.getLogger(AuditChecker.class);
+
+ private final AuditUserApi auditUserApi;
+
+ @Inject
+ public AuditChecker(final AuditUserApi auditUserApi) {
+ this.auditUserApi = auditUserApi;
+ }
+
+ // Pass the call context used to create the bundle
+ public void checkBundleCreated(final UUID bundleId, final CallContext context) {
+ final AuditLogsForBundles auditLogsForBundles = getAuditLogsForBundle(bundleId, context);
+
+ 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));
+ }
+
+ // Pass the call context used to update the bundle
+ public void checkBundleUpdated(final UUID bundleId, final CallContext context) {
+ final AuditLogsForBundles auditLogsForBundles = getAuditLogsForBundle(bundleId, context);
+
+ 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));
+ }
+
+ // Pass the call context used to create the subscription
+ public void checkSubscriptionCreated(final UUID bundleId, final UUID subscriptionId, final CallContext context) {
+ final AuditLogsForBundles auditLogsForBundles = getAuditLogsForBundle(bundleId, context);
+
+ 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));
+ }
+
+ // Pass the call context used to update the subscription
+ public void checkSubscriptionUpdated(final UUID bundleId, final UUID subscriptionId, final CallContext context) {
+ final AuditLogsForBundles auditLogsForBundles = getAuditLogsForBundle(bundleId, context);
+
+ 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));
+ }
+
+ // Pass the call context used to create the subscription event
+ public void checkSubscriptionEventCreated(final UUID bundleId, final UUID subscriptionEventId, final CallContext context) {
+ final AuditLogsForBundles auditLogsForBundles = getAuditLogsForBundle(bundleId, context);
+
+ 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));
+ }
+
+ // Pass the call context used to update the subscription event
+ public void checkSubscriptionEventUpdated(final UUID bundleId, final UUID subscriptionEventId, final CallContext context) {
+ final AuditLogsForBundles auditLogsForBundles = getAuditLogsForBundle(bundleId, context);
+
+ 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));
+ }
+
+ private AuditLogsForBundles getAuditLogsForBundle(final UUID bundleId, final CallContext context) {
+ try {
+ return auditUserApi.getAuditLogsForBundle(bundleId, AuditLevel.FULL, context);
+ } catch (EntitlementRepairException e) {
+ Assert.fail(e.toString());
+ return null;
+ }
+ }
+
+ private void checkAuditLog(final ChangeType insert, final AuditLog auditLog) {
+ checkAuditLog(insert, null, auditLog);
+ }
+
+ private void checkAuditLog(final ChangeType changeType, @Nullable final CallContext context, final AuditLog auditLog) {
+ 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.getComment());
+ Assert.assertEquals(auditLog.getUserToken(), context.getUserToken().toString());
+ Assert.assertEquals(auditLog.getCreatedDate(), context.getCreatedDate());
+ }
+ }
+}
diff --git a/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java b/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java
index 0429e67..e95e1b2 100644
--- a/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java
+++ b/util/src/main/java/com/ning/billing/util/audit/api/DefaultAuditUserApi.java
@@ -25,6 +25,8 @@ import javax.inject.Inject;
import com.ning.billing.ObjectType;
import com.ning.billing.entitlement.api.timeline.BundleTimeline;
+import com.ning.billing.entitlement.api.timeline.EntitlementRepairException;
+import com.ning.billing.entitlement.api.timeline.EntitlementTimelineApi;
import com.ning.billing.entitlement.api.timeline.SubscriptionTimeline;
import com.ning.billing.entitlement.api.timeline.SubscriptionTimeline.ExistingEvent;
import com.ning.billing.invoice.api.Invoice;
@@ -55,15 +57,22 @@ import com.google.common.collect.ImmutableList;
public class DefaultAuditUserApi implements AuditUserApi {
private final AuditDao auditDao;
+ private final EntitlementTimelineApi timelineApi;
private final InternalCallContextFactory internalCallContextFactory;
@Inject
- public DefaultAuditUserApi(final AuditDao auditDao, final InternalCallContextFactory internalCallContextFactory) {
+ public DefaultAuditUserApi(final AuditDao auditDao, final EntitlementTimelineApi timelineApi, final InternalCallContextFactory internalCallContextFactory) {
this.auditDao = auditDao;
+ this.timelineApi = timelineApi;
this.internalCallContextFactory = internalCallContextFactory;
}
@Override
+ public AuditLogsForBundles getAuditLogsForBundle(final UUID bundleId, final AuditLevel auditLevel, final TenantContext context) throws EntitlementRepairException {
+ return getAuditLogsForBundles(ImmutableList.<BundleTimeline>of(timelineApi.getBundleTimeline(bundleId, context)), auditLevel, context);
+ }
+
+ @Override
public AuditLogsForBundles getAuditLogsForBundles(final List<BundleTimeline> bundles, final AuditLevel auditLevel, final TenantContext context) {
final Map<UUID, List<AuditLog>> bundlesAuditLogs = new HashMap<UUID, List<AuditLog>>();
final Map<UUID, List<AuditLog>> subscriptionsAuditLogs = new HashMap<UUID, List<AuditLog>>();
diff --git a/util/src/test/java/com/ning/billing/util/audit/dao/TestDefaultAuditDao.java b/util/src/test/java/com/ning/billing/util/audit/dao/TestDefaultAuditDao.java
index d0fe9c4..e23d565 100644
--- a/util/src/test/java/com/ning/billing/util/audit/dao/TestDefaultAuditDao.java
+++ b/util/src/test/java/com/ning/billing/util/audit/dao/TestDefaultAuditDao.java
@@ -30,16 +30,17 @@ import org.testng.annotations.Guice;
import org.testng.annotations.Test;
import com.ning.billing.ObjectType;
+import com.ning.billing.mock.glue.MockEntitlementModule;
import com.ning.billing.util.UtilTestSuiteWithEmbeddedDB;
import com.ning.billing.util.api.AuditLevel;
import com.ning.billing.util.api.TagApiException;
import com.ning.billing.util.api.TagDefinitionApiException;
import com.ning.billing.util.audit.AuditLog;
import com.ning.billing.util.audit.ChangeType;
-import com.ning.billing.util.svcsapi.bus.InternalBus;
import com.ning.billing.util.clock.Clock;
import com.ning.billing.util.dao.TableName;
import com.ning.billing.util.glue.AuditModule;
+import com.ning.billing.util.svcsapi.bus.InternalBus;
import com.ning.billing.util.tag.MockTagStoreModuleSql;
import com.ning.billing.util.tag.Tag;
import com.ning.billing.util.tag.TagDefinition;
@@ -48,7 +49,7 @@ import com.ning.billing.util.tag.dao.TagDefinitionDao;
import com.google.inject.Inject;
-@Guice(modules = {MockTagStoreModuleSql.class, AuditModule.class})
+@Guice(modules = {MockTagStoreModuleSql.class, AuditModule.class, MockEntitlementModule.class})
public class TestDefaultAuditDao extends UtilTestSuiteWithEmbeddedDB {
@Inject