예제 #1
0
        //TODO need to have validation logic here (or on PlayedGame similar to what is on NewlyCompletedGame)
        public PlayedGame CreatePlayedGame(NewlyCompletedGame newlyCompletedGame, TransactionSource transactionSource, ApplicationUser currentUser)
        {
            GameDefinition gameDefinition = dataContext.FindById <GameDefinition>(newlyCompletedGame.GameDefinitionId);

            securedEntityValidatorForGameDefinition.ValidateAccess(gameDefinition, currentUser, typeof(GameDefinition), newlyCompletedGame.GameDefinitionId);

            this.ValidateAccessToPlayers(newlyCompletedGame, currentUser);

            List <PlayerGameResult> playerGameResults = TransformNewlyCompletedGamePlayerRanksToPlayerGameResults(newlyCompletedGame);

            PlayedGame playedGame = TransformNewlyCompletedGameIntoPlayedGame(
                newlyCompletedGame,
                currentUser.CurrentGamingGroupId,
                currentUser.Id,
                playerGameResults);

            dataContext.Save(playedGame, currentUser);

            playedGameTracker.TrackPlayedGame(currentUser, transactionSource);

            foreach (PlayerGameResult result in playerGameResults)
            {
                nemesisRecalculator.RecalculateNemesis(result.PlayerId, currentUser);
            }
            championRecalculator.RecalculateChampion(playedGame.GameDefinitionId, currentUser);

            return(playedGame);
        }
        private NewlyCompletedGame CreateValidNewlyCompletedGame()
        {
            List <PlayerRank> playerRanks;

            var playerOneId        = 3515;
            var playerTwoId        = 15151;
            var playerOneRank      = 1;
            var playerTwoRank      = 2;
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = _expectedGameDefinition.Id
            };

            playerRanks = new List <PlayerRank>();
            playerRanks.Add(new PlayerRank
            {
                PlayerId = playerOneId, GameRank = playerOneRank
            });
            playerRanks.Add(new PlayerRank
            {
                PlayerId = playerTwoId, GameRank = playerTwoRank
            });
            newlyCompletedGame.PlayerRanks = playerRanks;
            _autoMocker.Get <IPointsCalculator>()
            .Expect(mock => mock.CalculatePoints(null, null))
            .IgnoreArguments()
            .Return(new Dictionary <int, PointsScorecard>
            {
                { playerOneId, new PointsScorecard() },
                { playerTwoId, new PointsScorecard() }
            });
            return(newlyCompletedGame);
        }
예제 #3
0
        public void ItChecksSecurityOnThePlayerId()
        {
            var playerRanks = new List <PlayerRank>
            {
                new PlayerRank
                {
                    PlayerId = existingPlayerWithMatchingGamingGroup.Id
                }
            };
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks      = playerRanks
            };

            autoMocker.Get <IDataContext>().Expect(mock => mock.FindById <Player>(existingPlayerWithMatchingGamingGroup.Id))
            .Return(existingPlayerWithMatchingGamingGroup);
            autoMocker.Get <IPointsCalculator>()
            .Expect(mock => mock.CalculatePoints(null, null))
            .IgnoreArguments()
            .Return(new Dictionary <int, PointsScorecard>
            {
                { existingPlayerWithMatchingGamingGroup.Id, new PointsScorecard() }
            });

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

            autoMocker.Get <ISecuredEntityValidator>().AssertWasCalled(mock => mock.ValidateAccess(
                                                                           existingPlayerWithMatchingGamingGroup,
                                                                           currentUser));
        }
예제 #4
0
        private PlayedGame CreateTestPlayedGame(
            int gameDefinitionId,
            List <Player> players,
            List <int> correspondingPlayerRanks,
            ApplicationUser currentUser,
            IPlayedGameCreator playedGameCreator)
        {
            List <PlayerRank> playerRanks = new List <PlayerRank>();

            for (int i = 0; i < players.Count(); i++)
            {
                playerRanks.Add(new PlayerRank()
                {
                    PlayerId = players[i].Id,
                    GameRank = correspondingPlayerRanks[i]
                });
            }

            NewlyCompletedGame newlyCompletedGame = new NewlyCompletedGame()
            {
                GameDefinitionId = gameDefinitionId,
                PlayerRanks      = playerRanks,
            };

            return(playedGameCreator.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser));
        }
