killbill-memoizeit

payment: enhance complete operations tests Add regression

8/11/2015 8:15:43 PM

Details

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 53e1606..3326bd3 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
@@ -386,7 +386,7 @@ public class PaymentProcessor extends ProcessorBase {
         final InternalTenantContext tenantContextWithAccountRecordId = getInternalTenantContextWithAccountRecordId(paymentModelDao.getAccountId(), tenantContext);
         final List<PaymentTransactionModelDao> transactionsForPayment = paymentDao.getTransactionsForPayment(paymentModelDao.getId(), tenantContextWithAccountRecordId);
 
-        return toPayment(paymentModelDao, transactionsForPayment, pluginTransactions, tenantContext);
+        return toPayment(paymentModelDao, transactionsForPayment, pluginTransactions, tenantContextWithAccountRecordId);
     }
 
     // Used in bulk get API (getAccountPayments)
diff --git a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
index 91d1d65..19c04f6 100644
--- a/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
+++ b/payment/src/test/java/org/killbill/billing/payment/api/TestPaymentApi.java
@@ -615,6 +615,7 @@ public class TestPaymentApi extends PaymentTestSuiteWithEmbeddedDB {
         for (final TransactionType transactionType : ImmutableList.<TransactionType>of(TransactionType.AUTHORIZE, TransactionType.PURCHASE, TransactionType.CREDIT)) {
             testApiWithPendingPaymentTransaction(transactionType, BigDecimal.TEN, BigDecimal.TEN);
             testApiWithPendingPaymentTransaction(transactionType, BigDecimal.TEN, BigDecimal.ONE);
+            // See https://github.com/killbill/killbill/issues/372
             testApiWithPendingPaymentTransaction(transactionType, BigDecimal.TEN, null);
         }
     }
@@ -647,6 +648,10 @@ public class TestPaymentApi extends PaymentTestSuiteWithEmbeddedDB {
                                                               callContext);
         verifyRefund(pendingRefund, paymentExternalKey, paymentTransactionExternalKey, refundTransactionExternalKey, requestedAmount, requestedAmount, TransactionStatus.PENDING);
 
