示例#1
0
        public void Voucher_with_category__basket_value_sufficient__category_total_less_than_voucher()
        {
            var product1 = new Product {
                Id = 1, Name = "Jumper", Price = 55.00M, Category = ProductCategory.Clothing
            };
            var product2 = new Product {
                Id = 2, Name = "Head Light", Price = 3.50M, Category = ProductCategory.HeadGear
            };
            var offerVoucher = new OfferVoucher {
                Name = "YYY-YYY", Discount = 5M, Threshold = 50, Category = ProductCategory.HeadGear
            };

            var mock = new Mock <IProductService>();

            mock.Setup(s => s.Get(1)).Returns(product1);
            mock.Setup(s => s.Get(2)).Returns(product2);

            var basket = new Basket(new GiftVoucherService(), mock.Object);

            basket.AddProduct(1);
            basket.AddProduct(2);
            basket.Voucher = offerVoucher;

            Assert.AreEqual(55M, basket.Total);
            Assert.IsNull(basket.Message);
        }
        public void Multiple_Gift_vouchers_can_be_redeemed()
        {
            var product1 = new Product {
                Id = 1, Name = "Jumper", Price = 30M, Category = ProductCategory.Clothing
            };
            var product2 = new Product {
                Id = 2, Name = "Suit", Price = 250M, Category = ProductCategory.Clothing
            };
            var voucher1 = new GiftVoucher {
                Name = "XXX-XXX", Value = 50M
            };
            var voucher2 = new GiftVoucher {
                Name = "ggg-ggg", Value = 25M
            };

            var mock = new Mock <IProductService>();

            mock.Setup(s => s.Get(1)).Returns(product1);
            mock.Setup(s => s.Get(2)).Returns(product2);

            var basket = new Basket(new GiftVoucherService(), mock.Object);

            basket.AddProduct(1);
            basket.AddProduct(2);
            basket.AddGiftVoucher(voucher1);
            basket.AddGiftVoucher(voucher2);

            Assert.AreEqual(205M, basket.Total);
            Assert.IsNull(basket.Message);
        }
示例#3
0
        public void Voucher_no_category__basket_value_insufficient_because_of_gift_voucher()
        {
            var product1 = new Product {
                Id = 1, Name = "Hat", Price = 25.00M, Category = ProductCategory.Clothing
            };
            var product2 = new Product {
                Id = 2, Name = "aaa-aaa", Price = 50.00M, Category = ProductCategory.GiftVoucher
            };
            var offerVoucher = new OfferVoucher {
                Name = "YYY-YYY", Discount = 5M, Threshold = 50
            };

            var mock = new Mock <IProductService>();

            mock.Setup(s => s.Get(1)).Returns(product1);
            mock.Setup(s => s.Get(2)).Returns(product2);

            var basket = new Basket(new GiftVoucherService(), mock.Object);

            basket.AddProduct(1);
            basket.AddProduct(2);
            basket.Voucher = offerVoucher;

            Assert.AreEqual(75M, basket.Total);
            Assert.AreEqual("You have not reached the spend threshold for voucher YYY-YYY. Spend another �.01 to receive �00 discount from your basket total.", basket.Message);
        }
示例#4
0
        public void Basket4()
        {
            var product1 = new Product {
                Name = "Hat", Price = 25.00M, Category = ProductCategory.Clothing
            };
            var product2 = new Product {
                Name = "Jumper", Price = 26M, Category = ProductCategory.Clothing
            };
            var offerVoucher = new OfferVoucher {
                Name = "YYY-YYY", Discount = 5M, Threshold = 50
            };
            var giftVoucher = new GiftVoucher {
                Name = "XXX-XXX", Value = 5M
            };

            var basket = new Basket(new GiftVoucherService(), new ProductService(new Data.ProductRepository()));

            basket.AddProduct(1);
            basket.AddProduct(4);
            basket.Voucher = offerVoucher;
            basket.AddGiftVoucher(giftVoucher);

            Assert.AreEqual(41M, basket.Total);
            Assert.IsNull(basket.Message);
        }