예제 #5
0
        //TODO need to have validation logic here (or on PlayedGame similar to what is on NewlyCompletedGame)
        public PlayedGame CreatePlayedGame(NewlyCompletedGame newlyCompletedGame, TransactionSource transactionSource, ApplicationUser currentUser)
        {
            if (newlyCompletedGame.GamingGroupId.HasValue && newlyCompletedGame.GamingGroupId != currentUser.CurrentGamingGroupId)
            {
                _securedEntityValidator.RetrieveAndValidateAccess<GamingGroup>(newlyCompletedGame.GamingGroupId.Value, currentUser);
            }

            var gameDefinition = _securedEntityValidator.RetrieveAndValidateAccess<GameDefinition>(newlyCompletedGame.GameDefinitionId, currentUser);

            _linkedPlayedGameValidator.Validate(newlyCompletedGame);

            var gamingGroupId = newlyCompletedGame.GamingGroupId ?? currentUser.CurrentGamingGroupId;

            ValidateAccessToPlayers(newlyCompletedGame.PlayerRanks, gamingGroupId, currentUser);

            var playerGameResults = MakePlayerGameResults(newlyCompletedGame, gameDefinition.BoardGameGeekGameDefinitionId);

            var playedGame = TransformNewlyCompletedGameIntoPlayedGame(
                newlyCompletedGame,
                gamingGroupId,
                currentUser.Id,
                playerGameResults);

            playedGame = _dataContext.Save(playedGame, currentUser);

            CreateApplicationLinkages(newlyCompletedGame.ApplicationLinkages, playedGame.Id);

            DoPostSaveStuff(transactionSource, currentUser, playedGame.Id, playedGame.GameDefinitionId, playerGameResults);

            return playedGame;
        }
예제 #6
0
        public void ItSetsThePlayerRanks()
        {
            this.playedGameMessage.PlayerRanks = new List <PlayerRank>
            {
                new PlayerRank()
                {
                    GameRank = 1, PlayerId = 100, PointsScored = 10
                },
                new PlayerRank()
                {
                    GameRank = 2, PlayerId = 200, PointsScored = 8
                }
            };
            this.autoMocker.ClassUnderTest.RecordPlayedGame(this.playedGameMessage, this.applicationUser.CurrentGamingGroupId);
            IList <object[]> arguments = this.autoMocker.Get <IPlayedGameCreator>().GetArgumentsForCallsMadeOn(mock => mock.CreatePlayedGame(
                                                                                                                   Arg <NewlyCompletedGame> .Is.Anything,
                                                                                                                   Arg <TransactionSource> .Is.Anything,
                                                                                                                   Arg <ApplicationUser> .Is.Anything));

            NewlyCompletedGame newlyCompletedGame = arguments[0][0] as NewlyCompletedGame;

            Assert.That(newlyCompletedGame.PlayerRanks[0].GameRank, Is.EqualTo(this.playedGameMessage.PlayerRanks[0].GameRank));
            Assert.That(newlyCompletedGame.PlayerRanks[0].PlayerId, Is.EqualTo(this.playedGameMessage.PlayerRanks[0].PlayerId));
            Assert.That(newlyCompletedGame.PlayerRanks[0].PointsScored, Is.EqualTo(this.playedGameMessage.PlayerRanks[0].PointsScored));
            Assert.That(newlyCompletedGame.PlayerRanks[1].GameRank, Is.EqualTo(this.playedGameMessage.PlayerRanks[1].GameRank));
            Assert.That(newlyCompletedGame.PlayerRanks[1].PlayerId, Is.EqualTo(this.playedGameMessage.PlayerRanks[1].PlayerId));
            Assert.That(newlyCompletedGame.PlayerRanks[1].PointsScored, Is.EqualTo(this.playedGameMessage.PlayerRanks[1].PointsScored));
        }
예제 #7
0
        public void ItSavesAPlayedGameIfThereIsAGameDefinition()
        {
            int playerOneId   = 3515;
            int playerTwoId   = 15151;
            int playerOneRank = 1;
            int playerTwoRank = 2;
            NewlyCompletedGame newlyCompletedGame = new NewlyCompletedGame()
            {
                GameDefinitionId = gameDefinition.Id
            };
            List <PlayerRank> playerRanks = new List <PlayerRank>();

            playerRanks.Add(new PlayerRank()
            {
                PlayerId = playerOneId, GameRank = playerOneRank
            });
            playerRanks.Add(new PlayerRank()
            {
                PlayerId = playerTwoId, GameRank = playerTwoRank
            });
            newlyCompletedGame.PlayerRanks = playerRanks;

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, this.currentUser);

            autoMocker.Get <IDataContext>().AssertWasCalled(mock => mock.Save(
                                                                Arg <PlayedGame> .Matches(game => game.GameDefinitionId == gameDefinition.Id &&
                                                                                          game.NumberOfPlayers == playerRanks.Count() &&
                                                                                          game.DatePlayed.Date.Equals(newlyCompletedGame.DatePlayed.Date)),
                                                                Arg <ApplicationUser> .Is.Same(currentUser)));
        }
