killbill-uncached

account: fix BCD comparison in DefaultAccount Don't assume

8/6/2012 8:22:33 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 6704b4d..7eb38af 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
@@ -221,11 +221,15 @@ public class DefaultAccount extends EntityBase implements Account {
             throw new IllegalArgumentException(String.format("Killbill doesn't support updating the account external key yet: this=%s, delegate=%s",
                                                              externalKey, delegate.getExternalKey()));
         }
+
         if (currency != null ? !currency.equals(delegate.getCurrency()) : delegate.getCurrency() != null) {
             throw new IllegalArgumentException(String.format("Killbill doesn't support updating the account currency yet: this=%s, delegate=%s",
                                                              currency, delegate.getCurrency()));
         }
-        if (billCycleDay != null ? !billCycleDay.equals(delegate.getBillCycleDay()) : delegate.getBillCycleDay() != null) {
+
+        // 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) {
             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 fd82926..d5244d9 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
@@ -321,6 +321,37 @@ public class TestAccountDao extends AccountDaoTestBase {
     }
 
     @Test(groups = "slow")
+    public void testShouldBeAbleToHandleOtherBCDClass() throws Exception {
+        final Account account = createTestAccount();
+        accountDao.create(account, context);
+
+        final MutableAccountData otherAccount = account.toMutableAccountData();
+        otherAccount.setAddress1(UUID.randomUUID().toString());
+        otherAccount.setEmail(UUID.randomUUID().toString());
+        // Same BCD, but not .equals method
+        otherAccount.setBillCycleDay(new BillCycleDay() {
+            @Override
+            public int getDayOfMonthUTC() {
+                return account.getBillCycleDay().getDayOfMonthUTC();
+            }
+
+            @Override
+            public int getDayOfMonthLocal() {
+                return account.getBillCycleDay().getDayOfMonthLocal();
+            }
+        });
+
+        final DefaultAccount newAccount = new DefaultAccount(account.getId(), otherAccount);
+        accountDao.update(newAccount, context);
+
+        final Account newFetchedAccount = accountDao.getById(account.getId());
+        Assert.assertEquals(newFetchedAccount.getAddress1(), newAccount.getAddress1());
+        Assert.assertEquals(newFetchedAccount.getEmail(), newAccount.getEmail());
+        // Same BCD
+        Assert.assertEquals(newFetchedAccount.getBillCycleDay(), account.getBillCycleDay());
+    }
+
+    @Test(groups = "slow")
     public void testAccountEmail() {
         List<AccountEmail> emails = new ArrayList<AccountEmail>();