protected PaymentTransaction getPaymentTransaction(final UUID kbTransactionId, final Payment payment) throws OSGIServiceNotAvailable { return Iterables.<PaymentTransaction>find(payment.getTransactions(), new Predicate<PaymentTransaction>() { @Override public boolean apply(final PaymentTransaction input) { return kbTransactionId.equals(input.getId()); } }); }
@Override public Iterable<PaymentTransaction> apply(final Payment input) { return Iterables.filter(input.getTransactions(), new Predicate<PaymentTransaction>() { @Override public boolean apply(final PaymentTransaction input) { return input.getTransactionType() == transactionType; } }); } }));
public static PaymentTransaction filterForLastTransaction(final Payment payment) { final int numberOfTransaction = payment.getTransactions().size(); return payment.getTransactions().get(numberOfTransaction - 1); }
public static PaymentTransaction filterForTransaction(final Payment payment, final UUID kbTransactionId) { for (final PaymentTransaction paymentTransaction : payment.getTransactions()) { if (paymentTransaction.getId().equals(kbTransactionId)) { return paymentTransaction; } } return null; }
public static PaymentTransaction filterForTransaction(final Payment payment, final TransactionType transactionType) { for (final PaymentTransaction paymentTransaction : payment.getTransactions()) { if (paymentTransaction.getTransactionType().equals(transactionType)) { return paymentTransaction; } } return null; } }
private PaymentTransaction getRefundTransaction(final Payment payment) { return Iterables.tryFind(payment.getTransactions(), new Predicate<PaymentTransaction>() { @Override public boolean apply(final PaymentTransaction input) { return input.getTransactionType() == TransactionType.REFUND; } }).get(); }
private PaymentTransaction getPurchaseTransaction(final Payment payment) { return Iterables.tryFind(payment.getTransactions(), new Predicate<PaymentTransaction>() { @Override public boolean apply(final PaymentTransaction input) { return input.getTransactionType() == TransactionType.PURCHASE; } }).get(); }
private void verifyRefund(final Payment refund, final String paymentExternalKey, final String paymentTransactionExternalKey, final String refundTransactionExternalKey, final BigDecimal requestedAmount, final BigDecimal refundAmount, final TransactionStatus transactionStatus) { Assert.assertEquals(refund.getExternalKey(), paymentExternalKey); Assert.assertEquals(refund.getTransactions().size(), 2); Assert.assertEquals(refund.getTransactions().get(0).getAmount().compareTo(requestedAmount), 0); Assert.assertEquals(refund.getTransactions().get(0).getProcessedAmount().compareTo(requestedAmount), 0); Assert.assertEquals(refund.getTransactions().get(0).getCurrency(), account.getCurrency()); Assert.assertEquals(refund.getTransactions().get(0).getExternalKey(), paymentTransactionExternalKey); Assert.assertEquals(refund.getTransactions().get(0).getTransactionStatus(), TransactionStatus.SUCCESS); Assert.assertEquals(refund.getTransactions().get(1).getAmount().compareTo(requestedAmount), 0); Assert.assertEquals(refund.getTransactions().get(1).getProcessedAmount().compareTo(refundAmount), 0); Assert.assertEquals(refund.getTransactions().get(1).getCurrency(), account.getCurrency()); Assert.assertEquals(refund.getTransactions().get(1).getExternalKey(), refundTransactionExternalKey); Assert.assertEquals(refund.getTransactions().get(1).getTransactionStatus(), transactionStatus); }
protected Payment createChargeBackReversalAndCheckForCompletion(final Account account, final Payment payment, final NextEvent... events) { final PaymentTransaction chargeback = Iterables.<PaymentTransaction>find(Lists.<PaymentTransaction>reverse(payment.getTransactions()), new Predicate<PaymentTransaction>() { @Override public boolean apply(final PaymentTransaction input) { return TransactionType.CHARGEBACK.equals(input.getTransactionType()) && TransactionStatus.SUCCESS.equals(input.getTransactionStatus()); } }); return createChargeBackReversalAndCheckForCompletion(account, payment, chargeback.getExternalKey(), events); }
@Test(groups = "slow", description = "Verify we can make a refund on payment whose original payment method was deleted. See 694") public void testRefundAfterDeletedPaymentMethod() throws PaymentApiException { final BigDecimal requestedAmount = BigDecimal.TEN; final Payment payment = paymentApi.createPurchase(account, account.getPaymentMethodId(), null, requestedAmount, Currency.EUR, null, UUID.randomUUID().toString(), UUID.randomUUID().toString(), ImmutableList.<PluginProperty>of(), callContext); paymentApi.deletePaymentMethod(account, account.getPaymentMethodId(), false, true, ImmutableList.<PluginProperty>of(), callContext); final Payment newPayment = paymentApi.createRefund(account, payment.getId(),requestedAmount, Currency.EUR, null, UUID.randomUUID().toString(), ImmutableList.<PluginProperty>of(), callContext); Assert.assertEquals(newPayment.getTransactions().size(), 2); }
@Test(groups = "slow") public void testPurchase() throws Exception { final String paymentExternalKey = UUID.randomUUID().toString(); // PURCHASE final String purchaseKey = UUID.randomUUID().toString(); final Payment purchase = paymentProcessor.createPurchase(true, null, account, null, null, TEN, CURRENCY, null,paymentExternalKey, purchaseKey, null, null, SHOULD_LOCK_ACCOUNT, PLUGIN_PROPERTIES, callContext, internalCallContext); verifyPayment(purchase, paymentExternalKey, ZERO, ZERO, ZERO, 1); final UUID paymentId = purchase.getId(); verifyPaymentTransaction(purchase.getTransactions().get(0), purchaseKey, TransactionType.PURCHASE, TEN, paymentId); paymentBusListener.verify(1, account.getId(), paymentId, TEN, TransactionStatus.SUCCESS); }
@Test(groups = "slow") public void testCredit() throws Exception { final String paymentExternalKey = UUID.randomUUID().toString(); // CREDIT final String creditKey = UUID.randomUUID().toString(); final Payment purchase = paymentProcessor.createCredit(true, null, account, null, null, TEN, CURRENCY, null,paymentExternalKey, creditKey, null, null, SHOULD_LOCK_ACCOUNT, PLUGIN_PROPERTIES, callContext, internalCallContext); verifyPayment(purchase, paymentExternalKey, ZERO, ZERO, ZERO, 1); final UUID paymentId = purchase.getId(); verifyPaymentTransaction(purchase.getTransactions().get(0), creditKey, TransactionType.CREDIT, TEN, paymentId); paymentBusListener.verify(1, account.getId(), paymentId, TEN, TransactionStatus.SUCCESS); }
@Override public Object execute() throws Throwable { assertEquals(DBRouterUntyped.getCurrentState(), THREAD_STATE.RO_ALLOWED); final Payment retrievedPayment2 = paymentApi.getPayment(payment.getId(), true, false, ImmutableList.<PluginProperty>of(), callContext); Assert.assertEquals(retrievedPayment2.getTransactions().get(0).getTransactionStatus(), TransactionStatus.SUCCESS); // No thread switch, RO as well assertEquals(mockPaymentProviderPlugin.getLastThreadState(), THREAD_STATE.RO_ALLOWED); assertEquals(DBRouterUntyped.getCurrentState(), THREAD_STATE.RO_ALLOWED); return null; } });
private void verifyPayment(final Payment payment, final String paymentExternalKey, final BigDecimal authAmount, final BigDecimal capturedAmount, final BigDecimal refundedAmount, final int transactionsSize) { Assert.assertEquals(payment.getAccountId(), account.getId()); // We cannot assume the number to be 1 here as the auto_increment implementation // depends on the database. On h2, it is implemented as a sequence, and the payment number // would be 33, 34, 35, etc. depending on the test // See also http://h2database.com/html/grammar.html#create_sequence Assert.assertTrue(payment.getPaymentNumber() > 0); Assert.assertEquals(payment.getExternalKey(), paymentExternalKey); Assert.assertEquals(payment.getAuthAmount().compareTo(authAmount), 0); Assert.assertEquals(payment.getCapturedAmount().compareTo(capturedAmount), 0); Assert.assertEquals(payment.getRefundedAmount().compareTo(refundedAmount), 0); Assert.assertEquals(payment.getCurrency(), CURRENCY); Assert.assertEquals(payment.getTransactions().size(), transactionsSize); }
@Test(groups = "slow") public void testVerifyJanitorFromPendingDuringCompletionFlow() throws PaymentApiException { final BigDecimal authAmount = BigDecimal.TEN; final String transactionExternalKey = UUID.randomUUID().toString(); final Payment initialPayment = createPayment(TransactionType.AUTHORIZE, null, UUID.randomUUID().toString(), transactionExternalKey, authAmount, PaymentPluginStatus.PENDING); Assert.assertEquals(initialPayment.getTransactions().get(0).getTransactionStatus(), TransactionStatus.PENDING); mockPaymentProviderPlugin.overridePaymentPluginStatus(initialPayment.getId(), initialPayment.getTransactions().get(0).getId(), PaymentPluginStatus.PROCESSED); try { final Payment completedPayment = createPayment(TransactionType.AUTHORIZE, initialPayment.getId(), initialPayment.getExternalKey(), transactionExternalKey, authAmount, PaymentPluginStatus.PROCESSED); Assert.fail(); } catch (final PaymentApiException e) { Assert.assertEquals(e.getCode(), ErrorCode.PAYMENT_ACTIVE_TRANSACTION_KEY_EXISTS.getCode()); } }
@Test(groups = "slow") public void testVerifyJanitorFromUnknownDuringCompletionFlow() throws PaymentApiException { final BigDecimal authAmount = BigDecimal.TEN; final String transactionExternalKey = UUID.randomUUID().toString(); final Payment initialPayment = createPayment(TransactionType.AUTHORIZE, null, UUID.randomUUID().toString(), transactionExternalKey, authAmount, PaymentPluginStatus.UNDEFINED); Assert.assertEquals(initialPayment.getTransactions().get(0).getTransactionStatus(), TransactionStatus.UNKNOWN); mockPaymentProviderPlugin.overridePaymentPluginStatus(initialPayment.getId(), initialPayment.getTransactions().get(0).getId(), PaymentPluginStatus.PROCESSED); try { final Payment completedPayment = createPayment(TransactionType.AUTHORIZE, initialPayment.getId(), initialPayment.getExternalKey(), transactionExternalKey, authAmount, PaymentPluginStatus.PROCESSED); Assert.fail(); } catch (final PaymentApiException e) { Assert.assertEquals(e.getCode(), ErrorCode.PAYMENT_ACTIVE_TRANSACTION_KEY_EXISTS.getCode()); } }
@Test(groups = "slow") public void testGetAccountPaymentsWithJanitor() throws Exception { final String paymentExternalKey = UUID.randomUUID().toString(); final Iterable<PluginProperty> pluginPropertiesToDriveTransationToUnknown = ImmutableList.<PluginProperty>of(new PluginProperty(MockPaymentProviderPlugin.PLUGIN_PROPERTY_PAYMENT_PLUGIN_STATUS_OVERRIDE, PaymentPluginStatus.UNDEFINED, false)); final String authorizationKey = UUID.randomUUID().toString(); final Payment authorization = paymentProcessor.createAuthorization(true, null, account, null, null, TEN, CURRENCY, null, paymentExternalKey, authorizationKey, null, null, SHOULD_LOCK_ACCOUNT, pluginPropertiesToDriveTransationToUnknown, callContext, internalCallContext); verifyPayment(authorization, paymentExternalKey, ZERO, ZERO, ZERO, 1); final UUID paymentId = authorization.getId(); verifyPaymentTransaction(authorization.getTransactions().get(0), authorizationKey, TransactionType.AUTHORIZE, TEN, paymentId); paymentBusListener.verify(0, 0, 1, account.getId(), paymentId, ZERO, TransactionStatus.UNKNOWN); mockPaymentProviderPlugin.overridePaymentPluginStatus(paymentId, authorization.getTransactions().get(0).getId(), PaymentPluginStatus.PROCESSED); final List<Payment> payments = paymentControlAwareRefresher.getAccountPayments(account.getId(), true, false, callContext, internalCallContext); Assert.assertEquals(payments.size(), 1); verifyPayment(payments.get(0), paymentExternalKey, TEN, ZERO, ZERO, 1); verifyPaymentTransaction(payments.get(0).getTransactions().get(0), authorizationKey, TransactionType.AUTHORIZE, TEN, paymentId); paymentBusListener.verify(1, 0, 1, account.getId(), paymentId, TEN, TransactionStatus.SUCCESS); }
@Test(groups = "slow") public void testCreateAuthWithControl() throws PaymentApiException { final PaymentMethodPlugin paymentMethodInfo = new DefaultNoOpPaymentMethodPlugin(UUID.randomUUID().toString(), false, null); final UUID newPaymentMethodId = paymentApi.addPaymentMethod(account, null, MockPaymentProviderPlugin.PLUGIN_NAME, false, paymentMethodInfo, ImmutableList.<PluginProperty>of(), callContext); testPaymentControlPluginApi.setNewPaymentMethodId(newPaymentMethodId); final Payment payment = paymentApi.createAuthorizationWithPaymentControl(account, account.getPaymentMethodId(), null, BigDecimal.TEN, Currency.USD, null,null, UUID.randomUUID().toString(), ImmutableList.<PluginProperty>of(), PAYMENT_OPTIONS, callContext); Assert.assertEquals(payment.getPaymentMethodId(), newPaymentMethodId); verifyOnSuccess(payment.getId(), payment.getExternalKey(), payment.getTransactions().get(0).getId(), payment.getTransactions().get(0).getExternalKey(), BigDecimal.TEN, Currency.USD); }
/** * ******************************************** PAYMENT ******************************************************* */ public void checkPaymentCreated(final Payment payment, final CallContext context) { final List<AuditLog> paymentLogs = getAuditLogForPayment(payment, context); Assert.assertEquals(paymentLogs.size(), 2); checkAuditLog(ChangeType.INSERT, context, paymentLogs.get(0), payment.getId(), PaymentSqlDao.class, true, false); checkAuditLog(ChangeType.UPDATE, context, paymentLogs.get(1), payment.getId(), PaymentSqlDao.class, true, false); for (PaymentTransaction cur : payment.getTransactions()) { final List<AuditLog> auditLogs = getAuditLogForPaymentTransaction(payment, cur, context); Assert.assertEquals(auditLogs.size(), 2); checkAuditLog(ChangeType.INSERT, context, auditLogs.get(0), cur.getId(), TransactionSqlDao.class, true, false); checkAuditLog(ChangeType.UPDATE, context, auditLogs.get(1), cur.getId(), TransactionSqlDao.class, true, false); } }
public PaymentJson(final Payment dp, @Nullable final AccountAuditLogs accountAuditLogs) { this(dp.getAccountId(), dp.getId(), dp.getPaymentNumber().toString(), dp.getExternalKey(), dp.getAuthAmount(), dp.getCapturedAmount(), dp.getPurchasedAmount(), dp.getRefundedAmount(), dp.getCreditedAmount(), dp.getCurrency() != null ? dp.getCurrency() : null, dp.getPaymentMethodId(), getTransactions(dp.getTransactions(), dp.getExternalKey(), accountAuditLogs), getAttempts(dp.getPaymentAttempts(), dp.getExternalKey(), accountAuditLogs), toAuditLogJson(accountAuditLogs == null ? null : accountAuditLogs.getAuditLogsForPayment(dp.getId()))); }