예제 #8
0
        public void ItRecordsAGamePlayedEvent()
        {
            var playerRank = new PlayerRank
            {
                GameRank = 1,
                PlayerId = 1
            };
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks      = new List <PlayerRank>
                {
                    playerRank
                }
            };
            var transactionSource = TransactionSource.RestApi;

            autoMocker.Get <IPointsCalculator>()
            .Expect(mock => mock.CalculatePoints(null, null))
            .IgnoreArguments()
            .Return(new Dictionary <int, PointsScorecard>
            {
                { playerRank.PlayerId, new PointsScorecard() }
            });

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, transactionSource, currentUser);

            autoMocker.Get <INemeStatsEventTracker>().AssertWasCalled(mock => mock.TrackPlayedGame(currentUser, transactionSource));
        }
예제 #9
0
 private void ValidateAccessToPlayers(NewlyCompletedGame newlyCompletedGame, ApplicationUser currentUser)
 {
     foreach (var playerRank in newlyCompletedGame.PlayerRanks)
     {
         Player player = this.dataContext.FindById <Player>(playerRank.PlayerId);
         this.securedEntityValidatorForPlayer.ValidateAccess(player, currentUser, typeof(Player), player.Id);
     }
 }
예제 #10
0
        private NewlyCompletedGame CreateNewlyCompletedGame()
        {
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GamingGroupId = _expectedGamingGroupId
            };

            return(newlyCompletedGame);
        }
예제 #11
0
        public virtual ActionResult Create(NewlyCompletedGame newlyCompletedGame, ApplicationUser currentUser)
        {
            if (ModelState.IsValid)
            {
                playedGameCreator.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

                return(new RedirectResult(Url.Action(MVC.GamingGroup.ActionNames.Index, MVC.GamingGroup.Name)
                                          + "#" + GamingGroupController.SECTION_ANCHOR_RECENT_GAMES));
            }

            return(Create(currentUser));
        }
예제 #12
0
        public virtual ActionResult Edit(NewlyCompletedGame newlyCompletedGame, int previousGameId, ApplicationUser currentUser)
        {
            if (ModelState.IsValid)
            {
                this.playedGameDeleter.DeletePlayedGame(previousGameId, currentUser);
                this.playedGameCreator.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

                return(new RedirectResult(Url.Action(MVC.GamingGroup.ActionNames.Index, MVC.GamingGroup.Name)
                                          + "#" + GamingGroupController.SECTION_ANCHOR_RECENT_GAMES));
            }

            return(RedirectToAction(MVC.PlayedGame.Edit(previousGameId, currentUser)));
        }
예제 #13
0
        public void ItRecalculatesTheChampionForTheGame()
        {
            List <PlayerRank>  playerRanks        = new List <PlayerRank>();
            NewlyCompletedGame newlyCompletedGame = new NewlyCompletedGame()
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks      = playerRanks
            };

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, this.currentUser);

            autoMocker.Get <IChampionRecalculator>().AssertWasCalled(mock => mock.RecalculateChampion((int)newlyCompletedGame.GameDefinitionId, currentUser));
        }
예제 #14
0
        public void ItRecalculatesTheChampionForTheGameButDoesntClearTheExistingChampion()
        {
            var playerRanks        = new List <PlayerRank>();
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks      = playerRanks
            };

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

            autoMocker.Get <IChampionRecalculator>().AssertWasCalled(mock => mock.RecalculateChampion(newlyCompletedGame.GameDefinitionId, currentUser, false));
        }
        public void ItChecksSecurityOnTheGameDefinitionId()
        {
            var playerRanks        = new List <PlayerRank>();
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = _expectedGameDefinition.Id,
                PlayerRanks      = playerRanks
            };

            _autoMocker.ClassUnderTest.Execute(newlyCompletedGame, _currentUser, _dataContext);

            _autoMocker.Get <ISecuredEntityValidator>().AssertWasCalled(mock => mock.RetrieveAndValidateAccess <GameDefinition>(
                                                                            _expectedGameDefinition.Id,
                                                                            _currentUser));
        }
예제 #16
0
        public void ItChecksSecurityOnTheGameDefinitionId()
        {
            var playerRanks        = new List <PlayerRank>();
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks      = playerRanks
            };

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

            autoMocker.Get <ISecuredEntityValidator>().AssertWasCalled(mock => mock.RetrieveAndValidateAccess <GameDefinition>(
                                                                           gameDefinition.Id,
                                                                           currentUser));
        }
