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);
        }
Esempio n. 3
0
        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
            }));
        }