Ejemplo n.º 1
0
        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
                })
            }));
        }