예제 #17
0
        public void ItMakesTheRequestForTheCurrentUser()
        {
            NewlyCompletedGame newlyCompletedGame = new NewlyCompletedGame()
            {
                GameDefinitionId = 1,
                PlayerRanks      = new List <PlayerRank>()
            };

            autoMocker.ClassUnderTest.Create(newlyCompletedGame, currentUser);

            autoMocker.Get <IPlayedGameCreator>().AssertWasCalled(logic => logic.CreatePlayedGame(
                                                                      Arg <NewlyCompletedGame> .Is.Anything,
                                                                      Arg <TransactionSource> .Is.Anything,
                                                                      Arg <ApplicationUser> .Is.Equal(this.currentUser)));
        }
예제 #18
0
        public void ItChecksSecurityOnTheGameDefinitionId()
        {
            List <PlayerRank>  playerRanks        = new List <PlayerRank>();
            NewlyCompletedGame newlyCompletedGame = new NewlyCompletedGame()
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks      = playerRanks
            };

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, this.currentUser);

            autoMocker.Get <ISecuredEntityValidator <GameDefinition> >().AssertWasCalled(mock => mock.ValidateAccess(
                                                                                             gameDefinition,
                                                                                             currentUser, typeof(GameDefinition),
                                                                                             gameDefinition.Id));
        }
예제 #19
0
        public void ItRecalculatesTheNemesisOfEveryPlayerInTheGame()
        {
            var playerOneId   = 1;
            var playerTwoId   = 2;
            var playerThreeId = 3;
            var playerRanks   = new List <PlayerRank>
            {
                new PlayerRank
                {
                    PlayerId = playerOneId,
                    GameRank = 1
                },
                new PlayerRank
                {
                    PlayerId = playerTwoId,
                    GameRank = 2
                },
                new PlayerRank
                {
                    PlayerId = playerThreeId,
                    GameRank = 3
                }
            };
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks      = playerRanks
            };

            autoMocker.Get <IPointsCalculator>()
            .Expect(mock => mock.CalculatePoints(null, null))
            .IgnoreArguments()
            .Return(new Dictionary <int, PointsScorecard>
            {
                { playerOneId, new PointsScorecard() },
                { playerTwoId, new PointsScorecard() },
                { playerThreeId, new PointsScorecard() }
            });

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

            foreach (var playerRank in playerRanks)
            {
                autoMocker.Get <INemesisRecalculator>().AssertWasCalled(mock => mock.RecalculateNemesis(playerRank.PlayerId, currentUser));
            }
        }
예제 #20
0
        public void ThatItSavesTheGame()
        {
            //--Arrange
            var editedGame = new NewlyCompletedGame();
            var viewModel  = new PlayedGameEditViewModel();

            Mapper.Map(viewModel, editedGame);

            //--Act
            autoMocker.ClassUnderTest.Edit(viewModel, 1234, currentUser);

            //--Assert
            autoMocker.Get <IPlayedGameCreator>().AssertWasCalled(mock => mock.CreatePlayedGame(
                                                                      Arg <NewlyCompletedGame> .Is.Anything,
                                                                      Arg <TransactionSource> .Is.Anything,
                                                                      Arg <ApplicationUser> .Is.Anything));
        }
        public void ItSetsTheGamingGroupIdToThatOfTheUser()
        {
            var newlyCompletedPlayedGame = new NewlyCompletedGame
            {
                GameDefinitionId = _expectedGameDefinition.Id,
                PlayerRanks      = new List <PlayerRank>()
            };

            _autoMocker.Get <IPlayedGameSaver>().Expect(logic => logic.MakePlayerGameResults(null, null, null))
            .IgnoreArguments()
            .Return(new List <PlayerGameResult>());

            _autoMocker.ClassUnderTest.Execute(newlyCompletedPlayedGame, _currentUser, _dataContext);

            _dataContext.AssertWasCalled(mock => mock.Save(
                                             Arg <PlayedGame> .Matches(game => game.GamingGroupId == _currentUser.CurrentGamingGroupId.Value),
                                             Arg <ApplicationUser> .Is.Same(_currentUser)));
        }
예제 #22
0
        public void ItSetsTheGamingGroupIdToThatOfTheUser()
        {
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks      = new List <PlayerRank>()
            };

            autoMocker.ClassUnderTest.Expect(logic => logic.MakePlayerGameResults(null, null))
            .IgnoreArguments()
            .Return(new List <PlayerGameResult>());

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

            autoMocker.Get <IDataContext>().AssertWasCalled(mock => mock.Save(
                                                                Arg <PlayedGame> .Matches(game => game.GamingGroupId == currentUser.CurrentGamingGroupId),
                                                                Arg <ApplicationUser> .Is.Same(currentUser)));
        }
        public void ItValidatesAccessToPlayers()
        {
            var playerRanks = new List <PlayerRank>();

            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = _expectedGameDefinition.Id,
                PlayerRanks      = playerRanks,
                GamingGroupId    = 42
            };

            _autoMocker.ClassUnderTest.Execute(newlyCompletedGame, _currentUser, _dataContext);

            _autoMocker.Get <IPlayedGameSaver>().AssertWasCalled(mock => mock.ValidateAccessToPlayers(
                                                                     newlyCompletedGame.PlayerRanks,
                                                                     newlyCompletedGame.GamingGroupId.Value,
                                                                     _currentUser,
                                                                     _dataContext));
        }
