public async Task Should_Apply_PercentOfProductDiscountRule() { var percentOfProductDiscountRule = new CartPriceRule { Name = "Buy 2 butters and get one bread at 50%", SourceCondition = new Condition { Sku = "303003" }, DestinationCondition = new Condition { Sku = "404004" }, Action = new Action { ActionType = ActionType.PercentOfProductDiscount, DiscountStep = 2, DiscountAmount = 50 } //Buy 2 butters, get one bread at 50% }; var cartPriceRules = new[] { percentOfProductDiscountRule }; var basket = new Basket(101) { BasketItems = new List <BasketItem> { new BasketItem(new Product { Sku = "303003", Name = "Butter", Price = 0.80m }, 2), new BasketItem(new Product { Sku = "404004", Name = "Bread", Price = 1.0m }, 2) } }; _fixture.CartPriceRuleRepository.Setup(s => s.GetCartPriceRulesAsync()) .Returns(() => Task.FromResult(cartPriceRules)); _fixture.RuleFactory .Setup(s => s.GetRule(basket.BasketItems, percentOfProductDiscountRule)) .Returns(() => new PercentOfProductDiscountRule(basket.BasketItems, percentOfProductDiscountRule)); await _fixture.Target.ApplyPriceRulesAsync(basket); basket.Discounts.First().Price.Should().Be(0.50m); }
public async Task Should_Apply_BuyXGetYFreeRule() { var buyXGetYFreeRule = new CartPriceRule { Name = "Buy 3 Milk get the 4th for free.", SourceCondition = new Condition { Sku = "200202" }, DestinationCondition = new Condition { Sku = "200202" }, Action = new Action { ActionType = ActionType.BuyXGetYFree, DiscountStep = 3, DiscountAmount = 1 } //Buy 3, get 1 for free }; var cartPriceRules = new[] { buyXGetYFreeRule }; var basket = new Basket(101) { BasketItems = new List <BasketItem> { new BasketItem(new Product { Sku = "200202", Name = "Milk", Price = 1.15m }, 4) } }; _fixture.CartPriceRuleRepository.Setup(s => s.GetCartPriceRulesAsync()) .Returns(() => Task.FromResult(cartPriceRules)); _fixture.RuleFactory.Setup(s => s.GetRule(basket.BasketItems, buyXGetYFreeRule)) .Returns(() => new BuyXGetYFreeRule(basket.BasketItems, buyXGetYFreeRule)); await _fixture.Target.ApplyPriceRulesAsync(basket); basket.Discounts.First().Price.Should().Be(1.15m); }
public BuyXGetYFreeRule(IEnumerable <BasketItem> basketItems, CartPriceRule cartPriceRule) { _basketItems = basketItems; _cartPriceRule = cartPriceRule; }
public PercentOfProductDiscountRule(IEnumerable <BasketItem> basketItems, CartPriceRule cartPriceRule) { _basketItems = basketItems; _cartPriceRule = cartPriceRule; }
public IRule GetRule(IEnumerable <BasketItem> basketItems, CartPriceRule cartPriceRule) { return((IRule)Activator.CreateInstance(Type.GetType($"TQ.ShoppingBasket.Service.Rules.{cartPriceRule.Action.ActionType}Rule"), new object[] { basketItems, cartPriceRule })); }