public async Task <IActionResult> Feed(int userId, [FromBody] UserCommands.Feed feed) { var user = await _userRepository.GetByIdAsync(userId); if (user == null) { return(BadRequest($"User with id:{userId} doesn't exist.")); } var animal = user.Animals.FirstOrDefault(a => a.Id == feed.AnimalId); if (animal == null) { return(BadRequest($"User with id:{userId} doesn't own an animal with id:{feed.AnimalId}.")); } var animalStats = _animalOptions.Value.AnimalStats.FirstOrDefault(s => s.Code == animal.Code); if (animalStats == null) { return(StatusCode(StatusCodes.Status500InternalServerError, "Something went wrong, please contact the administrator.")); } animal.Feed(animalStats.FeedHungerBoost); return(Ok()); }
public async Task Feed_WhenAnimalFound_ShouldDecreaseHunger() { var key = nameof(User); var userId = 1; var animalId = 1; var users = _factory.FakeUsersCache.Get <List <User> >(key); var user = users.FirstOrDefault(u => u.Id == userId); var animal = user.Animals.FirstOrDefault(a => a.Id == animalId); var hungerBeforeFeed = animal.Metrics[MetricType.Hunger].Value; var feed = new UserCommands.Feed { AnimalId = animalId }; var response = await _client.PostAsJsonAsync(string.Format(FeedAnimalEndpoint, userId), feed); var animalOptions = _factory.Services.GetService <IOptions <AnimalOptions> >(); var animalStat = animalOptions.Value.AnimalStats.FirstOrDefault(s => s.Code == animal.Code); var currentHunger = animal.Metrics[MetricType.Hunger].Value; Assert.Equal(animalStat.FeedHungerBoost, currentHunger - hungerBeforeFeed); }