public void NotAddProductDueToLackOfStock() { //arrange var productDto = new ProductDto { Id = 1, Name = "product" }; var requestDto = new AddToBasketRequestDto() { CityId = 1, ProductId = 1, Quantity = 1 }; ConstraintHelper.mockProductStock.Setup(x => x.GetProductForCityId(1, 1, 1)).Returns(Task.FromResult(productDto)); //act var service = new BasketService(ConstraintHelper.mockBasketProduct.Object, ConstraintHelper.mockBasket.Object, ConstraintHelper.mockProductStock.Object, ConstraintHelper.mockUnitOfWork.Object, ConstraintHelper.mockLogger.Object); var actual = service.AddToBasket(ConstraintHelper.UserId, requestDto); Assert.AreEqual(AddToBasketReturnTypes.Err_ProductNotFound, actual.Result.ResponseCode); Assert.AreEqual(false, actual.Result.IsSuccess); Assert.AreEqual(false, actual.Result.Data); }
public void SuccessfullyAddProduct() { var productDto = new ProductDto { Id = 1, Name = "product", Stock = new StockDto() { Id = 1, CityId = 1, Quantity = 10 }, MinOrderQuantity = 1, MaxOrderQuantity = 100 }; var basketId = 1; var basketProductEntity = new BasketProduct() { BasketId = 1, ProductId = 1, Quantity = 2 }; var productResponseDto = new ProductDto() { Id = 1, Stock = new StockDto() { Id = 1, CityId = 1, Quantity = 8 }, }; var requestDto = new AddToBasketRequestDto() { CityId = 1, ProductId = 1, Quantity = 2 }; ConstraintHelper.mockProductStock.Setup(x => x.GetProductForCityId(1, 1, 2)).Returns(Task.FromResult(productDto)); ConstraintHelper.mockBasket.Setup(x => x.GetOrCreateBasketId(ConstraintHelper.UserId)).Returns(Task.FromResult(basketId)); ConstraintHelper.mockBasketProduct.Setup(x => x.AddToBasket(basketProductEntity)); ConstraintHelper.mockBasketProduct.Setup(x => x.BeginTransaction()).Returns(ConstraintHelper.mockContextTransaction.Object); ConstraintHelper.mockProductStock.Setup(x => x.UpdateStock(1, 8)); var service = new BasketService(ConstraintHelper.mockBasketProduct.Object, ConstraintHelper.mockBasket.Object, ConstraintHelper.mockProductStock.Object, ConstraintHelper.mockUnitOfWork.Object, ConstraintHelper.mockLogger.Object); var actual = service.AddToBasket(ConstraintHelper.UserId, requestDto); Assert.AreEqual(true, actual.Result.IsSuccess); Assert.AreEqual(AddToBasketReturnTypes.Success, actual.Result.ResponseCode); }
public async Task <ResponseDto <bool, AddToBasketReturnTypes> > AddToBasket(Guid userId, AddToBasketRequestDto model) { bool isSuccess = false; var responseCode = new AddToBasketReturnTypes(); var responseMessage = string.Empty; var product = await _productStockRepository.GetProductForCityId(model.ProductId, model.CityId, model.Quantity); if (product == null || product.Stock == null) { // Şehir bazlı Stock yapısı kullanıldı, bu nedenle Stock kontrolünde CityId de istenmektedir. // CityId için 1-5 aralığı kullanılabilir (5 için Stock tanıtılmadı / 4 için Stock'lar 0 olarak tanıtıldı) // Stock kontrolünde ayrıca Min-Max Order Quantity bilgileri de girdi olarak alınmaktadır responseCode = AddToBasketReturnTypes.Err_ProductNotFound; responseMessage = EnumHelper.GetEnumDescriptionForValue(AddToBasketReturnTypes.Err_ProductNotFound); _logger.LogWarning($" - AddToBasketService/Stock Hatası :{ JsonConvert.SerializeObject(model)}" + " UserId: " + userId); } else { var basketId = new int(); try { // Ürünün ekleneceği BasketId çekilmektedir basketId = await _basketRepository.GetOrCreateBasketId(userId); } catch (Exception e) { isSuccess = false; responseCode = AddToBasketReturnTypes.Err_UnexpedtedError; responseMessage = e.Message + " " + (e.InnerException != null ? e.InnerException.Message : ""); _logger.LogError(e, $" - AddToBasketService - Model: { JsonConvert.SerializeObject(model)}" + " UserId: " + userId); } if (basketId > 0) { using (var transaction = _basketProductRepository.BeginTransaction()) { // Çoklu tablo güncellemesi yapıldığı için UnitOfWork ile transaction açılarak gerçekleştirilmektedir try { var requestModel = new BasketProduct() { BasketId = basketId, ProductId = product.Id, Quantity = model.Quantity }; _basketProductRepository.AddToBasket(requestModel); _productStockRepository.UpdateStock(model.Quantity, product.Stock.Id); await _unitOfWork.SaveChangesAsync(); transaction.Commit(); isSuccess = true; responseCode = AddToBasketReturnTypes.Success; responseMessage = EnumHelper.GetEnumDescriptionForValue(AddToBasketReturnTypes.Success); _logger.LogInformation($"AddToBasketService/Başarılı Ürün Ekleme - Model: { JsonConvert.SerializeObject(model)}" + " UserId: " + userId); } catch (Exception e) { // Olası bir hata durumunda database'de yapılan değişiklikler rollback yapılarak veri kaybı yaşanması engelleniyor // Gerçekleşen exceptipn loglanarak kayıt altına alınıyor transaction.Rollback(); isSuccess = false; responseCode = AddToBasketReturnTypes.Err_UnexpedtedError; responseMessage = e.Message + " " + (e.InnerException != null ? e.InnerException.Message : ""); _logger.LogError(e, $" - GetBasketService/Transaction - Model: { JsonConvert.SerializeObject(model)}" + " UserId: " + userId); } } } } return(await Task.FromResult(new ResponseDto <bool, AddToBasketReturnTypes>() { ResponseCode = responseCode, ResponseMessage = responseMessage, IsSuccess = isSuccess, Data = isSuccess })); }