killbill-uncached

Merge pull request #439 from holkra/create-endpoint-for-refreshing-of-paymentmethods Create

12/1/2015 10:51:35 PM

Details

diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
index a26c775..dda153a 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
@@ -766,6 +766,35 @@ public class AccountResource extends JaxRsResourceBase {
     }
 
     @TimedResource
+    @POST
+    @Path("/{accountId:" + UUID_PATTERN + "}/" + PAYMENT_METHODS + "/refresh")
+    @Produces(APPLICATION_JSON)
+    @ApiOperation(value = "Refresh account payment methods")
+    @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid account id supplied"),
+                           @ApiResponse(code = 404, message = "Account not found")})
+    public Response refreshPaymentMethods(@PathParam("accountId") final String accountId,
+                                          @QueryParam(QUERY_PAYMENT_PLUGIN_NAME) final String pluginName,
+                                          @QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
+                                          @HeaderParam(HDR_CREATED_BY) final String createdBy,
+                                          @HeaderParam(HDR_REASON) final String reason,
+                                          @HeaderParam(HDR_COMMENT) final String comment,
+                                          @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException, PaymentApiException {
+        final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
+        final CallContext callContext = context.createContext(createdBy, reason, comment, request);
+
+        final Account account = accountUserApi.getAccountById(UUID.fromString(accountId), callContext);
+
+        if (pluginName != null && !pluginName.isEmpty()) {
+            paymentApi.refreshPaymentMethods(account, pluginName, pluginProperties, callContext);
+        } else {
+            paymentApi.refreshPaymentMethods(account, pluginProperties, callContext);
+        }
+
+        return Response.status(Status.OK).build();
+    }
+
+
+    @TimedResource
     @PUT
     @Consumes(APPLICATION_JSON)
     @Produces(APPLICATION_JSON)
diff --git a/payment/src/main/java/org/killbill/billing/payment/provider/ExternalPaymentProviderPlugin.java b/payment/src/main/java/org/killbill/billing/payment/provider/ExternalPaymentProviderPlugin.java
index fbd0fea..33f1e30 100644
--- a/payment/src/main/java/org/killbill/billing/payment/provider/ExternalPaymentProviderPlugin.java
+++ b/payment/src/main/java/org/killbill/billing/payment/provider/ExternalPaymentProviderPlugin.java
@@ -117,7 +117,7 @@ public class ExternalPaymentProviderPlugin implements PaymentPluginApi {
 
     @Override
     public List<PaymentMethodInfoPlugin> getPaymentMethods(final UUID kbAccountId, final boolean refreshFromGateway, final Iterable<PluginProperty> properties, final CallContext context) throws PaymentPluginApiException {
-        throw new PaymentPluginApiException("Not implemented", "");
+        return ImmutableList.<PaymentMethodInfoPlugin>of();
     }
 
     @Override
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
index 60072e8..c54bf1a 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
@@ -36,11 +36,14 @@ import org.killbill.billing.client.model.CustomField;
 import org.killbill.billing.client.model.InvoicePayments;
 import org.killbill.billing.client.model.PaymentMethod;
 import org.killbill.billing.client.model.PaymentMethodPluginDetail;
+import org.killbill.billing.client.model.PaymentMethods;
 import org.killbill.billing.client.model.Tag;
 import org.killbill.billing.util.api.AuditLevel;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import com.google.common.collect.ImmutableMap;
+
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
@@ -267,6 +270,37 @@ public class TestAccount extends TestJaxrsBase {
         assertEquals(remainingCustomFields.size(), 0);
     }
 
+    @Test(groups = "slow", description = "refresh payment methods")
+    public void testRefreshPaymentMethods() throws Exception {
+        Account account = createAccountWithDefaultPaymentMethod("someExternalKey");
+
+        final PaymentMethods paymentMethodsBeforeRefreshing = killBillClient.getPaymentMethodsForAccount(account.getAccountId());
+        assertEquals(1,  paymentMethodsBeforeRefreshing .size());
+        assertEquals("someExternalKey",  paymentMethodsBeforeRefreshing.get(0).getExternalKey());
+
+        // WITH NAME OF AN EXISTING PLUGIN
+        killBillClient.refreshPaymentMethods(account.getAccountId(), PLUGIN_NAME, ImmutableMap.<String, String>of(), createdBy, reason, comment);
+
+        final PaymentMethods paymentMethodsAfterExistingPluginCall = killBillClient.getPaymentMethodsForAccount(account.getAccountId());
+        assertEquals(1, paymentMethodsAfterExistingPluginCall.size());
+        assertEquals("someExternalKey", paymentMethodsAfterExistingPluginCall.get(0).getExternalKey());
+
+        // WITHOUT PLUGIN NAME
+        killBillClient.refreshPaymentMethods(account.getAccountId(), ImmutableMap.<String, String>of(), createdBy, reason, comment);
+
+        final PaymentMethods paymentMethodsAfterNoPluginNameCall = killBillClient.getPaymentMethodsForAccount(account.getAccountId());
+        assertEquals(1, paymentMethodsAfterNoPluginNameCall.size());
+        assertEquals("someExternalKey", paymentMethodsAfterNoPluginNameCall.get(0).getExternalKey());
+
+        // WITH WRONG PLUGIN NAME
+        try {
+            killBillClient.refreshPaymentMethods(account.getAccountId(), "GreatestPluginEver", ImmutableMap.<String, String>of(), createdBy, reason, comment);
+            Assert.fail();
+        } catch (KillBillClientException e) {
+            Assert.assertEquals(e.getBillingException().getCode(), (Integer) ErrorCode.PAYMENT_NO_SUCH_PAYMENT_PLUGIN.getCode());
+        }
+    }
+
     @Test(groups = "slow", description = "Can paginate through all accounts")
     public void testAccountsPagination() throws Exception {
         for (int i = 0; i < 5; i++) {