diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
index d056725..fb8998e 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
@@ -52,7 +52,6 @@ public class BillCycleDayCalculator {
@Inject
public BillCycleDayCalculator(final CatalogService catalogService, final EntitlementUserApi entitlementApi) {
- super();
this.catalogService = catalogService;
this.entitlementApi = entitlementApi;
}
@@ -81,6 +80,12 @@ public class BillCycleDayCalculator {
phase.getPhaseType()),
transition.getRequestedTransitionTime());
+ return calculateBcdForAlignment(alignment, bundle, subscription, account, catalog, plan);
+ }
+
+ @VisibleForTesting
+ BillCycleDay calculateBcdForAlignment(final BillingAlignment alignment, final SubscriptionBundle bundle, final Subscription subscription,
+ final Account account, final Catalog catalog, final Plan plan) throws AccountApiException, EntitlementUserApiException, CatalogApiException {
BillCycleDay result = null;
switch (alignment) {
case ACCOUNT:
diff --git a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java
index 8bc0293..b5b327a 100644
--- a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java
+++ b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java
@@ -16,6 +16,8 @@
package com.ning.billing.junction.plumbing.billing;
+import java.util.UUID;
+
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.mockito.Mockito;
@@ -25,14 +27,52 @@ import org.testng.annotations.Test;
import com.ning.billing.account.api.Account;
import com.ning.billing.account.api.AccountApiException;
import com.ning.billing.account.api.BillCycleDay;
+import com.ning.billing.catalog.api.BillingAlignment;
+import com.ning.billing.catalog.api.Catalog;
import com.ning.billing.catalog.api.CatalogService;
import com.ning.billing.catalog.api.Plan;
+import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
import com.ning.billing.entitlement.api.user.EntitlementUserApi;
import com.ning.billing.entitlement.api.user.Subscription;
+import com.ning.billing.entitlement.api.user.SubscriptionBundle;
public class TestBillCycleDayCalculator {
@Test(groups = "fast")
+ public void testCalculateBCDForAOWithBPCancelledBundleAligned() throws Exception {
+ final DateTimeZone accountTimeZone = DateTimeZone.UTC;
+ final DateTime bpStartDateUTC = new DateTime(2012, 7, 16, 21, 0, 0, DateTimeZone.UTC);
+ final int expectedBCDUTC = 16;
+
+ // Create the calculator
+ final CatalogService catalogService = Mockito.mock(CatalogService.class);
+ final EntitlementUserApi entitlementUserApi = Mockito.mock(EntitlementUserApi.class);
+ final BillCycleDayCalculator billCycleDayCalculator = new BillCycleDayCalculator(catalogService, entitlementUserApi);
+
+ // Create a Bundle associated with a subscription
+ final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
+ final EffectiveSubscriptionEvent previousTransition = Mockito.mock(EffectiveSubscriptionEvent.class);
+ final Subscription subscription = Mockito.mock(Subscription.class);
+ Mockito.when(subscription.getStartDate()).thenReturn(bpStartDateUTC);
+ Mockito.when(subscription.getPreviousTransition()).thenReturn(previousTransition);
+ // subscription.getCurrentPlan() will return null as expected (cancelled BP)
+ Mockito.when(entitlementUserApi.getBaseSubscription(Mockito.<UUID>any())).thenReturn(subscription);
+
+ // Create a the base plan associated with that subscription
+ final Plan plan = Mockito.mock(Plan.class);
+ Mockito.when(plan.dateOfFirstRecurringNonZeroCharge(bpStartDateUTC)).thenReturn(bpStartDateUTC);
+ final Catalog catalog = Mockito.mock(Catalog.class);
+ Mockito.when(catalog.findPlan(Mockito.anyString(), Mockito.<DateTime>any(), Mockito.<DateTime>any())).thenReturn(plan);
+
+ final Account account = Mockito.mock(Account.class);
+ Mockito.when(account.getTimeZone()).thenReturn(accountTimeZone);
+ final BillCycleDay billCycleDay = billCycleDayCalculator.calculateBcdForAlignment(BillingAlignment.BUNDLE, bundle, subscription,
+ account, catalog, null);
+
+ Assert.assertEquals(billCycleDay.getDayOfMonthUTC(), expectedBCDUTC);
+ }
+
+ @Test(groups = "fast")
public void testCalculateBCDWithTimeZoneHST() throws Exception {
final DateTimeZone accountTimeZone = DateTimeZone.forID("HST");
final DateTime startDateUTC = new DateTime("2012-07-16T21:17:03.000Z", DateTimeZone.UTC);