public async Task <IActionResult> Stroke(int userId, [FromBody] UserCommands.Stroke stroke) { 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 == stroke.AnimalId); if (animal == null) { return(BadRequest($"User with id:{userId} doesn't own an animal with id:{stroke.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.Stroke(animalStats.StrokeHappinessBoost); return(Ok()); }
public async Task Stroke_WhenAnimalFound_ShouldIncreaseHappiness() { 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 happinessBeforeStroke = animal.Metrics[MetricType.Happiness].Value; var stroke = new UserCommands.Stroke { AnimalId = animalId }; var response = await _client.PostAsJsonAsync(string.Format(StrokeAnimalEndpoint, userId), stroke); var animalOptions = _factory.Services.GetService <IOptions <AnimalOptions> >(); var animalStat = animalOptions.Value.AnimalStats.FirstOrDefault(s => s.Code == animal.Code); var currentHappiness = animal.Metrics[MetricType.Happiness].Value; Assert.Equal(animalStat.StrokeHappinessBoost, currentHappiness - happinessBeforeStroke); }