public void ShouldApplyHigherDiscount() { // Arrage var chain = new RuleChain <ApplyDiscountContext>() .Use <FakeBirthdayDiscountRule>() .Use <MyNameIsLuttiDiscount>() .Build(); var context = new ApplyDiscountContext { Context = new ShoppingCart { CilentName = "Lutti Coelho", Items = new List <ShopItem>() { { new ShopItem() { Name = "Item 1", Price = 100 } }, { new ShopItem() { Name = "Item 2", Price = 900 } } }, ClientBirthday = new DateTime(1986, 8, 16) } }; // Act context = chain.Invoke(context); // Assert context.DiscountApplied.Should().Be(500); }
public ShoppingCart ApplyDiscountOnShoppingCart(ShoppingCart shoppingCart) { var shoppingCartRuleChain = _ruleChain .Use <IsValidCouponRule>() .Use <BirthdayDiscountRule>() .Use <FirstOrderDiscountRule>() .Build(); var shoppingCartRuleContext = new ApplyDiscountContext(shoppingCart); shoppingCartRuleContext.Properties["IsFirstOrder"] = true; shoppingCartRuleContext.ClientBirthday = DateTime.UtcNow; shoppingCartRuleChain(shoppingCartRuleContext); shoppingCart.Discount = shoppingCartRuleContext.DiscountApplied; shoppingCart.DiscountType = shoppingCartRuleContext.DiscountTypeApplied; return(shoppingCart); }
public override async Task Invoke(ApplyDiscountContext context) { if (cupomAvailable(context)) { // Gets 7% of discount; var myDiscount = context.Context.Items.Sum(i => i.Price * 0.07M); await next.Invoke(context); // Only apply discount if the discount applied by the other rules are smaller than this if (myDiscount > context.DiscountApplied) { context.DiscountApplied = myDiscount; context.DiscountTypeApplied = "Cupom"; } } else { await next(context); } }
public override async Task Invoke(ApplyDiscountContext context) { if (shouldRun(context)) { // Gets 5% of discount; var myDiscount = context.Context.Items.Sum(i => i.Price * 0.05M); await next.Invoke(context); // Only apply discount if the discount applied by the other rules are smaller than this if (myDiscount > context.DiscountApplied) { context.DiscountApplied = myDiscount; context.DiscountTypeApplied = "First Order Discount"; } } else { await next.Invoke(context); } }
public async Task Run_ShouldNot_ApplyDiscount_When_OtherRuleAppliedAHigherDiscount() { // Arrange var mockRule = new Mock <IRule <ApplyDiscountContext> >(); mockRule.Setup(_ => _.ShouldRun(It.IsAny <ApplyDiscountContext>())).Returns(false); var mockRepository = new Mock <ISalesRepository>(); var rule = new IsValidCouponRule(mockRule.Object.Invoke, mockRepository.Object); var context = new ApplyDiscountContext { ClientBirthday = DateTime.Now, DiscountApplied = 0.8m, DiscountTypeApplied = "Other Rule", Context = new ShoppingCart { CouponCode = "coupon-001", StartDate = DateTime.Now, Items = new List <ShoppingCartItem> { new ShoppingCartItem { Id = 1, Name = "Product 1", Price = 1.00m, Quantity = 5 }, new ShoppingCartItem { Id = 2, Name = "Product 2", Price = 2.00m, Quantity = 1 }, new ShoppingCartItem { Id = 3, Name = "Product 3", Price = 3.00m, Quantity = 1 }, } } }; // Act await rule.Run(context); // Assert context.DiscountApplied.Should().Be(0.80m); context.DiscountTypeApplied.Should().Be("Other Rule"); }
[InlineData("anyCoupon", true, true)] // Has coupon and exist in repository public void ShouldRun(string couponValue, bool isCouponAvailable, bool expectedResult) { // Arrange var mockRule = new Mock <IRule <ApplyDiscountContext> >(); mockRule.Setup(_ => _.ShouldRun(It.IsAny <ApplyDiscountContext>())).Returns(false); var mockRepository = new Mock <ISalesRepository>(); mockRepository.Setup(_ => _.IsCouponAvailable(It.IsAny <string>())).Returns(isCouponAvailable); var rule = new IsValidCouponRule(mockRule.Object.Invoke, mockRepository.Object); var context = new ApplyDiscountContext { Context = new ShoppingCart { CouponCode = couponValue, StartDate = DateTime.Now, Items = new List <ShoppingCartItem> { new ShoppingCartItem { Id = 1, Name = "Product 1", Price = 1.00m, Quantity = 2 }, new ShoppingCartItem { Id = 2, Name = "Product 2", Price = 2.00m, Quantity = 1 }, new ShoppingCartItem { Id = 3, Name = "Product 3", Price = 3.50m, Quantity = 1 }, } } }; // Act var shouldRun = rule.ShouldRun(context); // Assert shouldRun.Should().Be(expectedResult); }
[InlineData(0, true)] // The month of client birthday public void ShouldRun(int daysFromUtcNow, bool expectedResult) { // Arrange var mockRule = new Mock <IRule <ApplyDiscountContext> >(); mockRule.Setup(_ => _.ShouldRun(It.IsAny <ApplyDiscountContext>())).Returns(false); var rule = new BirthdayDiscountRule(mockRule.Object.Invoke); var context = new ApplyDiscountContext { ClientBirthday = DateTime.Now.AddDays(daysFromUtcNow), Context = new ShoppingCart { CouponCode = "coupon-001", StartDate = DateTime.Now, Items = new List <ShoppingCartItem> { new ShoppingCartItem { Id = 1, Name = "Product 1", Price = 1.00m, Quantity = 2 }, new ShoppingCartItem { Id = 2, Name = "Product 2", Price = 2.00m, Quantity = 1 }, new ShoppingCartItem { Id = 3, Name = "Product 3", Price = 3.50m, Quantity = 1 }, } } }; // Act var shouldRun = rule.ShouldRun(context); // Assert shouldRun.Should().Be(expectedResult); }
private bool cupomAvailable(ApplyDiscountContext context) { return(!string.IsNullOrWhiteSpace(context.Context.CupomCode) && context.Context.Items?.Count > 1 && _salesRepository.IsCupomAvaliable(context.Context.CupomCode)); }
bool shouldRun(ApplyDiscountContext context) { return((bool)(context.Properties["IsFirstOrder"] ?? false)); }