public async Task Throw500WhenSendingToNutritionTopicFails()
        {
            // Arrange
            var nutrition = new mdl.Nutrition
            {
                NutritionDate = "2019-12-31"
            };
            var foodResponse = new FoodResponseObject
            {
            };

            _mockDateValidator.Setup(x => x.IsNutritionDateValid(It.IsAny <string>())).Returns(true);
            _mockFitbitApiService.Setup(x => x.GetFoodLogs(It.IsAny <string>())).ReturnsAsync(foodResponse);
            _mockMapper.Setup(x => x.Map(It.IsAny <FoodResponseObject>(), It.IsAny <mdl.Nutrition>())).Verifiable();
            _mockServiceBusHelpers.Setup(x => x.SendMessageToTopic(It.IsAny <string>(), It.IsAny <mdl.Nutrition>())).ThrowsAsync(new Exception());

            // Act
            var response = await _func.Run(_mockHttpRequest.Object, _mockLogger.Object, nutrition.NutritionDate);

            // Assert
            Assert.Equal(typeof(StatusCodeResult), response.GetType());
            var responseAsStatusCodeResult = (StatusCodeResult)response;

            Assert.Equal(500, responseAsStatusCodeResult.StatusCode);
            _mockServiceBusHelpers.Verify(x => x.SendMessageToQueue(It.IsAny <string>(), It.IsAny <Exception>()), Times.Once);
        }
        public async Task <FoodResponseObject> CreateOneAsync(CreateFoodDto t)
        {
            var foodGroup = await _foodGroupRepository.FindOneByIdAsync(t.FoodGroupId);

            if (foodGroup == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound, "FoodGroup not found");
            }

            var found = await _foodRepository.FindOneByNameAsync(t.Name);

            if (found != null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound, $"Food with name {t.Name} already exists");
            }

            var newFood = new Food
            {
                Name        = t.Name,
                FoodGroupId = foodGroup.Id
            };

            await _foodRepository.CreateOneAsync(newFood);

            return(FoodResponseObject.FromEntity(newFood));
        }
        public async Task <FoodResponseObject> FindOneByNameAsync(string name)
        {
            var found = await _foodRepository.FindOneByNameAsync(name);

            if (found == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound, $"Food with name {name} was not found");
            }

            return(FoodResponseObject.FromEntity(found));
        }
        public async Task <FoodResponseObject> FindOneByIdAsync(int id)
        {
            var found = await _foodRepository.FindOneByIdAsync(id);

            if (found == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound, "Food not found");
            }

            return(FoodResponseObject.FromEntity(found));
        }
        public async Task ReturnBadRequestResultWhenProvidedDateIsInvalid(string invalidDateInput)
        {
            // Arrange
            var foodResponse = new FoodResponseObject();

            byte[]       byteArray    = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(foodResponse));
            MemoryStream memoryStream = new MemoryStream(byteArray);

            _mockHttpRequest.Setup(r => r.Body).Returns(memoryStream);

            _mockDateValidator.Setup(x => x.IsNutritionDateValid(invalidDateInput)).Returns(false);

            // Act
            var response = await _func.Run(_mockHttpRequest.Object, _mockLogger.Object, invalidDateInput);

            // Assert
            Assert.Equal(typeof(BadRequestResult), response.GetType());
            var responseAsStatusCodeResult = (StatusCodeResult)response;

            Assert.Equal(400, responseAsStatusCodeResult.StatusCode);
            _mockServiceBusHelpers.Verify(x => x.SendMessageToTopic(It.IsAny <string>(), It.IsAny <mdl.Nutrition>()), Times.Never);
            _mockServiceBusHelpers.Verify(x => x.SendMessageToQueue(It.IsAny <string>(), It.IsAny <Exception>()), Times.Never);
        }
        public async Task ReturnOkObjectResultWhenMappedNutritionLogIsSentToNutritionTopic()
        {
            // Arrange
            var nutrition = new mdl.Nutrition
            {
                NutritionDate = "2019-12-31"
            };
            var foodResponse = new FoodResponseObject
            {
            };

            _mockDateValidator.Setup(x => x.IsNutritionDateValid(It.IsAny <string>())).Returns(true);
            _mockFitbitApiService.Setup(x => x.GetFoodLogs(It.IsAny <string>())).ReturnsAsync(foodResponse);
            _mockMapper.Setup(x => x.Map(It.IsAny <FoodResponseObject>(), It.IsAny <mdl.Nutrition>())).Verifiable();
            _mockServiceBusHelpers.Setup(x => x.SendMessageToTopic(It.IsAny <string>(), It.IsAny <mdl.Nutrition>())).Returns(Task.CompletedTask);

            // Act
            var response = await _func.Run(_mockHttpRequest.Object, _mockLogger.Object, nutrition.NutritionDate);

            // Assert
            Assert.Equal(typeof(OkResult), response.GetType());
            _mockServiceBusHelpers.Verify(x => x.SendMessageToTopic(It.IsAny <string>(), It.IsAny <mdl.Nutrition>()), Times.Once);
            _mockServiceBusHelpers.Verify(x => x.SendMessageToQueue(It.IsAny <string>(), It.IsAny <Exception>()), Times.Never);
        }