示例#5
0
        public void Basket3()
        {
            var product1 = new Product {
                Name = "Hat", Price = 25.00M, Category = ProductCategory.Clothing
            };
            var product2 = new Product {
                Name = "Jumper", Price = 26M, Category = ProductCategory.Clothing
            };
            var product3 = new Product {
                Name = "Head Light", Price = 3.5M, Category = ProductCategory.HeadGear
            };
            var voucher = new OfferVoucher {
                Name = "YYY-YYY", Discount = 5M, Category = ProductCategory.HeadGear, Threshold = 50
            };

            var basket = new Basket(new GiftVoucherService(), new ProductService(new Data.ProductRepository()));

            basket.AddProduct(1);
            basket.AddProduct(4);
            basket.AddProduct(9);
            basket.Voucher = voucher;

            Assert.AreEqual(51M, basket.Total);
            Assert.IsNull(basket.Message);
        }
        public void Gift_vouchers_can_only_be_redeemed_against_non_gift_voucher_products()
        {
            var product1 = new Product {
                Id = 1, Name = "Jumper", Price = 30M, Category = ProductCategory.Clothing
            };
            var product2 = new Product {
                Id = 2, Name = "ggg-ggg", Price = 20M, Category = ProductCategory.GiftVoucher
            };
            var voucher = new GiftVoucher {
                Name = "XXX-XXX", Value = 50M
            };

            var mock = new Mock <IProductService>();

            mock.Setup(s => s.Get(1)).Returns(product1);
            mock.Setup(s => s.Get(2)).Returns(product2);

            var basket = new Basket(new GiftVoucherService(), mock.Object);

            basket.AddProduct(1);
            basket.AddProduct(2);
            basket.AddGiftVoucher(voucher);

            Assert.AreEqual(50.00M, basket.Total);
            Assert.AreEqual("Gift vouchers can only be redeemed against non gift voucher products.", basket.Message);
        }
示例#7
0
        public void Voucher_with_category__basket_value_equals_threshold()
        {
            var product1 = new Product {
                Id = 1, Name = "Shirt", Price = 20.00M, Category = ProductCategory.Clothing
            };
            var product2 = new Product {
                Id = 2, Name = "Shirt", Price = 30.00M, Category = ProductCategory.Clothing
            };
            var offerVoucher = new OfferVoucher {
                Name = "YYY-YYY", Discount = 5M, Threshold = 50, Category = ProductCategory.Clothing
            };

            var mock = new Mock <IProductService>();

            mock.Setup(s => s.Get(1)).Returns(product1);
            mock.Setup(s => s.Get(2)).Returns(product2);

            var basket = new Basket(new GiftVoucherService(), mock.Object);

            basket.AddProduct(1);
            basket.AddProduct(2);
            basket.Voucher = offerVoucher;

            Assert.AreEqual(50M, basket.Total);
            Assert.AreEqual("You have not reached the spend threshold for voucher YYY-YYY. Spend another �01 to receive �00 discount from your basket total.", basket.Message);
        }
示例#8
0
        public void WhenItemsAddedBasketTotalPriceIsItemsPrice()
        {
            var basket = new Basket();

            basket.AddProduct("hat1050", 1);
            basket.AddProduct("jumper2600", 1);

            Assert.Equal(36.50m, basket.TotalPrice);
        }
示例#9
0
        public void Basket1()
        {
            var basket = new Basket();

            basket.AddProduct("hat1050", 1);
            basket.AddProduct("jumper5465", 1);
            basket.AddGiftVoucher("XXX-XXX", 1);

            Assert.Equal(60.15m, basket.TotalPrice);
        }
示例#10
0
        public void WhenTotalPriceOfferVoucherAddedBasketTotalPriceIsReduced()
        {
            var basket = new Basket();

            basket.AddProduct("hat2500", 1);
            basket.AddProduct("jumper2600", 1);
            basket.AddOfferVoucher("YYY-YYY");

            Assert.Equal(46m, basket.TotalPrice);
        }
示例#11
0
        public void WhenNewItemAddedBasketContainsOldAndNewItem()
        {
            var basket = new Basket();

            basket.AddProduct("hat1050", 1);
            basket.AddProduct("jumper2600", 1);

            Assert.Equal(1, basket.Items["hat1050"].Quantity);
            Assert.Equal(1, basket.Items["jumper2600"].Quantity);
        }
        public void CalculateDiscount_TestAll()
        {
            //Arrange
            var basket = new Basket();

            basket.AddProduct(TestData.ProductTwo);
            basket.AddProduct(TestData.ProductTwo);
            basket.AddProduct(TestData.ProductThree);
            basket.AddProduct(TestData.ProductFour);
            basket.AddProduct(TestData.ProductOne);
            basket.AddProduct(TestData.ProductOne);
            basket.AddProduct(TestData.ProductOne);
            basket.AddProduct(TestData.ProductOne);
            basket.AddProduct(TestData.ProductOne);

            var expectedResult = 20.481m;

            var basketDiscountManager = new BasketDiscountManager(TestData.AvailableDiscountRules, basket);

            //Action
            var result = basketDiscountManager.CalculateDiscount();

            //Assert

            Assert.AreEqual(expectedResult, result);
        }
