killbill-aplcache

Details

diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
index 94b28e5..d826d5c 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
@@ -33,11 +33,6 @@ public interface InvoiceUserApi {
 
     public void notifyOfPaymentAttempt(InvoicePayment invoicePayment);
 
-//    public void paymentAttemptFailed(UUID invoiceId, UUID paymentId, DateTime paymentAttemptDate);
-//
-//    public void paymentAttemptSuccessful(UUID invoiceId, BigDecimal amount, Currency currency,
-//                                         UUID paymentId, DateTime paymentDate);
-    
     public BigDecimal getAccountBalance(UUID accountId);
 
 }
diff --git a/api/src/main/java/com/ning/billing/payment/api/CreditCardPaymentMethodInfo.java b/api/src/main/java/com/ning/billing/payment/api/CreditCardPaymentMethodInfo.java
index 6f767ff..a9e25dc 100644
--- a/api/src/main/java/com/ning/billing/payment/api/CreditCardPaymentMethodInfo.java
+++ b/api/src/main/java/com/ning/billing/payment/api/CreditCardPaymentMethodInfo.java
@@ -36,6 +36,16 @@ public final class CreditCardPaymentMethodInfo extends PaymentMethodInfo {
 
         public Builder(CreditCardPaymentMethodInfo src) {
             super(Builder.class, src);
+            this.cardHolderName = src.cardHolderName;
+            this.cardType = src.cardType;
+            this.expirationDate = src.expirationDate;
+            this.cardAddress1 = src.cardAddress1;
+            this.cardAddress2 = src.cardAddress2;
+            this.cardCity = src.cardCity;
+            this.cardState = src.cardState;
+            this.cardPostalCode = src.cardPostalCode;
+            this.cardCountry = src.cardCountry;
+            this.maskNumber = src.maskNumber;
         }
 
         public Builder setCardHolderName(String cardHolderName) {
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java b/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java
index be1f649..189e87c 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentApi.java
@@ -45,7 +45,7 @@ public interface PaymentApi {
 
     Either<PaymentError, String> createPaymentProviderAccount(Account account);
 
-    Either<PaymentError, Void> updatePaymentProviderAccount(Account account);
+    Either<PaymentError, Void> updatePaymentProviderAccountContact(Account account);
 
     PaymentAttempt getPaymentAttemptForPaymentId(String id);
 
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaymentProviderAccount.java b/api/src/main/java/com/ning/billing/payment/api/PaymentProviderAccount.java
index 553d6a2..47cad39 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaymentProviderAccount.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaymentProviderAccount.java
@@ -20,18 +20,18 @@ import com.google.common.base.Objects;
 
 public class PaymentProviderAccount {
     private final String id;
-    private final String accountNumber;
+    private final String accountKey;
     private final String accountName;
     private final String phoneNumber;
     private final String defaultPaymentMethodId;
 
     public PaymentProviderAccount(String id,
-                                  String accountNumber,
+                                  String accountKey,
                                   String accountName,
                                   String phoneNumber,
                                   String defaultPaymentMethodId) {
         this.id = id;
-        this.accountNumber = accountNumber;
+        this.accountKey = accountKey;
         this.accountName = accountName;
         this.phoneNumber = phoneNumber;
         this.defaultPaymentMethodId = defaultPaymentMethodId;
@@ -41,8 +41,8 @@ public class PaymentProviderAccount {
         return id;
     }
 
-    public String getAccountNumber() {
-        return accountNumber;
+    public String getAccountKey() {
+        return accountKey;
     }
 
     public String getAccountName() {
@@ -59,18 +59,27 @@ public class PaymentProviderAccount {
 
     public static class Builder {
         private String id;
-        private String accountNumber;
+        private String accountKey;
         private String accountName;
         private String phoneNumber;
         private String defaultPaymentMethodId;
 
+        public Builder copyFrom(PaymentProviderAccount src) {
+            this.id = src.getId();
+            this.accountKey = src.getAccountKey();
+            this.accountName = src.getAccountName();
+            this.phoneNumber = src.getPhoneNumber();
+            this.defaultPaymentMethodId = src.getDefaultPaymentMethodId();
+            return this;
+        }
+
         public Builder setId(String id) {
             this.id = id;
             return this;
         }
 
-        public Builder setAccountNumber(String accountNumber) {
-            this.accountNumber = accountNumber;
+        public Builder setAccountKey(String accountKey) {
+            this.accountKey = accountKey;
             return this;
         }
 
@@ -90,7 +99,7 @@ public class PaymentProviderAccount {
         }
 
         public PaymentProviderAccount build() {
-            return new PaymentProviderAccount(id, accountNumber, accountName, phoneNumber, defaultPaymentMethodId);
+            return new PaymentProviderAccount(id, accountKey, accountName, phoneNumber, defaultPaymentMethodId);
         }
 
     }
@@ -98,7 +107,7 @@ public class PaymentProviderAccount {
     @Override
     public int hashCode() {
         return Objects.hashCode(id,
-                                accountNumber,
+                                accountKey,
                                 accountName,
                                 phoneNumber,
                                 defaultPaymentMethodId);
@@ -113,7 +122,8 @@ public class PaymentProviderAccount {
             }
             else {
                 return Objects.equal(id, other.id) &&
-                       Objects.equal(accountNumber, other.accountNumber) &&
+                       Objects.equal(accountKey, other.accountKey) &&
+                       Objects.equal(accountName, other.accountName) &&
                        Objects.equal(phoneNumber, other.phoneNumber) &&
                        Objects.equal(defaultPaymentMethodId, other.defaultPaymentMethodId);
             }
@@ -121,4 +131,9 @@ public class PaymentProviderAccount {
         return false;
     }
 
+    @Override
+    public String toString() {
+        return "PaymentProviderAccount [id=" + id + ", accountKey=" + accountKey + ", accountName=" + accountName + ", phoneNumber=" + phoneNumber + ", defaultPaymentMethodId=" + defaultPaymentMethodId + "]";
+    }
+
 }
diff --git a/api/src/main/java/com/ning/billing/payment/api/PaypalPaymentMethodInfo.java b/api/src/main/java/com/ning/billing/payment/api/PaypalPaymentMethodInfo.java
index 8b94f15..0977071 100644
--- a/api/src/main/java/com/ning/billing/payment/api/PaypalPaymentMethodInfo.java
+++ b/api/src/main/java/com/ning/billing/payment/api/PaypalPaymentMethodInfo.java
@@ -32,6 +32,8 @@ public final class PaypalPaymentMethodInfo extends PaymentMethodInfo {
 
         public Builder(PaypalPaymentMethodInfo src) {
             super(Builder.class, src);
+            this.baid = src.baid;
+            this.email = src.email;
         }
 
         public Builder setBaid(String baid) {
@@ -59,8 +61,8 @@ public final class PaypalPaymentMethodInfo extends PaymentMethodInfo {
                                    String email) {
         super(id, accountId, defaultMethod, TYPE);
 
-        if (Strings.isNullOrEmpty(accountId) || Strings.isNullOrEmpty(baid) || Strings.isNullOrEmpty(email)) {
-            throw new IllegalArgumentException("accountId, baid and email should be present");
+        if (Strings.isNullOrEmpty(baid) || Strings.isNullOrEmpty(email)) {
+            throw new IllegalArgumentException("baid and email should be present");
         }
 
         this.baid = baid;
@@ -74,4 +76,10 @@ public final class PaypalPaymentMethodInfo extends PaymentMethodInfo {
     public String getEmail() {
         return email;
     }
+
+    @Override
+    public String toString() {
+        return "PaypalPaymentMethodInfo [baid=" + baid + ", email=" + email + "]";
+    }
+
 }
diff --git a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
index 74ad7f1..e89e799 100644
--- a/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
+++ b/payment/src/main/java/com/ning/billing/payment/api/DefaultPaymentApi.java
@@ -179,9 +179,9 @@ public class DefaultPaymentApi implements PaymentApi {
     }
 
     @Override
-    public Either<PaymentError, Void> updatePaymentProviderAccount(Account account) {
+    public Either<PaymentError, Void> updatePaymentProviderAccountContact(Account account) {
         final PaymentProviderPlugin plugin = getPaymentProviderPlugin(account);
-        return plugin.updatePaymentProviderAccountWithExistingContact(account);
+        return plugin.updatePaymentProviderAccountExistingContact(account);
     }
 
     @Override
diff --git a/payment/src/main/java/com/ning/billing/payment/provider/PaymentProviderPlugin.java b/payment/src/main/java/com/ning/billing/payment/provider/PaymentProviderPlugin.java
index e1bc1c3..7a9ae71 100644
--- a/payment/src/main/java/com/ning/billing/payment/provider/PaymentProviderPlugin.java
+++ b/payment/src/main/java/com/ning/billing/payment/provider/PaymentProviderPlugin.java
@@ -40,7 +40,7 @@ public interface PaymentProviderPlugin {
     Either<PaymentError, PaymentMethodInfo> updatePaymentMethod(String accountKey, PaymentMethodInfo paymentMethodInfo);
     Either<PaymentError, Void> deletePaymentMethod(String accountKey, String paymentMethodId);
 
-    Either<PaymentError, Void> updatePaymentProviderAccountWithExistingContact(Account account);
+    Either<PaymentError, Void> updatePaymentProviderAccountExistingContact(Account account);
     Either<PaymentError, Void> updatePaymentProviderAccountWithNewContact(Account account);
 
 }
diff --git a/payment/src/test/java/com/ning/billing/payment/api/TestPaymentApi.java b/payment/src/test/java/com/ning/billing/payment/api/TestPaymentApi.java
index a1b02b3..c756963 100644
--- a/payment/src/test/java/com/ning/billing/payment/api/TestPaymentApi.java
+++ b/payment/src/test/java/com/ning/billing/payment/api/TestPaymentApi.java
@@ -25,7 +25,9 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
 
+import org.apache.commons.lang.RandomStringUtils;
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -33,6 +35,7 @@ import org.testng.annotations.Test;
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
+import com.ning.billing.account.api.user.AccountBuilder;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.model.DefaultInvoiceItem;
@@ -58,10 +61,9 @@ public abstract class TestPaymentApi {
         eventBus.stop();
     }
 
-//    @Test(groups = "fast")
     @Test
     public void testCreatePayment() throws AccountApiException {
-        final DateTime now = new DateTime();
+        final DateTime now = new DateTime(DateTimeZone.UTC);
         final Account account = testHelper.createTestAccount();
         final Invoice invoice = testHelper.createTestInvoice(account, now, Currency.USD);
         final BigDecimal amount = new BigDecimal("10.00");
@@ -84,6 +86,113 @@ public abstract class TestPaymentApi {
         PaymentInfo paymentInfo = results.get(0).getRight();
 
         assertNotNull(paymentInfo.getPaymentId());
-        assertEquals(paymentInfo.getAmount().doubleValue(), amount.doubleValue());
+        assertTrue(paymentInfo.getAmount().compareTo(amount) == 0);
+        assertNotNull(paymentInfo.getPaymentNumber());
+
+        PaymentAttempt paymentAttempt = paymentApi.getPaymentAttemptForPaymentId(paymentInfo.getPaymentId());
+        assertNotNull(paymentAttempt);
+        assertNotNull(paymentAttempt.getPaymentAttemptId());
+        assertEquals(paymentAttempt.getInvoiceId(), invoice.getId());
+        assertTrue(paymentAttempt.getAmount().compareTo(amount) == 0);
+        assertEquals(paymentAttempt.getCurrency(), Currency.USD);
+        assertEquals(paymentAttempt.getPaymentId(), paymentInfo.getPaymentId());
+        assertEquals(paymentAttempt.getPaymentAttemptDate().withMillisOfSecond(0), now.withMillisOfSecond(0));
+
+    }
+
+    private PaymentProviderAccount setupAccountWithPaymentMethod() throws AccountApiException {
+        final Account account = testHelper.createTestAccount();
+        paymentApi.createPaymentProviderAccount(account);
+
+        String accountKey = account.getExternalKey();
+
+        PaypalPaymentMethodInfo paymentMethod = new PaypalPaymentMethodInfo.Builder()
+                                                                           .setBaid("12345")
+                                                                           .setEmail(account.getEmail())
+                                                                           .setDefaultMethod(true)
+                                                                           .build();
+        Either<PaymentError, String> paymentMethodIdOrError = paymentApi.addPaymentMethod(accountKey, paymentMethod);
+
+        assertTrue(paymentMethodIdOrError.isRight());
+        assertNotNull(paymentMethodIdOrError.getRight());
+
+        Either<PaymentError, PaymentMethodInfo> paymentMethodInfoOrError = paymentApi.getPaymentMethod(accountKey, paymentMethodIdOrError.getRight());
+
+        assertTrue(paymentMethodInfoOrError.isRight());
+        assertNotNull(paymentMethodInfoOrError.getRight());
+
+        Either<PaymentError, PaymentProviderAccount> accountOrError = paymentApi.getPaymentProviderAccount(accountKey);
+
+        assertTrue(accountOrError.isRight());
+
+        return accountOrError.getRight();
+    }
+
+    @Test
+    public void testCreatePaymentMethod() throws AccountApiException {
+        PaymentProviderAccount account = setupAccountWithPaymentMethod();
+        assertNotNull(account);
+    }
+
+    @Test
+    public void testUpdatePaymentProviderAccountContact() throws AccountApiException {
+        final Account account = testHelper.createTestAccount();
+        paymentApi.createPaymentProviderAccount(account);
+
+        String newName = "Tester " + RandomStringUtils.randomAlphanumeric(10);
+        String newNumber = "888-888-" + RandomStringUtils.randomNumeric(4);
+
+        final Account accountToUpdate = new AccountBuilder(account.getId())
+                                                                  .name(newName)
+                                                                  .firstNameLength(newName.length())
+                                                                  .externalKey(account.getExternalKey())
+                                                                  .phone(newNumber)
+                                                                  .email(account.getEmail())
+                                                                  .currency(account.getCurrency())
+                                                                  .billingCycleDay(account.getBillCycleDay())
+                                                                  .build();
+
+        Either<PaymentError, Void> voidOrError = paymentApi.updatePaymentProviderAccountContact(accountToUpdate);
+        assertTrue(voidOrError.isRight());
+    }
+
+    @Test
+    public void testCannotDeleteDefaultPaymentMethod() throws AccountApiException {
+        PaymentProviderAccount account = setupAccountWithPaymentMethod();
+
+        Either<PaymentError, Void> errorOrVoid = paymentApi.deletePaymentMethod(account.getAccountKey(), account.getDefaultPaymentMethodId());
+
+        assertTrue(errorOrVoid.isLeft());
+    }
+
+    @Test
+    public void testDeleteNonDefaultPaymentMethod() throws AccountApiException {
+        final Account account = testHelper.createTestAccount();
+        paymentApi.createPaymentProviderAccount(account);
+
+        String accountKey = account.getExternalKey();
+
+        PaypalPaymentMethodInfo paymentMethod1 = new PaypalPaymentMethodInfo.Builder().setDefaultMethod(false).setBaid("12345").setEmail(account.getEmail()).build();
+        Either<PaymentError, String> paymentMethodIdOrError1 = paymentApi.addPaymentMethod(accountKey, paymentMethod1);
+
+        assertTrue(paymentMethodIdOrError1.isRight());
+        assertNotNull(paymentMethodIdOrError1.getRight());
+
+        PaypalPaymentMethodInfo paymentMethod2 = new PaypalPaymentMethodInfo.Builder().setDefaultMethod(true).setBaid("12345").setEmail(account.getEmail()).build();
+
+        Either<PaymentError, String> paymentMethodIdOrError2 = paymentApi.addPaymentMethod(accountKey, paymentMethod2);
+
+        assertTrue(paymentMethodIdOrError2.isRight());
+        assertNotNull(paymentMethodIdOrError2.getRight());
+
+        Either<PaymentError, List<PaymentMethodInfo>> paymentMethodsOrError = paymentApi.getPaymentMethods(accountKey);
+
+        assertTrue(paymentMethodsOrError.isRight());
+
+        Either<PaymentError, Void> errorOrVoid1 = paymentApi.deletePaymentMethod(accountKey, paymentMethodIdOrError1.getRight());
+        Either<PaymentError, Void> errorOrVoid2 = paymentApi.deletePaymentMethod(accountKey, paymentMethodIdOrError2.getRight());
+
+        assertTrue(errorOrVoid1.isRight());
+        assertTrue(errorOrVoid2.isLeft());
     }
 }
diff --git a/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java b/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
index 583fc1a..97e6136 100644
--- a/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
+++ b/payment/src/test/java/com/ning/billing/payment/provider/MockPaymentProviderPlugin.java
@@ -75,10 +75,9 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
     @Override
     public Either<PaymentError, String> createPaymentProviderAccount(Account account) {
         if (account != null) {
-            String id = String.valueOf(RandomStringUtils.random(10));
+            String id = String.valueOf(RandomStringUtils.randomAlphanumeric(10));
             accounts.put(account.getExternalKey(),
-                         new PaymentProviderAccount.Builder().setAccountNumber(String.valueOf(RandomStringUtils.random(10)))
-                                                             .setDefaultPaymentMethod(String.valueOf(RandomStringUtils.random(10)))
+                         new PaymentProviderAccount.Builder().setAccountKey(account.getExternalKey())
                                                              .setId(id)
                                                              .build());
 
@@ -102,30 +101,76 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
     @Override
     public Either<PaymentError, String> addPaymentMethod(String accountKey, PaymentMethodInfo paymentMethod) {
         if (paymentMethod != null) {
-            String paymentMethodId = RandomStringUtils.random(10);
-            PaymentMethodInfo realPaymentMethod = null;
-
-            if (paymentMethod instanceof PaypalPaymentMethodInfo) {
-                PaypalPaymentMethodInfo paypalPaymentMethod = (PaypalPaymentMethodInfo)paymentMethod;
-                realPaymentMethod = new PaypalPaymentMethodInfo.Builder(paypalPaymentMethod).setId(paymentMethodId).build();
-            }
-            else if (paymentMethod instanceof CreditCardPaymentMethodInfo) {
-                CreditCardPaymentMethodInfo ccPaymentMethod = (CreditCardPaymentMethodInfo)paymentMethod;
-                realPaymentMethod = new CreditCardPaymentMethodInfo.Builder(ccPaymentMethod).setId(paymentMethodId).build();
-            }
-            if (realPaymentMethod == null) {
-                return Either.left(new PaymentError("unsupported", "Payment method " + paymentMethod.getType() + " not supported by the plugin"));
-            }
-            else {
-                paymentMethods.put(paymentMethodId, paymentMethod);
-                return Either.right(paymentMethodId);
+            PaymentProviderAccount account = accounts.get(accountKey);
+
+            if (account != null && account.getId() != null) {
+                String existingDefaultMethod = account.getDefaultPaymentMethodId();
+
+                String paymentMethodId = RandomStringUtils.randomAlphanumeric(10);
+                boolean shouldBeDefault = Boolean.TRUE.equals(paymentMethod.getDefaultMethod()) || existingDefaultMethod == null;
+                PaymentMethodInfo realPaymentMethod = null;
+
+                if (paymentMethod instanceof PaypalPaymentMethodInfo) {
+                    PaypalPaymentMethodInfo paypalPaymentMethod = (PaypalPaymentMethodInfo)paymentMethod;
+
+                    realPaymentMethod = new PaypalPaymentMethodInfo.Builder(paypalPaymentMethod)
+                                                                   .setId(paymentMethodId)
+                                                                   .setAccountId(accountKey)
+                                                                   .setDefaultMethod(shouldBeDefault)
+                                                                   .setBaid(paypalPaymentMethod.getBaid())
+                                                                   .setEmail(paypalPaymentMethod.getEmail())
+                                                                   .build();
+                }
+                else if (paymentMethod instanceof CreditCardPaymentMethodInfo) {
+                    CreditCardPaymentMethodInfo ccPaymentMethod = (CreditCardPaymentMethodInfo)paymentMethod;
+                    realPaymentMethod = new CreditCardPaymentMethodInfo.Builder(ccPaymentMethod).setId(paymentMethodId).build();
+                }
+                if (realPaymentMethod == null) {
+                    return Either.left(new PaymentError("unsupported", "Payment method " + paymentMethod.getType() + " not supported by the plugin"));
+                }
+                else {
+                    if (shouldBeDefault) {
+                        setDefaultPaymentMethodOnAccount(account, paymentMethodId);
+                    }
+                    paymentMethods.put(paymentMethodId, realPaymentMethod);
+                    return Either.right(paymentMethodId);
+                }
             }
+                else {
+                    return Either.left(new PaymentError("noaccount", "Could not retrieve account for accountKey " + accountKey));
+                }
         }
         else {
             return Either.left(new PaymentError("unknown", "Could not create add payment method " + paymentMethod + " for " + accountKey));
         }
     }
 
+    public void setDefaultPaymentMethodOnAccount(PaymentProviderAccount account, String paymentMethodId) {
+        if (paymentMethodId != null && account != null) {
+            accounts.put(account.getAccountKey(),
+                new PaymentProviderAccount.Builder()
+                                          .copyFrom(account)
+                                          .setDefaultPaymentMethod(paymentMethodId)
+                                          .build());
+            List<PaymentMethodInfo> paymentMethodsToUpdate = new ArrayList<PaymentMethodInfo>();
+            for (PaymentMethodInfo paymentMethod : paymentMethods.values()) {
+                if (account.getAccountKey().equals(paymentMethod.getAccountId()) && !paymentMethodId.equals(paymentMethod.getId())) {
+                    if (paymentMethod instanceof PaypalPaymentMethodInfo) {
+                        PaypalPaymentMethodInfo paypalPaymentMethod = (PaypalPaymentMethodInfo)paymentMethod;
+                        paymentMethodsToUpdate.add(new PaypalPaymentMethodInfo.Builder(paypalPaymentMethod).setDefaultMethod(false).build());
+                    }
+                    else if (paymentMethod instanceof CreditCardPaymentMethodInfo) {
+                        CreditCardPaymentMethodInfo ccPaymentMethod = (CreditCardPaymentMethodInfo)paymentMethod;
+                        paymentMethodsToUpdate.add(new CreditCardPaymentMethodInfo.Builder(ccPaymentMethod).setDefaultMethod(false).build());
+                    }
+                }
+            }
+            for (PaymentMethodInfo paymentMethod : paymentMethodsToUpdate) {
+                paymentMethods.put(paymentMethod.getId(), paymentMethod);
+            }
+        }
+    }
+
     @Override
     public Either<PaymentError, PaymentMethodInfo> updatePaymentMethod(String accountKey, PaymentMethodInfo paymentMethod) {
         if (paymentMethod != null) {
@@ -154,17 +199,23 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
 
     @Override
     public Either<PaymentError, Void> deletePaymentMethod(String accountKey, String paymentMethodId) {
-        if (paymentMethods.remove(paymentMethodId) == null) {
-            return Either.left(new PaymentError("unknown", "Did not get any result back"));
-        }
-        else {
-            return Either.right(null);
+        PaymentMethodInfo paymentMethodInfo = paymentMethods.get(paymentMethodId);
+        if (paymentMethodInfo != null) {
+            if (Boolean.FALSE.equals(paymentMethodInfo.getDefaultMethod()) || paymentMethodInfo.getDefaultMethod() == null) {
+                if (paymentMethods.remove(paymentMethodId) == null) {
+                    return Either.left(new PaymentError("unknown", "Did not get any result back"));
+                }
+            }
+            else {
+                return Either.left(new PaymentError("error", "Cannot delete default payment method"));
+            }
         }
+        return Either.right(null);
     }
 
     @Override
     public Either<PaymentError, PaymentMethodInfo> getPaymentMethodInfo(String paymentMethodId) {
-        if (paymentMethodId != null) {
+        if (paymentMethodId == null) {
             return Either.left(new PaymentError("unknown", "Could not retrieve payment method for paymentMethodId " + paymentMethodId));
         }
 
@@ -172,12 +223,12 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
     }
 
     @Override
-    public Either<PaymentError, List<PaymentMethodInfo>> getPaymentMethods(final String accountId) {
+    public Either<PaymentError, List<PaymentMethodInfo>> getPaymentMethods(final String accountKey) {
 
         Collection<PaymentMethodInfo> filteredPaymentMethods = Collections2.filter(paymentMethods.values(), new Predicate<PaymentMethodInfo>() {
             @Override
             public boolean apply(PaymentMethodInfo input) {
-                return accountId.equals(input.getAccountId());
+                return accountKey.equals(input.getAccountId());
             }
         });
         List<PaymentMethodInfo> result = new ArrayList<PaymentMethodInfo>(filteredPaymentMethods);
@@ -190,7 +241,7 @@ public class MockPaymentProviderPlugin implements PaymentProviderPlugin {
     }
 
     @Override
-    public Either<PaymentError, Void> updatePaymentProviderAccountWithExistingContact(Account account) {
+    public Either<PaymentError, Void> updatePaymentProviderAccountExistingContact(Account account) {
         // nothing to do here
         return Either.right(null);
     }
diff --git a/payment/src/test/java/com/ning/billing/payment/TestHelper.java b/payment/src/test/java/com/ning/billing/payment/TestHelper.java
index 862d98c..2a1ce91 100644
--- a/payment/src/test/java/com/ning/billing/payment/TestHelper.java
+++ b/payment/src/test/java/com/ning/billing/payment/TestHelper.java
@@ -46,10 +46,11 @@ public class TestHelper {
     }
 
     public Account createTestAccount() throws AccountApiException {
-        final String name = "First" + RandomStringUtils.random(5) + " " + "Last" + RandomStringUtils.random(5);
+        final String name = "First" + RandomStringUtils.randomAlphanumeric(5) + " " + "Last" + RandomStringUtils.randomAlphanumeric(5);
+        final String externalKey = RandomStringUtils.randomAlphanumeric(10);
         final Account account = new AccountBuilder(UUID.randomUUID()).name(name)
                                                                      .firstNameLength(name.length())
-                                                                     .externalKey("12345")
+                                                                     .externalKey(externalKey)
                                                                      .phone("123-456-7890")
                                                                      .email("user@example.com")
                                                                      .currency(Currency.USD)