public void CalculateOrderPriceWithNullOrderLine_ReturnZero()
        {
            var order = new SalesOrder();

            // Act
            var price = order.GetOrderPrice();

            // Assert
            Assert.Equal(0, price);
        }
        /// <summary>
        /// Given an order, calculate the best shipping amount according to ShippingPriceRate rule
        /// </summary>
        /// <param name="order"></param>
        /// <returns>The shipping amount sent and total shipping cost</returns>
        public Tuple <decimal, decimal> CalculatePriceBasedOptimalShippingAmount(SalesOrder order)
        {
            var totalPrice = order.GetOrderPrice();

            // From the ShippingPriceRate rule, we can see that we should send as much amount as possible

            var shippingCost   = 0m;
            var shippingWeight = order.GetOrderShippingWeight();

            if (totalPrice >= 0 && totalPrice <= 50)
            {
                shippingCost = shippingWeight * 5.5m;
            }
            else if (totalPrice > 50 && totalPrice < 100)
            {
                // As shipping rate between $50 and $100 is zero, the optimised shipping amount is max at 50kg
                if (shippingWeight <= 50)
                {
                    shippingCost = shippingWeight * 5.5m;
                }
                else
                {
                    shippingCost = shippingWeight * 0m;
                }
            }
            else if (totalPrice >= 100 && totalPrice <= 500)
            {
                shippingCost = shippingWeight * 10m;
            }
            else if (totalPrice > 500 && totalPrice < 1000)
            {
                // There is no rule for price rages [500, 1000], so assume that there is no cost for shipping
                shippingCost = 0;
            }
            else if (totalPrice >= 1000)
            {
                shippingCost = shippingWeight * 15m;
            }

            return(Tuple.Create(shippingWeight, shippingCost));
        }
        public void CalculateOrderPrice_ReturnCorrectPrice()
        {
            var order = new SalesOrder
            {
                Lines = new List <SalesOrderLine>
                {
                    new SalesOrderLine
                    {
                        Price = 10
                    },
                    new SalesOrderLine
                    {
                        Price = 20
                    }
                }
            };

            // Act
            var price = order.GetOrderPrice();

            // Assert
            Assert.Equal(30, price);
        }