示例#13
0
        public void Basket2()
        {
            var basket = new Basket();

            basket.AddProduct("hat2500", 1);
            basket.AddProduct("jumper2600", 1);
            basket.AddGiftVoucher("YYY-YYY", 1);

            Assert.Equal(51.00m, basket.TotalPrice);
            Assert.Equal("There are no products in your basket applicable to voucher Voucher YYY-YYY .", basket.Message);
        }
示例#14
0
        public void WhenOfferVoucherAddedOnlyOneAdded()
        {
            var basket = new Basket();

            basket.AddProduct("hat2500", 1);
            basket.AddProduct("jumper2600", 2);
            basket.AddOfferVoucher("YYY-YYY");
            basket.AddOfferVoucher("YYY-YYY");

            Assert.Equal(72m, basket.TotalPrice);
        }
示例#15
0
        public void Basket5()
        {
            var basket = new Basket();

            basket.AddProduct("hat2500", 1);
            basket.AddProduct("gift3000", 1);
            basket.AddOfferVoucher("YYY-YYY");

            Assert.Equal(55m, basket.TotalPrice);
            Assert.Equal("You have not reached the spend threshold for voucher YYY-YYY. Spend another £25.01 to receive £5.00 discount from your basket total.", basket.Message);
        }
示例#16
0
        public void Basket4()
        {
            var basket = new Basket();

            basket.AddProduct("hat2500", 1);
            basket.AddProduct("jumper2600", 1);
            basket.AddGiftVoucher("XXX-XXX", 1);
            basket.AddOfferVoucher("YYY-YYY");

            Assert.Equal(41m, basket.TotalPrice);
        }
示例#17
0
        public void Basket3()
        {
            var basket = new Basket();

            basket.AddProduct("hat2500", 1);
            basket.AddProduct("jumper2600", 1);
            basket.AddProduct("headlight350", 1);
            basket.AddGiftVoucher("YYY-YYY", 1);

            Assert.Equal(51.00m, basket.TotalPrice);
        }
        public void GivenABasketWith2Bread2Butter_WhenTheTotalIsCalculated_ThenTheCorrectTotalIsReturned()
        {
            var basket = new Basket();

            basket.AddProduct(ProductNames.BREAD, 2);
            basket.AddProduct(ProductNames.BUTTER, 2);

            var discounts = _discountService.GetDiscounts(basket.Items);
            var total     = _basketService.Total(basket.Items, discounts);

            total.ShouldBe(3.1M);
        }
示例#19
0
        public void WhenProductsAreAdded_BasketShouldCalculateCorrectPrice()
        {
            var sut = new Basket();

            //Given the basket has 1 bread, 1 butter and 1 milk
            sut.AddProduct(ProductRepositoryMock.Milk, 1);
            sut.AddProduct(ProductRepositoryMock.Bread, 1);
            sut.AddProduct(ProductRepositoryMock.Butter, 1);

            //The total should be 2.95
            Assert.Equal(2.95m, sut.Total);
        }
示例#20
0
        public void WhenMultipelApply_BasketShouldApplyMultipleDiscounts()
        {
            var sut = new Basket(new List <Offer> {
                OfferRepositoryMock.ButterOffer, OfferRepositoryMock.MilkOffer
            });

            //Given the basket has 2 butter, 1 bread and 8 milk
            sut.AddProduct(ProductRepositoryMock.Butter, 2);
            sut.AddProduct(ProductRepositoryMock.Bread, 1);
            sut.AddProduct(ProductRepositoryMock.Milk, 8);
            //the total should be £9.00
            Assert.Equal(9m, sut.Total);
        }
示例#21
0
        public void WhenSameProductIsAddedMultipeTimes_BasketShouldCalculateCorrectPrice()
        {
            var sut = new Basket();

            //Given the basket has 1 bread, 1 butter,  1 milk and 1 milk
            sut.AddProduct(ProductRepositoryMock.Milk, 1);
            sut.AddProduct(ProductRepositoryMock.Milk, 1);
            sut.AddProduct(ProductRepositoryMock.Bread, 1);
            sut.AddProduct(ProductRepositoryMock.Butter, 1);

            //The total should be 4.10
            Assert.Equal(4.10m, sut.Total);
        }