예제 #24
0
        public void ItSavesTheNewGame()
        {
            NewlyCompletedGame newlyCompletedGame = new NewlyCompletedGame()
            {
                GameDefinitionId = 1,
                PlayerRanks      = new List <PlayerRank>()
            };
            string baseUrl = "base url";

            autoMocker.ClassUnderTest.Url.Expect(mock => mock.Action(MVC.GamingGroup.ActionNames.Index, MVC.GamingGroup.Name))
            .Return(baseUrl);

            autoMocker.ClassUnderTest.Create(newlyCompletedGame, null);

            autoMocker.Get <IPlayedGameCreator>().AssertWasCalled(mock => mock.CreatePlayedGame(
                                                                      Arg <NewlyCompletedGame> .Is.Equal(newlyCompletedGame),
                                                                      Arg <TransactionSource> .Is.Anything,
                                                                      Arg <ApplicationUser> .Is.Anything));
        }
예제 #25
0
        public void ItSetsnemeStatsPointsForEachPlayerGameResult()
        {
            int playerOneId               = 1;
            int playerTwoId               = 2;
            int playerOneGameRank         = 1;
            int playerTwoGameRank         = 2;
            List <PlayerRank> playerRanks = new List <PlayerRank>()
            {
                new PlayerRank()
                {
                    PlayerId = playerOneId,
                    GameRank = playerOneGameRank
                },
                new PlayerRank()
                {
                    PlayerId = playerTwoId,
                    GameRank = playerTwoGameRank
                }
            };
            NewlyCompletedGame newlyCompletedGame = new NewlyCompletedGame()
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks      = playerRanks
            };

            var pointsDictionary = PointsCalculator.CalculatePoints(playerRanks);

            int             playerOneExpectednemeStatsPoints = pointsDictionary[playerOneId];
            ApplicationUser user = new ApplicationUser();

            PlayedGame playedGame = autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, this.currentUser);

            Assert.AreEqual(playerOneExpectednemeStatsPoints, playedGame.PlayerGameResults
                            .First(gameResult => gameResult.PlayerId == playerOneId)
                            .NemeStatsPointsAwarded);

            int playerTwoExpectednemeStatsPoints = pointsDictionary[playerTwoId];

            Assert.AreEqual(playerTwoExpectednemeStatsPoints, playedGame.PlayerGameResults
                            .First(gameResult => gameResult.PlayerId == playerTwoId)
                            .NemeStatsPointsAwarded);
        }
        private PlayedGame CreateTestPlayedGame(
            int gameDefinitionId,
            List <Player> players,
            List <int> correspondingPlayerRanks,
            ApplicationUser currentUser,
            CreatePlayedGameComponent createdPlayedGameComponent,
            IDataContext _dataContext,
            bool waitForAllPostSaveEventHandlingToFinish = false,
            DateTime?datePlayed = null)
        {
            List <PlayerRank> playerRanks = new List <PlayerRank>();

            for (int i = 0; i < players.Count(); i++)
            {
                playerRanks.Add(new PlayerRank
                {
                    PlayerId = players[i].Id,
                    GameRank = correspondingPlayerRanks[i]
                });
            }

            NewlyCompletedGame newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId  = gameDefinitionId,
                PlayerRanks       = playerRanks,
                TransactionSource = TransactionSource.WebApplication
            };

            if (datePlayed.HasValue)
            {
                newlyCompletedGame.DatePlayed = datePlayed.Value;
            }

            var playedGame = createdPlayedGameComponent.ExecuteTransaction(newlyCompletedGame, currentUser, _dataContext);

            if (waitForAllPostSaveEventHandlingToFinish)
            {
                createdPlayedGameComponent.PostSaveTask.Wait();
            }

            return(playedGame);
        }
        public void Validate(NewlyCompletedGame newlyCompletedGame)
        {
            foreach (var applicationLinkage in newlyCompletedGame.ApplicationLinkages)
            {
                if (string.IsNullOrEmpty(applicationLinkage.ApplicationName) || string.IsNullOrEmpty(applicationLinkage.EntityId))
                {
                    throw new InvalidSourceException(applicationLinkage.ApplicationName, applicationLinkage.EntityId);
                }

                var entityWithThisSynchKeyAlreadyExists = _dataContext.GetQueryable<PlayedGameApplicationLinkage>()
                    .Any(x => x.ApplicationName == applicationLinkage.ApplicationName
                        && x.EntityId == applicationLinkage.EntityId
                        && x.PlayedGame.GamingGroupId == newlyCompletedGame.GamingGroupId);

                if (entityWithThisSynchKeyAlreadyExists)
                {
                    throw new EntityAlreadySynchedException(applicationLinkage.ApplicationName, applicationLinkage.EntityId, newlyCompletedGame.GamingGroupId.Value);
                }
            }
        }
        public void Validate(NewlyCompletedGame newlyCompletedGame)
        {
            foreach (var applicationLinkage in newlyCompletedGame.ApplicationLinkages)
            {
                if (string.IsNullOrEmpty(applicationLinkage.ApplicationName) || string.IsNullOrEmpty(applicationLinkage.EntityId))
                {
                    throw new InvalidSourceException(applicationLinkage.ApplicationName, applicationLinkage.EntityId);
                }

                var entityWithThisSynchKeyAlreadyExists = _dataContext.GetQueryable <PlayedGameApplicationLinkage>()
                                                          .Any(x => x.ApplicationName == applicationLinkage.ApplicationName &&
                                                               x.EntityId == applicationLinkage.EntityId &&
                                                               x.PlayedGame.GamingGroupId == newlyCompletedGame.GamingGroupId);

                if (entityWithThisSynchKeyAlreadyExists)
                {
                    throw new EntityAlreadySynchedException(applicationLinkage.ApplicationName, applicationLinkage.EntityId, newlyCompletedGame.GamingGroupId.Value);
                }
            }
        }
