Esempio n. 1
0
        public async Task Can_retrieve_payment_details_using_BankPaymentId(BankPaymentStatus paymentBankStatus, PaymentGateway.Domain.PaymentStatus expectedStatusInPaymentDetails)
        {
            var requestId      = Guid.NewGuid();
            var paymentRequest = new PaymentRequest(requestId, MerchantsRepository.Amazon, new Money("EUR", 42.66), new PaymentGateway.Infrastructure.Card("4524 4587 5698 1200", "05/19", "321"));

            var           gatewayPaymentId = Guid.NewGuid();
            IGenerateGuid guidGenerator    = new GuidGeneratorForTesting(gatewayPaymentId);

            var bankPaymentId = Guid.Parse("3ec8c76c-7dc2-4769-96f8-7e0649ecdfc0");
            var cqrs          = await PaymentCQRS.Build(paymentBankStatus, new BankPaymentIdGeneratorForTests(bankPaymentId), new AlwaysSuccessBankConnectionBehavior(), new DelayProviderForTesting(TimeSpan.FromMilliseconds(1)), PaymentCQRS.TimeoutProviderForBankResponseWaiting(TimeSpan.FromMilliseconds(200)), Substitute.For <IKnowBufferAndReprocessPaymentRequest>(), Substitute.For <IAmCircuitBreakers>());

            await cqrs.RequestsController.ProceedPaymentRequest(paymentRequest, guidGenerator, cqrs.PaymentRequestsMemory, cqrs.PaymentProcessor);


            var payment = (await cqrs.PaymentReadController.GetPaymentInfo(gatewayPaymentId)).Value;

            Check.That(payment.AcquiringBankPaymentId).HasAValue();
            var paymentDetails = (await cqrs.PaymentDetailsReadController.GetPaymentDetails(payment.AcquiringBankPaymentId.Value)).Value;

            // The response should include a masked card number and card details along with a
            // status code which indicates the result of the payment.
            Check.That(paymentDetails.Card.Number).IsEqualTo("4524 XXXX XXXX XXXX");
            Check.That(paymentDetails.Card.Expiry).IsEqualTo("05/19");
            Check.That(paymentDetails.Card.Cvv).IsEqualTo("321");
            Check.That(paymentDetails.Status).IsEqualTo(expectedStatusInPaymentDetails);
            Check.That(paymentDetails.Approved).IsEqualTo(expectedStatusInPaymentDetails == PaymentStatus.Success);
            Check.That(paymentDetails.AcquiringBankPaymentId).IsEqualTo(bankPaymentId);
        }
        internal static async Task <PaymentCQRS> Build(BankPaymentStatus paymentStatus,
                                                       IGenerateBankPaymentId bankPaymentIdGenerator,
                                                       IConnectToAcquiringBanks bankConnectionBehavior,
                                                       IProvideBankResponseTime delayProvider,
                                                       IProvideTimeout providerForBankResponseWaiting,
                                                       IKnowBufferAndReprocessPaymentRequest knowBufferAndReprocessPaymentRequest,
                                                       IAmCircuitBreakers circuitBreakers,
                                                       IThrowsException gatewayExceptionSimulator = null,
                                                       IPublishEvents eventsPublisher             = null)
        {
            var bus = eventsPublisher ?? new InMemoryBus();
            var eventSourcedRepository = new EventSourcedRepository <Payment>(new InMemoryEventStore(bus));

            var appSettingsAccessor = Substitute.For <IOptionsMonitor <AppSettings> >();

            appSettingsAccessor.CurrentValue.Returns(new AppSettings {
                Executor = ExecutorType.Tests
            });

            var random = Substitute.For <IGenerateAcquiringBankPaymentStatus>();

            random.GeneratePaymentStatus().Returns(paymentStatus);

            var paymentsIdsMemory           = new PaymentIdsMemory();
            var bankAdapterSelector         = new BankAdapterSelector(random, bankPaymentIdGenerator, delayProvider, bankConnectionBehavior, paymentsIdsMemory, NullLogger <BankAdapterSelector> .Instance);
            var merchantToBankAdapterMapper = new MerchantToBankAdapterMapper(bankAdapterSelector);
            var paymentRequestsMemory       = new PaymentRequestsMemory();

            var paymentProcessor = new PaymentProcessor(eventSourcedRepository,
                                                        NullLogger <PaymentProcessor> .Instance,
                                                        providerForBankResponseWaiting,
                                                        knowBufferAndReprocessPaymentRequest,
                                                        circuitBreakers,

                                                        gatewayExceptionSimulator);

            var optionMonitor = Substitute.For <IOptionsMonitor <AppSettings> >();

            optionMonitor.CurrentValue.Returns(new AppSettings
            {
                Executor = ExecutorType.Tests
            });

            var paymentRequestCommandHandler = new PaymentRequestCommandHandler(eventSourcedRepository, paymentRequestsMemory, paymentProcessor, merchantToBankAdapterMapper, new RequestBankSynchronyMaster(optionMonitor), NullLogger <PaymentRequestCommandHandler> .Instance);
            var requestController            = new PaymentRequestsController(paymentRequestCommandHandler, NullLogger <PaymentRequestsController> .Instance);

            var readController = new PaymentReadController(eventSourcedRepository);

            var paymentDetailsRepository     = new PaymentDetailsRepository(NullLogger <PaymentDetailsRepository> .Instance);
            var paymentDetailsReadController = new PaymentsDetailsController(paymentsIdsMemory, paymentDetailsRepository);

            var readProjections = new ReadProjections(bus, paymentDetailsRepository);
            await readProjections.StartAsync(new CancellationToken(false));

            var gatewayPaymentsIdsController       = new GatewayPaymentsIdsController(paymentsIdsMemory);
            var acquiringBankPaymentsIdsController = new AcquiringBankPaymentsIdsController(paymentsIdsMemory);

            return(new PaymentCQRS(requestController, readController, paymentDetailsReadController, paymentRequestsMemory, paymentProcessor, gatewayPaymentsIdsController, acquiringBankPaymentsIdsController, readProjections));
        }
