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)); }
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); }