public static async Task <(bool, string)> Process(HttpClient client, IncommingOrderDto createOrderDto) { try { var paymentDto = DtoMapper.MapIncommingOrderDtoToPaymentDetailsDto(createOrderDto); var json = JsonConvert.SerializeObject(paymentDto); var data = new StringContent(json, Encoding.UTF8, "application/json"); string result = ""; var response = await client.PostAsync(client.BaseAddress, data); if (response.IsSuccessStatusCode) { result = response.Content.ReadAsStringAsync().Result; } else { result = response.ReasonPhrase; } return(response.IsSuccessStatusCode, result); } catch (Exception ex) { return(false, ex.Message); } }
public async Task <IActionResult> ProcessOrder(IncommingOrderDto order) { try { var validationResult = PayloadValidator.ValidateOrderDetails(order); if (!validationResult.Item1) { return(BadRequest(string.Join(", ", validationResult.Item2))); } var paymentResult = await PaymentProcessor.ProcessPayment(_clientFactory, order); if (!paymentResult.Item1) { return(BadRequest(paymentResult.Item2)); } var result = await _orders.AddNewOrderDetails(order); if (!result.Success) { BadRequest(result.Message); } var uri = $"https://localhost:44327/api/billing/order/{result.SingleOrder.OrderNumber}"; return(Created(uri, DtoMapper.MapResultDtoToCreatedOrderDto(result))); } catch (Exception ex) { return(StatusCode(500, ex.Message)); } }
public void ProcessOrder_ShouldReturnStatusCode201() { var incommingOrder = new IncommingOrderDto { OrderNumber = 5, UserId = 456, PayableAmount = 99.12, PaymentGateWay = "Seb", Description = "This is order number 5" }; var orderList = new MockOrderRepo(); var orders = new Mock <IOrderRepo>(); orders.Setup(x => x.AddNewOrderDetails(incommingOrder)).Returns(orderList.AddNewOrderDetails(incommingOrder)); var clientFactory = new Mock <IHttpClientFactory>(); clientFactory.Setup(x => x.CreateClient(incommingOrder.PaymentGateWay)).Returns(() => { var client = new HttpClient(); client.BaseAddress = new Uri("https://localhost:6001/api/paymentgateway/process/seb"); return(client); } ); var billingController = new BillingController(orders.Object, clientFactory.Object); var result = billingController.ProcessOrder(incommingOrder).Result; var okResult = result as ObjectResult; Assert.NotNull(okResult); Assert.True(okResult is ObjectResult); Assert.IsType <CreatedOrderDto>(okResult.Value); Assert.Equal(StatusCodes.Status201Created, okResult.StatusCode); }
public async Task <ResultDto> AddNewOrderDetails(IncommingOrderDto orderDetails) { var result = new ResultDto(); try { var newOrder = DtoMapper.MapIncommingOrderDtoToOrderDetailsModel(orderDetails); Task.WaitAll(AddNewOrder(newOrder)); var createdOrder = await GetOrderByNumber(orderDetails.OrderNumber); if (createdOrder == null) { result.Success = false; result.Message = Messages.FailedToCreateOrder(orderDetails.OrderNumber); return(result); } result.SingleOrder = DtoMapper.MapOrderDetailsModelToReadOrderDto(createdOrder); result.Message = Messages.OrderCreatedSuccessfully(createdOrder.OrderNumber); return(result); } catch (Exception ex) { result.Success = false; result.Message = ex.Message; return(result); } }
public static PaymentDetailsDto MapIncommingOrderDtoToPaymentDetailsDto(IncommingOrderDto orderDetails) { return(new PaymentDetailsDto { OrderNumber = orderDetails.OrderNumber, PayableAmount = orderDetails.PayableAmount }); }
public void MapIncommingOrderDtoToPaymentDetailsDto_ShouldReturnPaymentDetailsType() { var incommingOrder = new IncommingOrderDto { OrderNumber = 5, UserId = 456, PayableAmount = 99.12, PaymentGateWay = "Seb", Description = "This is order number 5" }; var actual = DtoMapper.MapIncommingOrderDtoToPaymentDetailsDto(incommingOrder); Assert.IsType <PaymentDetailsDto>(actual); }
public void ValidateOrderDetails_ShouldReturnCorrectErrorCount(int orderNumber, int userId, double amount, string gateway, string description, int expected) { var incommingOrder = new IncommingOrderDto { OrderNumber = orderNumber, UserId = userId, PayableAmount = amount, PaymentGateWay = gateway, Description = description }; var actual = PayloadValidator.ValidateOrderDetails(incommingOrder).Item2.Count; Assert.Equal(expected, actual); }
public static OrderDetails MapIncommingOrderDtoToOrderDetailsModel(IncommingOrderDto createOrderDto) { return(new OrderDetails { OrderNumber = createOrderDto.OrderNumber, UserId = createOrderDto.UserId, PayableAmount = createOrderDto.PayableAmount, PaymentGateWay = createOrderDto.PaymentGateWay, Description = createOrderDto.Description }); }
public void AddNewOrderDetails_ShoudReturnCreatedMessage() { var mockOrderRepo = new MockOrderRepo(); var incommingOrder = new IncommingOrderDto { OrderNumber = 5, UserId = 456, PayableAmount = 99.12, PaymentGateWay = "Seb", Description = "This is order number 5" }; var expected = Messages.OrderCreatedSuccessfully(incommingOrder.OrderNumber); var result = mockOrderRepo.AddNewOrderDetails(incommingOrder).Result; var actual = result.Message; Assert.Equal(expected, actual); }
public void AddNewOrderDetails_ShoudReturnAddedOrder() { var mockOrderRepo = new MockOrderRepo(); var incommingOrder = new IncommingOrderDto { OrderNumber = 5, UserId = 456, PayableAmount = 99.12, PaymentGateWay = "Seb", Description = "This is order number 5" }; var expected = JsonConvert.SerializeObject(incommingOrder); var result = mockOrderRepo.AddNewOrderDetails(incommingOrder).Result; var actual = JsonConvert.SerializeObject(result.SingleOrder); Assert.Equal(expected, actual); }
public void Process_ShouldProcessPayment() { var incommingOrder = new IncommingOrderDto { OrderNumber = 5, UserId = 456, PayableAmount = 99.12, PaymentGateWay = "seb", Description = "This is order number 5" }; var client = new HttpClient { BaseAddress = new Uri("https://localhost:6001/api/paymentgateway/process/seb") }; var actual = PaymentProcessor.Process(client, incommingOrder).Result; Assert.True(actual.Item1); }
public void ProcessPayment_ShouldReturnError() { var paymentGateway = "abc"; var incommingOrder = new IncommingOrderDto { OrderNumber = 5, UserId = 456, PayableAmount = 99.12, PaymentGateWay = paymentGateway, Description = "This is order number 5" }; var clientFactory = new Mock <IHttpClientFactory>(); var expected = Messages.PaymentGatewayNotFound(); var actual = PaymentProcessor.ProcessPayment(clientFactory.Object, incommingOrder).Result; Assert.False(actual.Item1); Assert.Equal(expected, actual.Item2); }
public static (bool, List <string>) ValidateOrderDetails(IncommingOrderDto payload) { var isValid = true; var errors = new List <string>(); var error = string.Empty; ValidateInteger(payload.OrderNumber, "Order Number", errors); ValidateInteger(payload.UserId, "User Id", errors); ValidatePayableAmount(payload.PayableAmount, errors); ValidatePayementGateway(payload.PaymentGateWay, errors); if (errors.Count() > 0) { isValid = false; //error = string.Join(", ", errors); } return(isValid, errors); }
public async static Task <(bool, string)> ProcessPayment(IHttpClientFactory clientFactory, IncommingOrderDto createOrderDto) { if (Enum.TryParse <PaymentGateways>(createOrderDto.PaymentGateWay, true, out var result)) { return(await Process(clientFactory.CreateClient(result.ToString()), createOrderDto)); } else { return(false, Messages.PaymentGatewayNotFound()); } }