public void Create_Should_Throw_Exception_If_Quantity_BiggerThan_Stock()
        {
            var productStock = 10;
            var quantity     = 11;

            _productEntityMock.Setup(x => x.Stock).Returns(productStock);

            Assert.Throws <InsufficientStockException>(() =>
            {
                _createOrderService.Create(_productEntityMock.Object, quantity, null, 1);
            });
        }
        public async Task <CreateOrderResponse> Handle(CreateOrderCommand request, CancellationToken cancellationToken)
        {
            var product = await _productRepository.FindOneAsync(x => x.ProductCode == request.ProductCode);

            if (product == null)
            {
                throw new ProductNotFoundException();
            }

            var campaignsForProduct = await _campaignRepository.FindAsync(x => x.ProductCode == request.ProductCode);

            var campaignForProduct = campaignsForProduct.FirstOrDefault(x => x.IsActive(_timeService.CurrentTime));

            var order = _createOrderService.Create(product, request.Quantity, campaignForProduct, _timeService.CurrentTime);

            await _productRepository.UpdateAsync(product);

            if (campaignForProduct != null)
            {
                await _campaignRepository.UpdateAsync(campaignForProduct);
            }

            var orderEntity = await _orderRepository.AddAsync(order);

            return(new CreateOrderResponse(orderEntity));
        }