Esempio n. 3
0
        public void OpenBanking_BankPaymentList_EmptyList()
        {
            const BankPaymentStatus status = BankPaymentStatus.REQUEST_CONSUMER_CONSENT;
            var result = ReportingService.FindBankPaymentTransactions(1, 10)
                         .Where(SearchCriteria.StartDate, DateTime.Now.AddDays(-5))
                         .And(SearchCriteria.EndDate, DateTime.Now)
                         .And(SearchCriteria.BankPaymentStatus, status)
                         .Execute();

            Assert.IsNotNull(result);
            Assert.AreEqual(0, result.Results.Count);
        }
Esempio n. 4
0
 public BankResponse(Guid bankPaymentId, Guid gatewayPaymentId, BankPaymentStatus paymentStatus)
 {
     BankPaymentId    = bankPaymentId;
     GatewayPaymentId = gatewayPaymentId;
     PaymentStatus    = paymentStatus;
 }
        public async Task Return_proper_payment_status_When_AcquiringBank_accepts_or_reject_payment(BankPaymentStatus bankPaymentStatus, PaymentStatus expectedPaymentStatusReturnedByGateway)
        {
            var           requestId        = Guid.NewGuid();
            var           paymentRequest   = TestsUtils.BuildPaymentRequest(requestId, MerchantsRepository.Apple);
            var           gatewayPaymentId = Guid.NewGuid();
            IGenerateGuid guidGenerator    = new GuidGeneratorForTesting(gatewayPaymentId);

            var bankPaymentId = Guid.Parse("3ec8c76c-7dc2-4769-96f8-7e0649ecdfc0");
            var cqrs          = await PaymentCQRS.Build(bankPaymentStatus, new BankPaymentIdGeneratorForTests(bankPaymentId), new AlwaysSuccessBankConnectionBehavior(), new DelayProviderForTesting(TimeSpan.FromMilliseconds(1)), PaymentCQRS.TimeoutProviderForBankResponseWaiting(TimeSpan.FromMilliseconds(200)), Substitute.For <IKnowBufferAndReprocessPaymentRequest>(), Substitute.For <IAmCircuitBreakers>());

            await cqrs.RequestsController.ProceedPaymentRequest(paymentRequest, guidGenerator, cqrs.PaymentRequestsMemory, cqrs.PaymentProcessor);


            var payment = (await cqrs.PaymentReadController.GetPaymentInfo(gatewayPaymentId)).Value;

            Check.That(payment.RequestId).IsEqualTo(requestId);
            Check.That(payment.GatewayPaymentId).IsEqualTo(gatewayPaymentId);

            Check.That(payment.Status).IsEqualTo(expectedPaymentStatusReturnedByGateway);
            Check.That(payment.Approved).IsEqualTo(payment.Status == PaymentGateway.Domain.PaymentStatus.Success);
            Check.That(payment.AcquiringBankPaymentId).IsEqualTo(bankPaymentId);
        }
        public async Task Return_InternalServerEror_When_AcquiringBank_sent_duplicated_PaymentId_Using_StupidBank(BankPaymentStatus bankPaymentStatus, PaymentStatus expectedPaymentStatusReturnedByGateway)
        {
            var requestId            = Guid.Parse("9cb25b95-45ba-4100-a180-deb13259d0e1");
            var paymentRequest       = TestsUtils.BuildPaymentRequest(requestId, MerchantsRepository.FailFromThe2ndPaymentMerchant);
            var secondRequestId      = Guid.Parse("9c940897-b1c4-4598-96a7-82502ca51845");
            var secondPaymentRequest = TestsUtils.BuildPaymentRequest(secondRequestId, MerchantsRepository.FailFromThe2ndPaymentMerchant);

            var           gatewayPaymentId          = Guid.Parse("002ee45f-fdfb-4666-b504-70aa26ecf646");
            var           secondGatewayPaymentId    = Guid.Parse("4cc3dd04-b3d8-4be4-8c68-e744c387fb6c");
            IGenerateGuid gatewayPaymentIdGenerator = Substitute.For <IGenerateGuid>();

            gatewayPaymentIdGenerator.Generate().Returns(gatewayPaymentId, secondGatewayPaymentId);

            var cqrs = await PaymentCQRS.Build(bankPaymentStatus, new DefaultBankPaymentIdGenerator(), new AlwaysSuccessBankConnectionBehavior(), new DelayProviderForTesting(TimeSpan.FromMilliseconds(1)), PaymentCQRS.TimeoutProviderForBankResponseWaiting(TimeSpan.FromMilliseconds(200)), Substitute.For <IKnowBufferAndReprocessPaymentRequest>(), Substitute.For <IAmCircuitBreakers>());

            await cqrs.RequestsController.ProceedPaymentRequest(paymentRequest, gatewayPaymentIdGenerator, cqrs.PaymentRequestsMemory, cqrs.PaymentProcessor);

            await cqrs.RequestsController.ProceedPaymentRequest(secondPaymentRequest, gatewayPaymentIdGenerator, cqrs.PaymentRequestsMemory, cqrs.PaymentProcessor);

            var secondFailedPayment = (await cqrs.PaymentReadController.GetPaymentInfo(secondGatewayPaymentId)).Value;

            Check.That(secondFailedPayment.RequestId).IsEqualTo(secondRequestId);
            Check.That(secondFailedPayment.GatewayPaymentId).IsEqualTo(secondGatewayPaymentId);

            Check.That(secondFailedPayment.Status).IsEqualTo(expectedPaymentStatusReturnedByGateway);
            Check.That(secondFailedPayment.Approved).IsEqualTo(secondFailedPayment.Status == PaymentGateway.Domain.PaymentStatus.Success);
            Check.That(secondFailedPayment.AcquiringBankPaymentId).IsNull();
        }
 public SocieteGeneraleResponse(Guid bankPaymentId, Guid gatewayPaymentId, BankPaymentStatus paymentStatus)
 {
     BankPaymentId    = bankPaymentId;
     GatewayPaymentId = gatewayPaymentId;
     PaymentStatus    = paymentStatus;
 }