public void TestChargeFailedBankAccountError() { var e = new StripeEvent { LiveMode = true, Type = "charge.failed", Created = DateTime.Now.AddDays(-1), Data = new StripeEventData { Object = JObject.FromObject(new StripeCharge { Id = "9876", FailureCode = "invalid_routing_number", FailureMessage = "description from stripe", Source = new StripeSource() { Object = "bank_account" }, Refunds = new StripeList <StripeRefund> { Data = new List <StripeRefund> { new StripeRefund { Id = "re999" } } } }) } }; var stripeRefund = new StripeRefundData(); _donationService.Setup(mocked => mocked.UpdateDonationStatus("9876", 777, e.Created, "invalid_routing_number: description from stripe")).Returns(123); _donationService.Setup(mocked => mocked.ProcessDeclineEmail("9876")); _paymentProcessorService.Setup(mocked => mocked.GetRefund("re999")).Returns(stripeRefund); _donationService.Setup(mocked => mocked.CreateDonationForBankAccountErrorRefund(It.Is <StripeRefund>(r => r.Data != null && r.Data.Any() && r.Data[0] == stripeRefund))) .Returns(123); Assert.IsNull(_fixture.ProcessStripeEvent(e)); _paymentProcessorService.VerifyAll(); _donationService.VerifyAll(); }
public void TestTransferPaid() { var transfer = new StripeTransfer { Id = "tx9876", Amount = 1443 }; var e = new StripeEvent { LiveMode = true, Type = "transfer.paid", Created = DateTime.Now.AddDays(-1), Data = new StripeEventData { Object = JObject.FromObject(transfer) } }; var paymentmetadata = new Dictionary <string, object> { { "crossroads_transaction_type", "payment" } }; var donationmetadata = new Dictionary <string, object> { { "crossroads_transaction_type", "donation" } }; var dateCreated = DateTime.Now; var charges = new List <StripeCharge> { new StripeCharge { Id = "ch111", Amount = 111, Fee = 1, Type = "charge", Created = dateCreated.AddDays(1), Metadata = paymentmetadata }, new StripeCharge { Id = "ch222", Amount = 222, Fee = 2, Type = "charge", Created = dateCreated.AddDays(2), Metadata = paymentmetadata }, new StripeCharge { Id = "ch333", Amount = 333, Fee = 3, Type = "charge", Created = dateCreated.AddDays(3), Metadata = donationmetadata }, new StripeCharge { Id = "ch777", Amount = 777, Fee = 7, Type = "charge", Created = dateCreated.AddDays(4), Metadata = donationmetadata }, new StripeCharge { Id = "ch888", Amount = 888, Fee = 8, Type = "charge", Created = dateCreated.AddDays(5), Metadata = donationmetadata }, new StripeCharge { Id = "re999", Amount = 999, Fee = 9, Type = "payment_refund", Created = dateCreated.AddDays(8), Metadata = donationmetadata }, new StripeCharge { Id = "ch444", Amount = 444, Fee = 4, Type = "charge", Created = dateCreated.AddDays(6), Metadata = donationmetadata }, new StripeCharge { Id = "ch555", Amount = 555, Fee = 5, Type = "refund", Created = dateCreated.AddDays(7), Metadata = donationmetadata } }; _paymentService.Setup(mocked => mocked.GetPaymentByTransactionCode("ch111")).Returns(new PaymentDTO { PaymentId = 1111, BatchId = null, Status = DonationStatus.Pending }); _paymentService.Setup(mocked => mocked.GetPaymentByTransactionCode("ch222")).Returns(new PaymentDTO { PaymentId = 2222, BatchId = null, Status = DonationStatus.Pending }); _donationService.Setup(mocked => mocked.GetDonationByProcessorPaymentId("ch333")).Returns(new DonationDTO { Id = "3333", BatchId = null, Status = DonationStatus.Pending }); _donationService.Setup(mocked => mocked.GetDonationByProcessorPaymentId("ch444")).Throws(new Exception("Not gonna do it, wouldn't be prudent.")); _paymentProcessorService.Setup(mocked => mocked.GetChargeRefund("ch555")).Returns(new StripeRefund { Data = new List <StripeRefundData> { new StripeRefundData() { Id = "ch555", Amount = "987", Charge = new StripeCharge { Id = "re_123456" } } } }); _donationService.Setup(mocked => mocked.GetDonationByProcessorPaymentId("ch555")).Returns(new DonationDTO { Id = "5555", BatchId = 1984 }); _donationService.Setup(mocked => mocked.GetDonationBatch(1984)).Returns(new DonationBatchDTO { Id = 5150, ProcessorTransferId = "OU812" }); var stripeRefundData = new StripeRefundData { Id = "re999", Amount = "999", ChargeId = "ch999", Charge = new StripeCharge { Id = "ch999" }, BalanceTransaction = new StripeBalanceTransaction { Created = DateTime.Now } }; var refund = new StripeRefund { Data = new List <StripeRefundData> { stripeRefundData } }; _paymentProcessorService.Setup(mocked => mocked.GetRefund("re999")).Returns(stripeRefundData); _donationService.Setup( mocked => mocked.CreateDonationForBankAccountErrorRefund(It.Is <StripeRefund>(r => r.Data != null && r.Data.Count == 1 && r.Data[0].Equals(stripeRefundData)))) .Returns(876); var firstRefund = true; _donationService.Setup(mocked => mocked.GetDonationByProcessorPaymentId("re999")).Returns(() => { if (firstRefund) { firstRefund = false; throw (new DonationNotFoundException("re999")); } return(new DonationDTO() { Id = "9999", BatchId = null, Amount = 999 }); }); _donationService.Setup(mocked => mocked.GetDonationByProcessorPaymentId("ch777")).Returns(new DonationDTO { Id = "7777", BatchId = 2112 }); _donationService.Setup(mocked => mocked.GetDonationBatch(2112)).Returns(new DonationBatchDTO { Id = 2112, ProcessorTransferId = null }); var first = true; _donationService.Setup(mocked => mocked.GetDonationByProcessorPaymentId("ch888")).Returns(() => { if (first) { first = false; throw (new DonationNotFoundException("ch888")); } return(new DonationDTO() { Id = "8888", BatchId = null, Amount = 888, Status = DonationStatus.Declined }); }); _donationService.Setup(mocked => mocked.UpdateDonationStatus(refund.Data[0].ChargeId, 777, refund.Data[0].BalanceTransaction.Created, null)).Returns(9999); var invoice = new StripeInvoice { Amount = 100, Id = "in_888" }; _paymentProcessorService.Setup(mocked => mocked.GetCharge("ch888")).Returns(new StripeCharge { Source = new StripeSource { Object = "bank_account" }, Invoice = invoice }); _donationService.Setup(mocked => mocked.CreateDonationForInvoice(invoice)).Returns(88); _paymentProcessorService.Setup(mocked => mocked.GetChargesForTransfer("tx9876")).Returns(charges); _donationService.Setup(mocked => mocked.GetDepositByProcessorTransferId("tx9876")).Returns((DepositDTO)null); _donationService.Setup( mocked => mocked.CreatePaymentProcessorEventError(e, It.IsAny <StripeEventResponseDTO>())); _paymentService.Setup(mocked => mocked.UpdatePaymentStatus(1111, 999, e.Created, null)).Returns(1111); _paymentService.Setup(mocked => mocked.UpdatePaymentStatus(2222, 999, e.Created, null)).Returns(2222); _donationService.Setup(mocked => mocked.UpdateDonationStatus(3333, 999, e.Created, null)).Returns(3333); _donationService.Setup(mocked => mocked.UpdateDonationStatus(7777, 999, e.Created, null)).Returns(7777); _donationService.Setup(mocked => mocked.UpdateDonationStatus(9999, 999, e.Created, null)).Returns(9999); _donationService.Setup(mocked => mocked.CreateDeposit(It.IsAny <DepositDTO>())).Returns( (DepositDTO o) => { o.Id = 98765; return(o); }); _donationService.Setup(mocked => mocked.CreateDonationBatch(It.IsAny <DonationBatchDTO>())).Returns((DonationBatchDTO o) => o); _paymentService.Setup(mocked => mocked.CreatePaymentBatch(It.IsAny <DonationBatchDTO>())).Returns((DonationBatchDTO o) => o); var result = _fixture.ProcessStripeEvent(e); Assert.IsNotNull(result); Assert.IsInstanceOf <TransferPaidResponseDTO>(result); var tp = (TransferPaidResponseDTO)result; Assert.AreEqual(8, tp.TotalTransactionCount); Assert.AreEqual(6, tp.SuccessfulUpdates.Count); Assert.AreEqual(charges.Take(6).Select(charge => charge.Id), tp.SuccessfulUpdates); Assert.AreEqual(2, tp.FailedUpdates.Count); Assert.AreEqual("ch555", tp.FailedUpdates[1].Key); Assert.AreEqual("ch444", tp.FailedUpdates[0].Key); Assert.AreEqual("Not gonna do it, wouldn't be prudent.", tp.FailedUpdates[0].Value); Assert.IsNotNull(tp.Batch); Assert.IsNotNull(tp.Deposit); Assert.IsNotNull(tp.Exception); _donationService.Verify(mocked => mocked.CreateDonationBatch(It.Is <DonationBatchDTO>(o => o.BatchName.Matches(@"MP\d{12}D") && o.SetupDateTime == o.FinalizedDateTime && o.BatchEntryType == 555 && o.ItemCount == 4 && o.BatchTotalAmount == ((333 + 777 + 888 + 999) / Constants.StripeDecimalConversionValue) && o.Donations != null && o.Donations.Count == 4 && o.DepositId == 98765 && o.ProcessorTransferId.Equals("tx9876") ))); _donationService.Verify(mocked => mocked.CreateDeposit(It.Is <DepositDTO>(o => o.DepositName.Matches(@"MP\d{12}") && !o.Exported && o.AccountNumber.Equals(" ") && o.BatchCount == 2 && o.DepositDateTime != null && o.DepositTotalAmount == ((transfer.Amount + 30) / Constants.StripeDecimalConversionValue) && o.ProcessorFeeTotal == (30 / Constants.StripeDecimalConversionValue) && o.DepositAmount == (transfer.Amount / Constants.StripeDecimalConversionValue) && o.Notes == null && o.ProcessorTransferId.Equals("tx9876") ))); _paymentProcessorService.VerifyAll(); _donationService.VerifyAll(); }