public void Calculate_ShouldThrowException_WithNullProducts() { // Arrange IDateTimeUtil dateTimeUtil = new DateTimeUtil(); ITimespanDiscountCalculator timespanDiscountCalculator = new TimespanDiscountCalculator(dateTimeUtil); // Act & Assert Assert.Throws <ArgumentNullException>(() => timespanDiscountCalculator.Calculate(null, null)); }
public void Calculate_ShouldReturnDiscountResult_WithCorrectProductsAndModel() { // Arrange Mock <IDateTimeUtil> mockDateTimeUtil = new Mock <IDateTimeUtil>(); mockDateTimeUtil.Setup(x => x.Now()).Returns(new DateTime(2020, 10, 15)); ITimespanDiscountCalculator timespanDiscountCalculator = new TimespanDiscountCalculator(mockDateTimeUtil.Object); List <Product> products = new List <Product>() { new Product() { Id = 1, Name = "Beans", PluralName = "Beans", Price = 0.65m }, new Product() { Id = 2, Name = "Bread", PluralName = "Breads", Price = 0.8m }, new Product() { Id = 3, Name = "Milk", PluralName = "Milk", Price = 1.3m }, new Product() { Id = 4, Name = "Apple", PluralName = "Apples", Price = 1.0m }, }; TimespanDiscount timespanDiscount = new TimespanDiscount() { Id = 1, BuyingProduct = products[3], From = new DateTime(2020, 10, 10), To = new DateTime(2020, 10, 20), DiscountedProduct = products[3], DiscountPercentage = 0.1f, IsActive = true }; IEnumerable <BasketItem> items = new List <BasketItem>() { new BasketItem() { Product = new BasketItemProduct() { Id = 4, Name = "Apple", PluralName = "Apples", Price = 1.0m }, Quantity = 1 }, }; // Act DiscountResult discountResult = timespanDiscountCalculator.Calculate(items, timespanDiscount); // Assert Assert.Equal(0.1f, discountResult.DiscountPercentage); Assert.Equal(0.10m, discountResult.DiscountedPrice); Assert.Equal("Apples", discountResult.ProductPluralName); }
private static void CalculatePrice(string commandName, string[] arguments, ICommandInvoker commandInvoker) { IBasketService basketService = new BasketService(dbContext); GetProductsByNameCommand getProductByNameCommand = new GetProductsByNameCommand(basketService); getProductByNameCommand.ProductNames = arguments; commandInvoker.ExecuteCommand(getProductByNameCommand); IEnumerable <BasketItem> products = getProductByNameCommand.Result; if (products.Count() == 0) { Console.WriteLine("Given products are not available!"); return; } CalculateTotalPriceCommand calculateTotalPriceCommand = AppCommandsByName[commandName] as CalculateTotalPriceCommand; calculateTotalPriceCommand.Items = products; commandInvoker.ExecuteCommand(calculateTotalPriceCommand); decimal basketItemsTotalPrice = calculateTotalPriceCommand.Result; Console.WriteLine($"Subtotal: {basketItemsTotalPrice:c}"); IDateTimeUtil dateTimeUtil = new DateTimeUtil(); ITimespanDiscountCalculator timespanDiscountCalculator = new TimespanDiscountCalculator(dateTimeUtil); IQuantityDiscountCalculator quantityDiscountCalculator = new QuantityDiscountCalculator(); IDiscountService discountService = new DiscountService(dbContext, timespanDiscountCalculator, quantityDiscountCalculator); GetDiscountsCommand getDiscountCommand = new GetDiscountsCommand(discountService); getDiscountCommand.Items = products; commandInvoker.ExecuteCommand(getDiscountCommand); IEnumerable <DiscountResult> discounts = getDiscountCommand.Result; if (discounts.Count() > 0) { foreach (DiscountResult discount in discounts) { Console.WriteLine($"{discount.ProductPluralName} {discount.DiscountPercentage:p0} off: -{discount.DiscountedPrice:c}"); } } else { Console.WriteLine("(No offers available)"); } decimal discountPrice = discounts.Sum(s => s.DiscountedPrice); decimal totalPrice = basketItemsTotalPrice - discountPrice; Console.WriteLine($"Total price: {totalPrice:c}"); }