コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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));
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: MockOrderRepo.cs プロジェクト: PuceEdgar/home-task
        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);
            }
        }
コード例 #5
0
 public static PaymentDetailsDto MapIncommingOrderDtoToPaymentDetailsDto(IncommingOrderDto orderDetails)
 {
     return(new PaymentDetailsDto
     {
         OrderNumber = orderDetails.OrderNumber,
         PayableAmount = orderDetails.PayableAmount
     });
 }
コード例 #6
0
ファイル: DtoMapperTests.cs プロジェクト: PuceEdgar/home-task
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
 public static OrderDetails MapIncommingOrderDtoToOrderDetailsModel(IncommingOrderDto createOrderDto)
 {
     return(new OrderDetails
     {
         OrderNumber = createOrderDto.OrderNumber,
         UserId = createOrderDto.UserId,
         PayableAmount = createOrderDto.PayableAmount,
         PaymentGateWay = createOrderDto.PaymentGateWay,
         Description = createOrderDto.Description
     });
 }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
 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());
     }
 }