Details
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
index db46039..4ed782a 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
@@ -106,13 +106,14 @@ public class PaymentResource extends ComboPaymentResource {
@ApiResponse(code = 404, message = "Payment not found")})
public Response getPayment(@PathParam("paymentId") final String paymentIdStr,
@QueryParam(QUERY_WITH_PLUGIN_INFO) @DefaultValue("false") final Boolean withPluginInfo,
+ @QueryParam(QUERY_WITH_ATTEMPTS) @DefaultValue("false") final Boolean withAttempts,
@QueryParam(QUERY_PLUGIN_PROPERTY) final List<String> pluginPropertiesString,
@QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode,
@javax.ws.rs.core.Context final HttpServletRequest request) throws PaymentApiException {
final Iterable<PluginProperty> pluginProperties = extractPluginProperties(pluginPropertiesString);
final UUID paymentIdId = UUID.fromString(paymentIdStr);
final TenantContext tenantContext = context.createContext(request);
- final Payment payment = paymentApi.getPayment(paymentIdId, withPluginInfo, false, pluginProperties, tenantContext);
+ final Payment payment = paymentApi.getPayment(paymentIdId, withPluginInfo, withAttempts, pluginProperties, tenantContext);
final AccountAuditLogs accountAuditLogs = auditUserApi.getAccountAuditLogs(payment.getAccountId(), auditMode.getLevel(), tenantContext);
final PaymentJson result = new PaymentJson(payment, accountAuditLogs);
return Response.status(Response.Status.OK).entity(result).build();
diff --git a/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java b/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java
index 84e4e85..caaef43 100644
--- a/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java
+++ b/payment/src/main/java/org/killbill/billing/payment/core/PaymentProcessor.java
@@ -267,7 +267,7 @@ public class PaymentProcessor extends ProcessorBase {
@Override
public Payment apply(final PaymentModelDao paymentModelDao) {
final List<PaymentTransactionInfoPlugin> pluginInfo = getPaymentTransactionInfoPluginsIfNeeded(pluginApi, paymentModelDao, tenantContext);
- return toPayment(paymentModelDao.getId(), pluginInfo, internalTenantContext);
+ return toPayment(paymentModelDao.getId(), pluginInfo, withAttempts, internalTenantContext);
}
}
);
@@ -298,7 +298,7 @@ public class PaymentProcessor extends ProcessorBase {
new Function<PaymentModelDao, Payment>() {
@Override
public Payment apply(final PaymentModelDao paymentModelDao) {
- return toPayment(paymentModelDao.getId(), null, internalTenantContext);
+ return toPayment(paymentModelDao.getId(), null, withAttempts, internalTenantContext);
}
}
);
@@ -341,7 +341,7 @@ public class PaymentProcessor extends ProcessorBase {
cachedPaymentTransactions.add(pluginTransaction);
return null;
} else {
- final Payment result = toPayment(pluginTransaction.getKbPaymentId(), withPluginInfo ? ImmutableList.<PaymentTransactionInfoPlugin>copyOf(cachedPaymentTransactions) : ImmutableList.<PaymentTransactionInfoPlugin>of(), internalTenantContext);
+ final Payment result = toPayment(pluginTransaction.getKbPaymentId(), withPluginInfo ? ImmutableList.<PaymentTransactionInfoPlugin>copyOf(cachedPaymentTransactions) : ImmutableList.<PaymentTransactionInfoPlugin>of(), withAttempts, internalTenantContext);
cachedPaymentTransactions.clear();
cachedPaymentTransactions.add(pluginTransaction);
return result;
@@ -512,14 +512,14 @@ public class PaymentProcessor extends ProcessorBase {
}
// Used in bulk get APIs (getPayments / searchPayments)
- private Payment toPayment(final UUID paymentId, @Nullable final Iterable<PaymentTransactionInfoPlugin> pluginTransactions, final InternalTenantContext tenantContext) {
+ private Payment toPayment(final UUID paymentId, @Nullable final Iterable<PaymentTransactionInfoPlugin> pluginTransactions, final boolean withAttempts, final InternalTenantContext tenantContext) {
final PaymentModelDao paymentModelDao = paymentDao.getPayment(paymentId, tenantContext);
if (paymentModelDao == null) {
log.warn("Unable to find payment id " + paymentId);
return null;
}
- return toPayment(paymentModelDao, pluginTransactions, false, tenantContext);
+ return toPayment(paymentModelDao, pluginTransactions, withAttempts, tenantContext);
}
// Used in single get APIs (getPayment / getPaymentByExternalKey)
@@ -575,6 +575,7 @@ public class PaymentProcessor extends ProcessorBase {
// Used in bulk get API (getAccountPayments)
private Payment toPayment(final PaymentModelDao curPaymentModelDao, final Collection<PaymentTransactionModelDao> curTransactionsModelDao, @Nullable final Iterable<PaymentTransactionInfoPlugin> pluginTransactions, final boolean withAttempts, final InternalTenantContext internalTenantContext) {
final Collection<PaymentTransactionModelDao> transactionsModelDao = new LinkedList<PaymentTransactionModelDao>(curTransactionsModelDao);
+ invokeJanitor(curPaymentModelDao, transactionsModelDao, pluginTransactions, internalTenantContext);
final Collection<PaymentTransaction> transactions = new LinkedList<PaymentTransaction>();
for (final PaymentTransactionModelDao newPaymentTransactionModelDao : transactionsModelDao) {
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
index cb6112d..d9d5233 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPayment.java
@@ -19,6 +19,7 @@ package org.killbill.billing.jaxrs;
import java.math.BigDecimal;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@@ -44,6 +45,7 @@ import org.killbill.billing.payment.plugin.api.PaymentPluginApi;
import org.killbill.billing.payment.plugin.api.PaymentPluginStatus;
import org.killbill.billing.payment.provider.MockPaymentControlProviderPlugin;
import org.killbill.billing.payment.provider.MockPaymentProviderPlugin;
+import org.killbill.billing.util.api.AuditLevel;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
@@ -151,7 +153,7 @@ public class TestPayment extends TestJaxrsBase {
}
@Test(groups = "slow")
- public void testWithFailedPaymentAndScheduledAttempts() throws Exception {
+ public void testWithFailedPaymentAndScheduledAttemptsGetInvoicePayment() throws Exception {
mockPaymentProviderPlugin.makeNextPaymentFailWithError();
final Account account = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
// Getting Invoice #2 (first after Trial period)
@@ -174,6 +176,88 @@ public class TestPayment extends TestJaxrsBase {
}
@Test(groups = "slow")
+ public void testWithFailedPaymentAndScheduledAttemptsGetPaymentsForAccount() throws Exception {
+ mockPaymentProviderPlugin.makeNextPaymentFailWithError();
+ final Account account = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+
+ HashMultimap<String, String> queryParams = HashMultimap.create();
+ queryParams.put("withAttempts", "true");
+ RequestOptions inputOptions = RequestOptions.builder()
+ .withCreatedBy(createdBy)
+ .withReason(reason)
+ .withComment(comment)
+ .withQueryParams(queryParams).build();
+
+ Payments payments = killBillClient.getPaymentsForAccount(account.getAccountId(), inputOptions);
+
+ Assert.assertNotNull(payments.get(0).getPaymentAttempts());
+ Assert.assertEquals(payments.get(0).getPaymentAttempts().get(0).getStateName(), "RETRIED");
+ Assert.assertEquals(payments.get(0).getPaymentAttempts().get(1).getStateName(), "SCHEDULED");
+ }
+
+ @Test(groups = "slow")
+ public void testWithFailedPaymentAndScheduledAttemptsGetPayments() throws Exception {
+ mockPaymentProviderPlugin.makeNextPaymentFailWithError();
+ createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+
+ HashMultimap<String, String> queryParams = HashMultimap.create();
+ queryParams.put("withAttempts", "true");
+ RequestOptions inputOptions = RequestOptions.builder()
+ .withCreatedBy(createdBy)
+ .withReason(reason)
+ .withComment(comment)
+ .withQueryParams(queryParams).build();
+
+ Payments payments = killBillClient.getPayments(0L, 100L, null, new HashMap<String, String>(), AuditLevel.NONE, inputOptions);
+
+ Assert.assertNotNull(payments.get(0).getPaymentAttempts());
+ Assert.assertEquals(payments.get(0).getPaymentAttempts().get(0).getStateName(), "RETRIED");
+ Assert.assertEquals(payments.get(0).getPaymentAttempts().get(1).getStateName(), "SCHEDULED");
+ }
+
+ @Test(groups = "slow")
+ public void testWithFailedPaymentAndScheduledAttemptsSearchPayments() throws Exception {
+ mockPaymentProviderPlugin.makeNextPaymentFailWithError();
+ createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+
+ HashMultimap<String, String> queryParams = HashMultimap.create();
+ queryParams.put("withAttempts", "true");
+ RequestOptions inputOptions = RequestOptions.builder()
+ .withCreatedBy(createdBy)
+ .withReason(reason)
+ .withComment(comment)
+ .withQueryParams(queryParams).build();
+
+ Payments payments = killBillClient.searchPayments("1", 0L, 100L, AuditLevel.NONE, inputOptions);
+
+ Assert.assertNotNull(payments.get(0).getPaymentAttempts());
+ Assert.assertEquals(payments.get(0).getPaymentAttempts().get(0).getStateName(), "RETRIED");
+ Assert.assertEquals(payments.get(0).getPaymentAttempts().get(1).getStateName(), "SCHEDULED");
+ }
+
+ @Test(groups = "slow")
+ public void testWithFailedPaymentAndScheduledAttemptsGetPaymentById() throws Exception {
+ mockPaymentProviderPlugin.makeNextPaymentFailWithError();
+ createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
+
+ HashMultimap<String, String> queryParams = HashMultimap.create();
+ queryParams.put("withAttempts", "true");
+ RequestOptions inputOptions = RequestOptions.builder()
+ .withCreatedBy(createdBy)
+ .withReason(reason)
+ .withComment(comment)
+ .withQueryParams(queryParams).build();
+
+ Payments payments = killBillClient.searchPayments("", 0L, 100L, AuditLevel.NONE, inputOptions);
+ Assert.assertNotNull(payments.get(0));
+ Payment payment = killBillClient.getPayment(payments.get(0).getPaymentId(), inputOptions);
+
+ Assert.assertNotNull(payment.getPaymentAttempts());
+ Assert.assertEquals(payment.getPaymentAttempts().get(0).getStateName(), "RETRIED");
+ Assert.assertEquals(payment.getPaymentAttempts().get(1).getStateName(), "SCHEDULED");
+ }
+
+ @Test(groups = "slow")
public void testCreateRetrievePayment() throws Exception {
final Account account = createAccountWithDefaultPaymentMethod();
final String externalPaymentKey = UUID.randomUUID().toString();