Exemple #1
0
        internal async Task ValidateBasket(ShoppingBasketDto basket)
        {
            if (basket == null || basket.Articles == null || !basket.Articles.Any())
            {
                throw new InvalidBasketException("Basket is empty");
            }

            foreach (var item in basket.Articles)
            {
                var articleDto          = item.Article;
                var articleDiscountDto  = item.ArticleDiscount;
                var articlePriceDto     = item.ArticlePrice;
                var numberOfArticlesDto = item.NumberOfArticles;

                // check number of articles
                if (!numberOfArticlesDto.HasValue)
                {
                    throw new InvalidBasketException("Number of articles is invalid");
                }

                // check discount
                if (articleDiscountDto != null)
                {
                    ArticleDiscount articleDiscount = await _discountRepository.GetByIdAsync(articleDiscountDto.Id.Value).ConfigureAwait(false);

                    var articleDiscountDbDto = _mapper.Map <ArticleDiscountDto>(articleDiscount);
                    if (!articleDiscountDbDto.Equals(articleDiscountDto))
                    {
                        throw new InvalidDiscountException("ArticleDiscount is invalid");
                    }
                }

                // check article
                Article article = await _articleRepository.GetByIdAsync(articleDto.Id.Value).ConfigureAwait(false);

                var articleDbDto = _mapper.Map <ArticleDto>(article);
                if (!articleDbDto.Equals(articleDto))
                {
                    throw new InvalidArticleException("Article is invalid");
                }

                // check articlePrice
                var articlePrice = await _priceRepository.GetByIdAsync(articlePriceDto.Id.Value).ConfigureAwait(false);

                var articlePriceDbDto = _mapper.Map <ArticlePriceDto>(articlePrice);
                if (!articlePriceDbDto.Equals(articlePriceDto))
                {
                    throw new InvalidArticlePriceException("ArticlePrice is invalid");
                }
            }
        }
        public void CalculatePrice_TestCases_Success(int numberOfArticels, decimal articlePrice, int amountOfArticlesForDiscount, decimal discountPrice, decimal expectedPrice)
        {
            // Arrange
            var supermarketCheckout = new SupermarketCheckoutService(_subDiscountRepository, _subPriceRepository, _subArticleRepository, _mapper);
            var itemDiscount        = new ArticleDiscount
            {
                NumberOfArticles = amountOfArticlesForDiscount,
                NewPrice         = discountPrice
            };
            // Act
            decimal price = supermarketCheckout.CalculatePrice(numberOfArticels, articlePrice, itemDiscount);

            // Assert
            Assert.That(price, Is.EqualTo(expectedPrice));
        }
Exemple #3
0
        internal decimal CalculatePrice(int numberOfArticles, decimal itemPrice, ArticleDiscount articleDiscount)
        {
            decimal price = 0;
            int     currentNumberOfArticles = numberOfArticles;

            // 1st try to use the discount price for as much items as possible
            while (articleDiscount != null && articleDiscount.NumberOfArticles != 0 && currentNumberOfArticles >= articleDiscount.NumberOfArticles)
            {
                price += articleDiscount.NewPrice;
                currentNumberOfArticles -= articleDiscount.NumberOfArticles;
            }

            // 2nd use the common single item price
            if (currentNumberOfArticles > 0)
            {
                price += currentNumberOfArticles * itemPrice;
            }

            return(price);
        }