Beispiel #1
0
        public async Task HandlePayment_ReturnSuccessfulPaymentResponse_WhenPaymentPassedAllChecks()
        {
            // Arrange
            var request = CreateMakePaymentCommand();

            var(payment, paymentResponse) = CreateSuccessfulPaymentAndPaymentResponse();

            A.CallTo(() => _validatorsEnumerator.Current).Returns(new CardNumberLengthValidator());
            A.CallTo(() => _validators.GetEnumerator()).Returns(_validatorsEnumerator);
            A.CallTo(() => _validatorService.Validate(_validators, request)).Returns((true, new List <ValidationError>()));
            A.CallTo(() => _bankService.ProcessPayment(request)).Returns(paymentResponse);
            A.CallTo(() => _paymentsService.CreateAsync(payment));
            A.CallTo(() => _paymentMapper.Map(payment)).Returns(paymentResponse);

            // Act
            var response = await _sut.Handle(request, new CancellationToken());

            // Assert
            var expectedPaymentResponse = new PaymentResponse
            {
                Id                = paymentResponse.Id,
                BankPaymentId     = paymentResponse.BankPaymentId,
                MerchantPaymentId = paymentResponse.MerchantPaymentId,
                BillingDetails    = paymentResponse.BillingDetails,
                Currency          = paymentResponse.Currency,
                Amount            = paymentResponse.Amount,
                Status            = paymentResponse.Status,
                ValidationErrors  = paymentResponse.ValidationErrors,
                Reason            = paymentResponse.Reason,
                TimeStamp         = DateTime.UtcNow
            };

            expectedPaymentResponse.Should().BeEquivalentTo(expectedPaymentResponse, x => x.Excluding(a => a.TimeStamp));
        }
        public async Task <PaymentResponse> Handle(MakePaymentCommand request, CancellationToken cancellationToken)
        {
            // Create ID for internal MakePayment event
            var id = Guid.NewGuid().ToString();

            // Server side validations
            var(isValid, validationErrors) = _validatorService.Validate(_validators, request);

            if (!isValid)
            {
                return(new PaymentResponse
                {
                    Id = id,
                    Status = "failure",
                    ValidationErrors = validationErrors,
                    Reason = "Failed to validate payment details"
                });
            }

            // Forward payment request
            var response = await _bankService.ProcessPayment(request);

            if (response == null)
            {
                return(new PaymentResponse
                {
                    Id = id,
                    Status = "failure",
                    ValidationErrors = validationErrors,
                    Reason = "Failed to process payment details"
                });
            }

            var payment = new Payment()
            {
                Id                = id,
                BankPaymentId     = response.BankPaymentId,
                MerchantPaymentId = request.MerchantPaymentId,
                BillingDetails    = request.BillingDetails,
                Currency          = request.Currency,
                Amount            = request.Amount,
                Status            = response.Status,
                Reason            = response.Reason,
                ValidationErrors  = response.ValidationErrors,
                Timestamp         = DateTime.UtcNow,
            };

            // Save payment event to payments DB (failure or success)
            await _paymentsService.CreateAsync(payment);

            // Map from payment to PaymentResponse object
            var paymentResponse = _paymentMapper.Map(payment);

            return(paymentResponse);
        }
Beispiel #3
0
 public async Task <ActionResult> Create(PaymentRequastModel model)
 {
     return(await _payments
            .CreateAsync(model)
            .ToActionResult());
 }