예제 #29
0
        //TODO this should be in its own class
        internal virtual PlayedGame TransformNewlyCompletedGameIntoPlayedGame(
            NewlyCompletedGame newlyCompletedGame,
            int gamingGroupId,
            string applicationUserId,
            List <PlayerGameResult> playerGameResults)
        {
            int        numberOfPlayers = newlyCompletedGame.PlayerRanks.Count();
            PlayedGame playedGame      = new PlayedGame()
            {
                GameDefinitionId           = newlyCompletedGame.GameDefinitionId.Value,
                NumberOfPlayers            = numberOfPlayers,
                PlayerGameResults          = playerGameResults,
                DatePlayed                 = newlyCompletedGame.DatePlayed,
                GamingGroupId              = gamingGroupId,
                Notes                      = newlyCompletedGame.Notes,
                CreatedByApplicationUserId = applicationUserId
            };

            return(playedGame);
        }
예제 #30
0
        public void ItRecordsAGamePlayedEvent()
        {
            PlayerRank playerRank = new PlayerRank()
            {
                GameRank = 1,
                PlayerId = 1
            };
            NewlyCompletedGame newlyCompletedGame = new NewlyCompletedGame()
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks      = new List <PlayerRank>()
                {
                    playerRank
                }
            };
            TransactionSource transactionSource = TransactionSource.RestApi;

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, transactionSource, this.currentUser);

            autoMocker.Get <INemeStatsEventTracker>().AssertWasCalled(mock => mock.TrackPlayedGame(currentUser, transactionSource));
        }
        public void LocalSetUp()
        {
            _playedGameMessage = new PlayedGameMessage();

            _expectedNewlyCompletedGame = new NewlyCompletedGame();

            _autoMocker.Get <ITransformer>()
            .Expect(mock => mock.Transform <NewlyCompletedGame>(_playedGameMessage))
            .IgnoreArguments()
            .Return(_expectedNewlyCompletedGame);

            var expectedPlayedGame = new PlayedGame
            {
                Id            = EXPECTED_PLAYED_GAME_ID,
                GamingGroupId = EXPECTED_GAMING_GROUP_ID
            };

            _autoMocker.Get <ICreatePlayedGameComponent>().Expect(mock => mock.Execute(
                                                                      Arg <NewlyCompletedGame> .Is.Anything,
                                                                      Arg <ApplicationUser> .Is.Anything))
            .Return(expectedPlayedGame);
        }
