public async Task AcceptanceTest() { // arrange var progressQuery = new ProgressQueryViewModel { PlayerId = "Ross", PlayerLevel = 4, ChipAmountBet = 600 }; var questRepositoryMock = new Mock <IQuestRepository>(); questRepositoryMock .Setup(qr => qr.GetQuestAsync()) .ReturnsAsync(new QuestConfiguration { RateFromBet = 0.1m, LevelBonusRate = 0.2m, TotalPointNeededToComplete = 1000, Milestones = new List <Milestone> { new Milestone { PointsNeededToComplete = 250, MilestoneIndex = 0, ChipAwarded = 100 }, new Milestone { PointsNeededToComplete = 500, MilestoneIndex = 1, ChipAwarded = 150 }, new Milestone { PointsNeededToComplete = 750, MilestoneIndex = 2, ChipAwarded = 200 }, } }); var playerScoringRepositoryMock = new Mock <IPlayerScoringRepository>(); playerScoringRepositoryMock .Setup(psr => psr.GetPlayerScoringAsync(It.IsAny <string>())) .ReturnsAsync((string playerId) => new PlayerScoring { PlayerId = playerId, CompletedMilestoneIndices = new List <int> { }, Score = 0 }); playerScoringRepositoryMock .Setup(psr => psr.UpsertPlayerScoringAsync(It.IsAny <string>(), It.IsAny <decimal>(), It.IsAny <IEnumerable <int> >())) .Returns(Task.FromResult(0)); var controller = new ProgressController(questRepositoryMock.Object, playerScoringRepositoryMock.Object); // act var actionResult = await controller.GetProgressAsync(progressQuery) as OkObjectResult; // assert Assert.NotNull(actionResult); Assert.Equal(200, actionResult.StatusCode); ProgressViewModel value = actionResult.Value as ProgressViewModel; Assert.NotNull(value); Assert.Equal(60.8m, value.QuestPointsEarned); Assert.Equal(6.08m, value.TotalQuestPercentCompleted); }
private void GuardClause(ModelStateDictionary modelState, ProgressQueryViewModel progressQuery) { if (progressQuery == null) { ModelState.AddModelError("Invalid body", "The body is null or couldn't get deserialized."); } else if (string.IsNullOrEmpty(progressQuery.PlayerId)) { ModelState.AddModelError("Invalid body", "PlayerId can't be null not empty."); } }
public async Task <ProgressViewModel> GetProgressAsync(ProgressQueryViewModel query) { string uri = "/api/progress"; string jsonInString = JsonConvert.SerializeObject(query); HttpResponseMessage response = await _client.PostAsync(uri, new StringContent(jsonInString, Encoding.UTF8, "application/json")); response.EnsureSuccessStatusCode(); string progressString = await response.Content.ReadAsStringAsync(); ProgressViewModel progress = JsonConvert.DeserializeObject <ProgressViewModel>(progressString); return(progress); }
public async Task AcceptanceIntegrationTest() { // arrange var progressQuery = new ProgressQueryViewModel { PlayerId = "Ross", PlayerLevel = 4, ChipAmountBet = 600 }; // act ProgressViewModel progress = await _sdk.GetProgressAsync(progressQuery); // assert Assert.NotNull(progress); }
public async Task <IActionResult> GetProgressAsync([FromBody] ProgressQueryViewModel progressQuery) { // defensive code GuardClause(ModelState, progressQuery); if (!ModelState.IsValid) { return(BadRequest(ModelState)); } // get the quest configuration QuestConfiguration questConfiguration = await _questRepository.GetQuestAsync(); // get current score PlayerScoring playerScoring = await _playerScoringRepository.GetPlayerScoringAsync(progressQuery.PlayerId); decimal totalQuestPointAccumulated = playerScoring.Score + (progressQuery.ChipAmountBet * questConfiguration.RateFromBet) + (progressQuery.PlayerLevel * questConfiguration.LevelBonusRate); // new milestones reached? IEnumerable <Milestone> newCompletedMilestones = questConfiguration.Milestones .Where(m => !playerScoring.CompletedMilestoneIndices.Contains(m.MilestoneIndex) && // non completed yet m.PointsNeededToComplete <= totalQuestPointAccumulated // new milestone achieved ); // upsert the user's score and new completed milestones player score await _playerScoringRepository.UpsertPlayerScoringAsync( progressQuery.PlayerId, totalQuestPointAccumulated, newCompletedMilestones?.Select(m => m.MilestoneIndex) ?? Enumerable.Empty <int>()); return(Ok(new ProgressViewModel { QuestPointsEarned = totalQuestPointAccumulated, TotalQuestPercentCompleted = totalQuestPointAccumulated / questConfiguration.TotalPointNeededToComplete * 100, MilestonesCompleted = questConfiguration.Milestones .Where(m => playerScoring.CompletedMilestoneIndices.Contains(m.MilestoneIndex)) // already completed milestones .Concat(newCompletedMilestones) .Select(m => new MilestoneViewModel { MilestoneIndex = m.MilestoneIndex, ChipsAwarded = m.ChipAwarded }) })); }