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); }
public async Task <ActionResult> Create(PaymentRequastModel model) { return(await _payments .CreateAsync(model) .ToActionResult()); }