public ResponseDTO SaveOrder(OrderShippingPaymentDTO orderShippingPaymentDTO)
        {
            var result = _checkoutService.SaveOrder(orderShippingPaymentDTO);

            if (result != null)
            {
                Log.Information("Get All Prodcuts completed!");
                return(new ResponseDTO()
                {
                    Data = result,
                    ErrorDescription = "",
                    Statuscode = "",
                });
            }
            else
            {
                return new ResponseDTO()
                       {
                           Data             = "Failed",
                           ErrorDescription = "Data not Found",
                           Statuscode       = HttpStatusCode.BadRequest.ToString(),
                       }
            };
        }
    }
        /// <summary>
        /// Save Order details
        /// </summary>
        /// <param name="orderShippingPaymentDto"></param>
        /// <returns></returns>
        public async Task <object> SaveOrder(OrderShippingPaymentDTO orderShippingPaymentDto)
        {
            var user = await _userManager.FindByNameAsync(orderShippingPaymentDto.UserName);

            //save order
            var order = new Order
            {
                OrderDate      = DateTime.UtcNow,
                ShippedDate    = DateTime.UtcNow,             // Assumption : products are shipped within the order date.
                ShipAddress    = orderShippingPaymentDto.ShipAddress,
                ShippingMethod = orderShippingPaymentDto.ShippingMethod,
                Email          = orderShippingPaymentDto.Email,
                PhoneNumber    = orderShippingPaymentDto.PhoneNumber,
                TotalPrice     = orderShippingPaymentDto.OrderTotalPrice,
                OrderStatus    = orderShippingPaymentDto.OrderStatus
            };
            var orderId = _orderRepository.Save(order).Id;

            if (orderShippingPaymentDto.OrderLineItems.Count <= 0)
            {
                throw new InvalidOperationException("Can not save order Line items.");
            }

            else
            {
                //save order line items
                foreach (var item in _mapper.Map <IList <OrderLineItem> >(orderShippingPaymentDto.OrderLineItems))
                {
                    item.OrderID = orderId;
                    _orderLineItemsRepository.Save(item);
                }
            }

            if (!string.IsNullOrEmpty(user.Id))
            {
                //Save payment details
                var payment = new Payment
                {
                    PaidDate      = DateTime.UtcNow,
                    Description   = "",
                    TotalPrice    = order.TotalPrice,
                    PaymentStatus = orderShippingPaymentDto.PaymentStatus,
                    PaymentMethod = orderShippingPaymentDto.PaymentMethod,
                    OrderID       = order.Id,
                    UserID        = user.Id
                };
                _paymentRepository.Save(payment);
                throw new InvalidOperationException("Can not save payment details.");
            }



            return("Successful Saved");
        }
        public void Test_LineItems_In_Save_Order()
        {
            var applicationUser = new ApplicationUser
            {
                FullName = "qwe rty",
                UserName = "******",
                PasswordHash = "AQAAAAEAACcQAAAAEFhb4f6tea+M5ljLQQv6paGE6/eo+IHQmiD0vlNdhJ66vPRY0rpFdoCW9XoeYm5/DQ==",
                Email = "*****@*****.**",
                EmailConfirmed = true,
                LockoutEnabled = false
            };
            orderLineItems = new List<OrderLineItemDTO>();

            var orderShippingPaymentDTO = new OrderShippingPaymentDTO
            {
                FullName = "qwe rty",
                PaymentMethod = "qwe rty",
                OrderDate = DateTime.UtcNow,
                PaymentStatus = "Paid",
                ShipAddress = "34c ,Test address ",
                ShippingMethod = "UPS",
                Email = "*****@*****.**",
                PhoneNumber = "0123456789",
                OrderTotalPrice = 568.00,
                OrderStatus = "Completed",
                ZipCode = "10001",
                UserName = "******",
                OrderLineItems = orderLineItems
            };

            var applicationUserlist = new List<ApplicationUser>();
            applicationUserlist.Add(applicationUser);
            var userManager = MockUserManager(applicationUserlist);
            userManager.Setup(x => x.FindByNameAsync(It.IsAny<string>())).Returns(Task.FromResult(applicationUser));

            var order = new Order
            {
                OrderDate = DateTime.UtcNow,
                ShippedDate = DateTime.UtcNow,
                ShipAddress = orderShippingPaymentDTO.ShipAddress,
                ShippingMethod = orderShippingPaymentDTO.ShippingMethod,
                Email = orderShippingPaymentDTO.Email,
                PhoneNumber = orderShippingPaymentDTO.PhoneNumber,
                TotalPrice = orderShippingPaymentDTO.OrderTotalPrice,
                OrderStatus = orderShippingPaymentDTO.OrderStatus
            };

            orderRepository.Setup(mr => mr.Save(It.IsAny<Order>())).Returns(order);

            var orderId = order.Id;
            foreach (var item in mapper.Map<IList<OrderLineItem>>(orderShippingPaymentDTO.OrderLineItems))
            {
                item.OrderID = orderId;
                orderLineItemsRepository.Setup(mr => mr.Save(It.IsAny<OrderLineItem>())).Returns(item);
            }

            var payment = new Payment
            {
                PaidDate = DateTime.UtcNow,
                Description = "",
                TotalPrice = order.TotalPrice,
                PaymentStatus = orderShippingPaymentDTO.PaymentStatus,
                PaymentMethod = orderShippingPaymentDTO.PaymentMethod,
                OrderID = order.Id,
                UserID = ""

            };

            paymentRepository.Setup(mr => mr.Save(It.IsAny<Payment>())).Returns(payment);

            var checkoutService = new CheckoutService(mapper, orderRepository.Object, orderLineItemsRepository.Object,
                paymentRepository.Object, userManager.Object);
            var result = checkoutService.SaveOrder(orderShippingPaymentDTO);

            var ex = Assert.ThrowsAsync<InvalidOperationException>( () =>  checkoutService.SaveOrder(orderShippingPaymentDTO));
            Assert.AreEqual("Can not save order Line items.", ex.Message);
        }