예제 #32
0
        private PlayedGame CreateTestPlayedGame(
            int gameDefinitionId,
            List<Player> players,
            List<int> correspondingPlayerRanks,
            ApplicationUser currentUser,
            IPlayedGameSaver playedGameSaver)
        {
            List<PlayerRank> playerRanks = new List<PlayerRank>();

            for (int i = 0; i < players.Count(); i++)
            {
                playerRanks.Add(new PlayerRank
                {
                        PlayerId = players[i].Id,
                        GameRank = correspondingPlayerRanks[i]
                    });
            }

            NewlyCompletedGame newlyCompletedGame = new NewlyCompletedGame
            {
                    GameDefinitionId = gameDefinitionId,
                    PlayerRanks = playerRanks,
                };

            return playedGameSaver.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);
        }
예제 #33
0
        private NewlyCompletedGame CreateValidNewlyCompletedGame()
        {
            List<PlayerRank> playerRanks;

            var playerOneId = 3515;
            var playerTwoId = 15151;
            var playerOneRank = 1;
            var playerTwoRank = 2;
            var newlyCompletedGame = new NewlyCompletedGame
            { GameDefinitionId = gameDefinition.Id };
            playerRanks = new List<PlayerRank>();
            playerRanks.Add(new PlayerRank
            { PlayerId = playerOneId, GameRank = playerOneRank });
            playerRanks.Add(new PlayerRank
            { PlayerId = playerTwoId, GameRank = playerTwoRank });
            newlyCompletedGame.PlayerRanks = playerRanks;
            autoMocker.Get<IPointsCalculator>()
                .Expect(mock => mock.CalculatePoints(null, null))
                .IgnoreArguments()
                .Return(new Dictionary<int, PointsScorecard>
                {
                    {playerOneId, new PointsScorecard()},
                    {playerTwoId, new PointsScorecard()}
                });
            return newlyCompletedGame;
        }
예제 #34
0
 private NewlyCompletedGame CreateNewlyCompletedGame()
 {
     var newlyCompletedGame = new NewlyCompletedGame
     {
         GamingGroupId = _expectedGamingGroupId
     };
     return newlyCompletedGame;
 }
예제 #35
0
        public void ItSetsNemePointsForEachPlayerGameResult()
        {
            var playerOneId = 1;
            var playerTwoId = 2;
            var playerOneGameRank = 1;
            var playerTwoGameRank = 2;
            var playerRanks = new List<PlayerRank>
            {
                new PlayerRank
                {
                    PlayerId = playerOneId,
                    GameRank = playerOneGameRank
                },
                new PlayerRank
                {
                    PlayerId = playerTwoId,
                    GameRank = playerTwoGameRank
                }
            };
            gameDefinition.BoardGameGeekGameDefinitionId = 11;
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks = playerRanks
            };
            var expectedBoardGameGeekGameDefinition = new BoardGameGeekGameDefinition();
            autoMocker.Get<IDataContext>()
                      .Expect(mock => mock.FindById<BoardGameGeekGameDefinition>(gameDefinition.BoardGameGeekGameDefinitionId))
                      .Return(expectedBoardGameGeekGameDefinition);

            var playerOneScorecard = new PointsScorecard
            {
                BasePoints = 1,
                GameDurationBonusPoints = 2,
                GameWeightBonusPoints = 3
            };
            var playerTwoScorecard = new PointsScorecard
            {
                BasePoints = 4,
                GameDurationBonusPoints = 5,
                GameWeightBonusPoints = 6
            };
            var expectedPointsDictionary = new Dictionary<int, PointsScorecard>
            {
                {playerOneId, playerOneScorecard},
                {playerTwoId, playerTwoScorecard}
            };

            autoMocker.Get<IPointsCalculator>().Expect(mock => mock.CalculatePoints(playerRanks, expectedBoardGameGeekGameDefinition))
                .Return(expectedPointsDictionary);

            //--Act
            var playedGame = autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

            var playerOne = playedGame.PlayerGameResults.First(gameResult => gameResult.PlayerId == playerOneId);
            Assert.That(playerOne.GameDurationBonusPoints, Is.EqualTo(playerOneScorecard.GameDurationBonusPoints));
            Assert.That(playerOne.GameWeightBonusPoints, Is.EqualTo(playerOneScorecard.GameWeightBonusPoints));
            Assert.That(playerOne.NemeStatsPointsAwarded, Is.EqualTo(playerOneScorecard.BasePoints));

            var playerTwo = playedGame.PlayerGameResults.First(gameResult => gameResult.PlayerId == playerTwoId);
            Assert.That(playerTwo.GameDurationBonusPoints, Is.EqualTo(playerTwoScorecard.GameDurationBonusPoints));
            Assert.That(playerTwo.GameWeightBonusPoints, Is.EqualTo(playerTwoScorecard.GameWeightBonusPoints));
            Assert.That(playerTwo.NemeStatsPointsAwarded, Is.EqualTo(playerTwoScorecard.BasePoints));
        }
