예제 #1
0
        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();
        }
예제 #2
0
        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();
        }