killbill-memoizeit

account: handle special case BCD of zero/zero BCD zero/zero

8/6/2012 8:46:07 PM

Details

diff --git a/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java b/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
index 7eb38af..6984db1 100644
--- a/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
+++ b/account/src/main/java/com/ning/billing/account/api/DefaultAccount.java
@@ -228,8 +228,10 @@ public class DefaultAccount extends EntityBase implements Account {
         }
 
         // We can't just use .equals here as the BillCycleDay class might not have implemented it
-        if (billCycleDay != null ? !(billCycleDay.getDayOfMonthUTC() == delegate.getBillCycleDay().getDayOfMonthUTC() &&
-                                     billCycleDay.getDayOfMonthLocal() == delegate.getBillCycleDay().getDayOfMonthLocal()) : delegate.getBillCycleDay() != null) {
+        if (!(billCycleDay == null && (delegate.getBillCycleDay() == null ||
+                                       delegate.getBillCycleDay().getDayOfMonthUTC() == 0 && delegate.getBillCycleDay().getDayOfMonthLocal() == 0)) &&
+            !(billCycleDay != null && (billCycleDay.getDayOfMonthUTC() == delegate.getBillCycleDay().getDayOfMonthUTC() &&
+                                       billCycleDay.getDayOfMonthLocal() == delegate.getBillCycleDay().getDayOfMonthLocal()))) {
             throw new IllegalArgumentException(String.format("Killbill doesn't support updating the account BCD yet: this=%s, delegate=%s",
                                                              billCycleDay, delegate.getBillCycleDay()));
         }
diff --git a/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java b/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
index d5244d9..941b66f 100644
--- a/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
+++ b/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
@@ -352,6 +352,23 @@ public class TestAccountDao extends AccountDaoTestBase {
     }
 
     @Test(groups = "slow")
+    public void testShouldBeAbleToHandleBCDOfZeroZero() throws Exception {
+        final Account account = createTestAccount(0);
+        accountDao.create(account, context);
+        final Account fetchedAccount = accountDao.getById(account.getId());
+
+        final MutableAccountData otherAccount = account.toMutableAccountData();
+        // Set BCD to null
+        otherAccount.setBillCycleDay(null);
+
+        final DefaultAccount newAccount = new DefaultAccount(account.getId(), otherAccount);
+        accountDao.update(newAccount, context);
+
+        // Same BCD (zero/zero)
+        Assert.assertEquals(accountDao.getById(account.getId()), fetchedAccount);
+    }
+
+    @Test(groups = "slow")
     public void testAccountEmail() {
         List<AccountEmail> emails = new ArrayList<AccountEmail>();