+        // Test Janitor path (regression test for https://github.com/killbill/killbill/issues/363)
+        verifyPaymentViaGetPath(pendingRefund);
+
+        // See https://github.com/killbill/killbill/issues/372
         final Payment pendingRefund2 = paymentApi.createRefund(account,
                                                                payment.getId(),
                                                                null,
@@ -656,6 +661,8 @@ public class TestPaymentApi extends PaymentTestSuiteWithEmbeddedDB {
                                                                callContext);
         verifyRefund(pendingRefund2, paymentExternalKey, paymentTransactionExternalKey, refundTransactionExternalKey, requestedAmount, requestedAmount, TransactionStatus.PENDING);
 
+        verifyPaymentViaGetPath(pendingRefund2);
+
         // Note: we change the refund amount
         final Payment pendingRefund3 = paymentApi.createRefund(account,
                                                                payment.getId(),
@@ -666,6 +673,8 @@ public class TestPaymentApi extends PaymentTestSuiteWithEmbeddedDB {
                                                                callContext);
         verifyRefund(pendingRefund3, paymentExternalKey, paymentTransactionExternalKey, refundTransactionExternalKey, requestedAmount, refundAmount, TransactionStatus.PENDING);
 
+        verifyPaymentViaGetPath(pendingRefund3);
+
         // Pass null, we revert back to the original refund amount
         final Payment pendingRefund4 = paymentApi.createRefund(account,
                                                                payment.getId(),
@@ -676,6 +685,7 @@ public class TestPaymentApi extends PaymentTestSuiteWithEmbeddedDB {
                                                                callContext);
         verifyRefund(pendingRefund4, paymentExternalKey, paymentTransactionExternalKey, refundTransactionExternalKey, requestedAmount, requestedAmount, TransactionStatus.SUCCESS);
 
+        verifyPaymentViaGetPath(pendingRefund4);
     }
 
     private void verifyRefund(final Payment refund, final String paymentExternalKey, final String paymentTransactionExternalKey, final String refundTransactionExternalKey, final BigDecimal requestedAmount, final BigDecimal refundAmount, final TransactionStatus transactionStatus) {
@@ -707,6 +717,9 @@ public class TestPaymentApi extends PaymentTestSuiteWithEmbeddedDB {
         Assert.assertEquals(pendingPayment.getTransactions().get(0).getExternalKey(), paymentTransactionExternalKey);
         Assert.assertEquals(pendingPayment.getTransactions().get(0).getTransactionStatus(), TransactionStatus.PENDING);
 
+        // Test Janitor path (regression test for https://github.com/killbill/killbill/issues/363)
+        verifyPaymentViaGetPath(pendingPayment);
+
         final Payment pendingPayment2 = createPayment(transactionType, pendingPayment.getId(), paymentExternalKey, paymentTransactionExternalKey, pendingAmount, PaymentPluginStatus.PENDING);
         Assert.assertNotNull(pendingPayment2);
         Assert.assertEquals(pendingPayment2.getExternalKey(), paymentExternalKey);
@@ -717,6 +730,8 @@ public class TestPaymentApi extends PaymentTestSuiteWithEmbeddedDB {
         Assert.assertEquals(pendingPayment2.getTransactions().get(0).getExternalKey(), paymentTransactionExternalKey);
         Assert.assertEquals(pendingPayment2.getTransactions().get(0).getTransactionStatus(), TransactionStatus.PENDING);
 
+        verifyPaymentViaGetPath(pendingPayment2);
+
         final Payment completedPayment = createPayment(transactionType, pendingPayment.getId(), paymentExternalKey, paymentTransactionExternalKey, pendingAmount, PaymentPluginStatus.PROCESSED);
         Assert.assertNotNull(completedPayment);
         Assert.assertEquals(completedPayment.getExternalKey(), paymentExternalKey);
@@ -727,9 +742,38 @@ public class TestPaymentApi extends PaymentTestSuiteWithEmbeddedDB {
         Assert.assertEquals(completedPayment.getTransactions().get(0).getExternalKey(), paymentTransactionExternalKey);
         Assert.assertEquals(completedPayment.getTransactions().get(0).getTransactionStatus(), TransactionStatus.SUCCESS);
 
+        verifyPaymentViaGetPath(completedPayment);
+
         return completedPayment;
     }
 
+    private void verifyPaymentViaGetPath(final Payment payment) throws PaymentApiException {
+        // We can't use Assert.assertEquals because the updateDate may have been updated by the Janitor
+        final Payment refreshedPayment = paymentApi.getPayment(payment.getId(), true, ImmutableList.<PluginProperty>of(), callContext);
+
+        Assert.assertEquals(refreshedPayment.getAccountId(), payment.getAccountId());
+
+        Assert.assertEquals(refreshedPayment.getTransactions().size(), payment.getTransactions().size());
+        Assert.assertEquals(refreshedPayment.getExternalKey(), payment.getExternalKey());
+        Assert.assertEquals(refreshedPayment.getPaymentMethodId(), payment.getPaymentMethodId());
+        Assert.assertEquals(refreshedPayment.getAccountId(), payment.getAccountId());
+        Assert.assertEquals(refreshedPayment.getAuthAmount().compareTo(payment.getAuthAmount()), 0);
+        Assert.assertEquals(refreshedPayment.getCapturedAmount().compareTo(payment.getCapturedAmount()), 0);
+        Assert.assertEquals(refreshedPayment.getPurchasedAmount().compareTo(payment.getPurchasedAmount()), 0);
+        Assert.assertEquals(refreshedPayment.getRefundedAmount().compareTo(payment.getRefundedAmount()), 0);
+        Assert.assertEquals(refreshedPayment.getCurrency(), payment.getCurrency());
+
+        for (int i = 0; i < refreshedPayment.getTransactions().size(); i++) {
+            final PaymentTransaction refreshedPaymentTransaction = refreshedPayment.getTransactions().get(i);
+            final PaymentTransaction paymentTransaction = payment.getTransactions().get(i);
+            Assert.assertEquals(refreshedPaymentTransaction.getAmount().compareTo(paymentTransaction.getAmount()), 0);
+            Assert.assertEquals(refreshedPaymentTransaction.getProcessedAmount().compareTo(paymentTransaction.getProcessedAmount()), 0);
+            Assert.assertEquals(refreshedPaymentTransaction.getCurrency(), paymentTransaction.getCurrency());
+            Assert.assertEquals(refreshedPaymentTransaction.getExternalKey(), paymentTransaction.getExternalKey());
+            Assert.assertEquals(refreshedPaymentTransaction.getTransactionStatus(), paymentTransaction.getTransactionStatus());
+        }
+    }
+
     private Payment createPayment(final TransactionType transactionType,
                                   @Nullable final UUID paymentId,
                                   @Nullable final String paymentExternalKey,
diff --git a/payment/src/test/java/org/killbill/billing/payment/provider/MockPaymentProviderPlugin.java b/payment/src/test/java/org/killbill/billing/payment/provider/MockPaymentProviderPlugin.java
index bd323a4..9e8243d 100644
--- a/payment/src/test/java/org/killbill/billing/payment/provider/MockPaymentProviderPlugin.java
+++ b/payment/src/test/java/org/killbill/billing/payment/provider/MockPaymentProviderPlugin.java
@@ -317,7 +317,7 @@ public class MockPaymentProviderPlugin implements NoOpPaymentPluginApi {
     }
 
     @Override
-    public PaymentTransactionInfoPlugin refundPayment(final UUID kbAccountId, final UUID kbPaymentId, final UUID kbPaymentMethodId, final UUID kbTransactionId, final BigDecimal refundAmount, final Currency currency, final Iterable<PluginProperty> properties, final CallContext context) throws PaymentPluginApiException {
+    public PaymentTransactionInfoPlugin refundPayment(final UUID kbAccountId, final UUID kbPaymentId, final UUID kbTransactionId, final UUID kbPaymentMethodId, final BigDecimal refundAmount, final Currency currency, final Iterable<PluginProperty> properties, final CallContext context) throws PaymentPluginApiException {
 
         final InternalPaymentInfo info = payments.get(kbPaymentId.toString());
         if (info == null) {