예제 #36
0
        public void ItSetsTheGamingGroupIdToThatOfTheUser()
        {
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks = new List<PlayerRank>()
            };

            autoMocker.ClassUnderTest.Expect(logic => logic.MakePlayerGameResults(null, null))
                .IgnoreArguments()
                .Return(new List<PlayerGameResult>());

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

            autoMocker.Get<IDataContext>().AssertWasCalled(mock => mock.Save(
                Arg<PlayedGame>.Matches(game => game.GamingGroupId == currentUser.CurrentGamingGroupId),
                Arg<ApplicationUser>.Is.Same(currentUser)));
        }
예제 #37
0
        public void ItRecordsAGamePlayedEvent()
        {
            var playerRank = new PlayerRank
            {
                GameRank = 1,
                PlayerId = 1
            };
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks = new List<PlayerRank>
                { playerRank }
            };
            var transactionSource = TransactionSource.RestApi;
            autoMocker.Get<IPointsCalculator>()
              .Expect(mock => mock.CalculatePoints(null, null))
              .IgnoreArguments()
              .Return(new Dictionary<int, PointsScorecard>
              {
                              {playerRank.PlayerId, new PointsScorecard()}
              });

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, transactionSource, currentUser);

            autoMocker.Get<INemeStatsEventTracker>().AssertWasCalled(mock => mock.TrackPlayedGame(currentUser, transactionSource));
        }
예제 #38
0
        public void ItRecalculatesTheNemesisOfEveryPlayerInTheGame()
        {
            var playerOneId = 1;
            var playerTwoId = 2;
            var playerThreeId = 3;
            var playerRanks = new List<PlayerRank>
            {
                new PlayerRank
                {
                    PlayerId = playerOneId,
                    GameRank = 1
                },
                new PlayerRank
                {
                    PlayerId = playerTwoId,
                    GameRank = 2
                },
                new PlayerRank
                {
                    PlayerId = playerThreeId,
                    GameRank = 3
                }
            };
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks = playerRanks
            };
            autoMocker.Get<IPointsCalculator>()
                      .Expect(mock => mock.CalculatePoints(null, null))
                      .IgnoreArguments()
                      .Return(new Dictionary<int, PointsScorecard>
                      {
                          {playerOneId, new PointsScorecard()},
                          {playerTwoId, new PointsScorecard()},
                          {playerThreeId, new PointsScorecard()}
                      });

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

            foreach (var playerRank in playerRanks)
            {
                autoMocker.Get<INemesisRecalculator>().AssertWasCalled(mock => mock.RecalculateNemesis(playerRank.PlayerId, currentUser));
            }
        }
예제 #39
0
        public void ItRecalculatesTheChampionForTheGameButDoesntClearTheExistingChampion()
        {
            var playerRanks = new List<PlayerRank>();
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks = playerRanks
            };

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

            autoMocker.Get<IChampionRecalculator>().AssertWasCalled(mock => mock.RecalculateChampion(newlyCompletedGame.GameDefinitionId, currentUser, false));
        }
예제 #40
0
        public void ItChecksSecurityOnThePlayerId()
        {
            var playerRanks = new List<PlayerRank>
            {
                new PlayerRank
                {
                    PlayerId = existingPlayerWithMatchingGamingGroup.Id
                }
            };
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks = playerRanks
            };

            autoMocker.Get<IDataContext>().Expect(mock => mock.FindById<Player>(existingPlayerWithMatchingGamingGroup.Id))
                .Return(existingPlayerWithMatchingGamingGroup);
            autoMocker.Get<IPointsCalculator>()
                .Expect(mock => mock.CalculatePoints(null, null))
                .IgnoreArguments()
                .Return(new Dictionary<int, PointsScorecard>
            {
                {existingPlayerWithMatchingGamingGroup.Id, new PointsScorecard()}
            });

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

            autoMocker.Get<ISecuredEntityValidator>().AssertWasCalled(mock => mock.ValidateAccess(
                existingPlayerWithMatchingGamingGroup,
                currentUser));
        }
예제 #41
0
        public void ItChecksSecurityOnTheGameDefinitionId()
        {
            var playerRanks = new List<PlayerRank>();
            var newlyCompletedGame = new NewlyCompletedGame
            {
                GameDefinitionId = gameDefinition.Id,
                PlayerRanks = playerRanks
            };

            autoMocker.ClassUnderTest.CreatePlayedGame(newlyCompletedGame, TransactionSource.WebApplication, currentUser);

            autoMocker.Get<ISecuredEntityValidator>().AssertWasCalled(mock => mock.RetrieveAndValidateAccess<GameDefinition>(
                gameDefinition.Id,
                currentUser));
        }