public void CalculateDiscount_CouponOfTypePercentageAndHigherThan100_ThrowInvalidCouponException()
        {
            var target = new CouponEngine();

            Assert.Throws <InvalidCouponException>(
                () => target.CalculateDiscount(CreateCheckOutDto(total: 200), CreateCoupon(value: 101, couponType: CouponType.Percentage)));
        }
        public void CalculateDiscount_CouponHasNegativeValue_ThrowInvalidCouponException()
        {
            var target = new CouponEngine();

            Assert.Throws <InvalidCouponException>(
                () => target.CalculateDiscount(CreateCheckOutDto(total: 10), CreateCoupon(value: -10)));
        }
        public void CalculateDiscount_CouponHasValueGreaterThanShoppingCartTotal_ThrowInvalidCouponException()
        {
            var target = new CouponEngine();

            Assert.Throws <InvalidCouponException>(
                () => target.CalculateDiscount(CreateCheckOutDto(total: 10), CreateCoupon(value: 20)));
        }
        public void CalculateDiscount_CouponHasExpired_ThrowCouponExpiredException(CouponType couponType)
        {
            var target = new CouponEngine();

            Assert.Throws <CouponExpiredException>(() =>
                                                   target.CalculateDiscount(CreateCheckOutDto(), CreateCoupon(couponType: couponType, expiration: DateTime.Now.AddDays(-1))));
        }
        public void CalculateDiscount_CouponOfTypeFreeShipping_ReturnShippingCost()
        {
            var target = new CouponEngine();

            var actual = target.CalculateDiscount(CreateCheckOutDto(shippingCost: 10), CreateCoupon(couponType: CouponType.FreeShipping));

            Assert.Equal(10, actual);
        }
        public void CalculateDiscount_CouponOfTypePercentageAndHigherThanAmount_DoNotThrowInvalidCouponException()
        {
            var target = new CouponEngine();

            var actual = target.CalculateDiscount(CreateCheckOutDto(total: 10), CreateCoupon(value: 50, couponType: CouponType.Percentage));

            Assert.Equal(5, actual);
        }
        public void CalculateDiscount_CouponOfTypePercentage_ReturnPercentageOfTotal()
        {
            var target = new CouponEngine();

            var actual = target.CalculateDiscount(CreateCheckOutDto(total: 200), CreateCoupon(value: 10, couponType: CouponType.Percentage));

            Assert.Equal(20, actual);
        }
        public void CalculateDiscount_CouponHasAmountValue_ReturnNumber(double amount)
        {
            var target = new CouponEngine();

            var actual = target.CalculateDiscount(CreateCheckOutDto(total: 10), CreateCoupon(value: amount));

            Assert.Equal(amount, actual);
        }
        public void CalculateDiscount_CouponIsNull_Return0()
        {
            var target = new CouponEngine();

            var actual = target.CalculateDiscount(CreateCheckOutDto(), null);

            Assert.Equal(0, actual);
        }
        public void CalculateDiscount_CouponIsNull_Return0()
        {
            // We could have used auto mocking container here as well, however at the moment this initialization is simple as it is
            var target = new CouponEngine();

            var actual = target.CalculateDiscount(CreateCheckOutDto(), null);

            Assert.Equal(0, actual);
        }
        public void When_Coupon_Is_Null_Return_Zero()
        {
            var sut             = new CouponEngine();
            var shoppingCartDto = new ShoppingCartDto()
            {
                Id = "1", Items = Utility.GenerateListOfDtoItems()
            };
            var checkout = new CheckoutDto(shoppingCartDto, 10, 1, 100);

            var result = sut.CalculateDiscount(checkout, null);

            result.Should().Be(0);
        }
        public void Coupon_Calculated_As_A_Percentage()
        {
            var sut             = new CouponEngine();
            var shoppingCartDto = new ShoppingCartDto()
            {
                Id = "1", Items = Utility.GenerateListOfDtoItems()
            };
            var checkout = new CheckoutDto(shoppingCartDto, 10, 1, 10);

            var result = sut.CalculateDiscount(checkout,
                                               new Coupon()
            {
                Amount = 2, Type = CouponType.Percentage, ExpiryDate = DateTime.Now.AddDays(10)
            });

            result.Should().Be(20);
        }
        public void Coupon_Cannot_Be_Greater_Than_Cart_Total()
        {
            var sut             = new CouponEngine();
            var shoppingCartDto = new ShoppingCartDto()
            {
                Id = "1", Items = Utility.GenerateListOfDtoItems()
            };
            var checkout = new CheckoutDto(shoppingCartDto, 10, 1, 10);

            Action result = () => sut.CalculateDiscount(checkout, new Coupon()
            {
                Amount = 100, ExpiryDate = DateTime.Now.AddDays(-60)
            });

            result.Should().Throw <CouponExpiredException>()
            .WithMessage("Coupon past 30 days and has expired.");
        }
        public void Coupon_No_More_Than_OneHundred()
        {
            var sut             = new CouponEngine();
            var shoppingCartDto = new ShoppingCartDto()
            {
                Id = "1", Items = Utility.GenerateListOfDtoItems()
            };
            var checkout = new CheckoutDto(shoppingCartDto, 20, 10, 200);

            Action result = () => sut.CalculateDiscount(checkout,
                                                        new Coupon()
            {
                Amount = 100, Type = CouponType.Percentage, ExpiryDate = DateTime.Now.AddDays(10)
            });

            result.Should().Throw <InvalidCouponException>()
            .WithMessage("Coupon amount cannot be equal to 100.");
        }
        public void Coupon_Cannot_Be_A_Negative_Number()
        {
            var sut             = new CouponEngine();
            var shoppingCartDto = new ShoppingCartDto()
            {
                Id = "1", Items = Utility.GenerateListOfDtoItems()
            };
            var checkout = new CheckoutDto(shoppingCartDto, 10, 1, 10);

            Action result = () => sut.CalculateDiscount(checkout,
                                                        new Coupon()
            {
                Amount = -2, ExpiryDate = DateTime.Now.AddDays(10)
            });

            result.Should().Throw <InvalidCouponException>()
            .WithMessage("Coupon amount cannot be negative.");
        }