Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
    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);
        }
    }
Пример #5
0
        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");
        }
Пример #6
0
        [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);
        }
Пример #7
0
        [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);
        }
Пример #8
0
 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));
 }