示例#22
0
        public void When2ButterAnd2BreadAreInTheBasket_BasketShouldReturnCorrectPrice()
        {
            var sut = new Basket(new List <Offer> {
                OfferRepositoryMock.ButterOffer
            });

            //Given the basket has 2 butter and 2 bread
            sut.AddProduct(ProductRepositoryMock.Butter, 2);
            sut.AddProduct(ProductRepositoryMock.Bread, 2);

            //The total should be 3.10
            Assert.Equal(3.10m, sut.Total);
        }
示例#23
0
        public void WhenProductsAddedMultipleTimes_DiscountIsCalculatedCorrectly()
        {
            var sut = new Basket(new List <Offer> {
                OfferRepositoryMock.ButterOffer, OfferRepositoryMock.MilkOffer
            });

            //Given the basket contains 4 milk
            sut.AddProduct(ProductRepositoryMock.Milk, 1);
            sut.AddProduct(ProductRepositoryMock.Milk, 1);
            sut.AddProduct(ProductRepositoryMock.Milk, 1);
            sut.AddProduct(ProductRepositoryMock.Milk, 1);
            //The total should be 3.45
            Assert.Equal(3.45m, sut.Total);
        }
        public void Basket6()
        {
            ICategory headGearCategory = new Category("headgear");

            IProduct jumper    = new Product("jumper", new decimal(54.65));
            IProduct headLight = new Product(headGearCategory, "head light", new decimal(3.50));

            IBasket basket = new Basket();

            basket.AddProduct(jumper, 1);
            basket.AddProduct(headLight, 1);

            Assert.AreEqual(58.15, basket.Total);
        }
示例#25
0
        public void GivenBreadProduct_WhenAddedTwiceToBasket_ThenBasketShoudHaveTwoBreads()
        {
            //Arrange
            var basket = new Basket(null);
            var bread  = StaticProductCatalog.Bread;

            //Act
            basket.AddProduct(bread);
            basket.AddProduct(bread);

            //Assert
            Assert.AreEqual(2, basket.Items.Count);
            Assert.IsTrue(basket.Items.All(t => t == bread));
        }
        public void Basket1()
        {
            IProduct hat    = new Product("hat", new decimal(10.50));
            IProduct jumper = new Product("jumper", new decimal(54.65));

            IDiscount giftCard = new GiftVoucher("XXX-XXX", new decimal(5.00));

            IBasket basket = new Basket();

            basket.AddProduct(hat, 1);
            basket.AddProduct(jumper, 1);
            basket.AddDiscount(giftCard);

            Assert.AreEqual(60.15, basket.Total);
        }
示例#27
0
        public void AddProductTest_AddTwo()
        {
            //Arrange
            var basket = new Basket();

            //Action
            basket.AddProduct(TestData.ProductOne);
            basket.AddProduct(TestData.ProductTwo);
            var resultItem = basket.LineItems.FirstOrDefault(l => l.ProductId == TestData.ProductTwo.Id);

            //Asset
            Assert.AreEqual(basket.LineItems.Count, 2);
            Assert.IsNotNull(resultItem);
            Assert.AreEqual(resultItem.Count, 1);
        }
示例#28
0
        public void GivenTwoProducts_WhenAddedToBasket_ThenBasketContainsThem()
        {
            //Arrange
            var basket = new Basket(null);
            var butter = StaticProductCatalog.Butter;
            var milk   = StaticProductCatalog.Milk;

            //Act
            basket.AddProduct(butter);
            basket.AddProduct(milk);

            //Assert
            Assert.AreEqual(2, basket.Items.Count);
            Assert.IsTrue(basket.Items.Contains(butter));
            Assert.IsTrue(basket.Items.Contains(milk));
        }
示例#29
0
        public void CalculateDiscount_Test2()
        {
            //Arrange
            var basket = new Basket();

            basket.AddProduct(TestData.ProductTwo);
            basket.AddProduct(TestData.ProductTwo);
            var discountRule = new BuyXDiscount(TestData.ProductTwo, 1, 50);

            var expectedResult = 2.655m;
            //Action
            var result = discountRule.CalculateDiscount(basket);

            //Asset
            Assert.AreEqual(expectedResult, result);
        }
示例#30
0
        public void GivenBasketWithBreadAndButter_WhenTotalCalculated_ThenTotalShouldBeSumOfProductPrices()
        {
            //Arrange
            var basket = new Basket(new List <IOffer>());
            var bread  = StaticProductCatalog.Bread;
            var butter = StaticProductCatalog.Butter;

            basket.AddProduct(bread);
            basket.AddProduct(butter);

            //Act
            var total = basket.GetTotal();

            //Assert
            Assert.AreEqual(bread.Price + butter.Price, total);
        }