Example #1
0
        public PlayedGame UpdatePlayedGame(UpdatedGame updatedGame, TransactionSource transactionSource, ApplicationUser currentUser)
        {
            if (updatedGame.GamingGroupId.HasValue)
            {
                _securedEntityValidator.RetrieveAndValidateAccess <GamingGroup>(updatedGame.GamingGroupId.Value, currentUser);
            }
            _securedEntityValidator.RetrieveAndValidateAccess <PlayedGame>(updatedGame.PlayedGameId, currentUser);
            _securedEntityValidator.RetrieveAndValidateAccess <GameDefinition>(updatedGame.GameDefinitionId, currentUser);

            var playedGameWithStuff = _dataContext.GetQueryable <PlayedGame>()
                                      .Where(x => x.Id == updatedGame.PlayedGameId)
                                      .Include(x => x.ApplicationLinkages)
                                      .Include(x => x.GameDefinition)
                                      .Include(x => x.PlayerGameResults)
                                      .FirstOrDefault();

            if (playedGameWithStuff == null)
            {
                throw new EntityDoesNotExistException(typeof(PlayedGame), updatedGame.PlayedGameId);
            }

            var gamingGroupId = updatedGame.GamingGroupId ?? playedGameWithStuff.GamingGroupId;

            ValidateAccessToPlayers(updatedGame.PlayerRanks, gamingGroupId, currentUser, _dataContext);

            var playerGameResults = MakePlayerGameResults(updatedGame, playedGameWithStuff.GameDefinition?.BoardGameGeekGameDefinitionId, _dataContext);
            var updatedPlayedGame = TransformNewlyCompletedGameIntoPlayedGame(updatedGame, gamingGroupId, currentUser.Id, playerGameResults);

            updatedPlayedGame.Id          = updatedGame.PlayedGameId;
            updatedPlayedGame.DateUpdated = DateTime.UtcNow;

            CleanupPlayerResultsAndApplicationLinkages(currentUser, playedGameWithStuff);

            var returnPlayedGame = _dataContext.Save(updatedPlayedGame, currentUser);

            //--Entity Framework doesn't appear to save new child entities when updating the parent entity so we have to save them separately
            playerGameResults.ForEach(x =>
            {
                x.PlayedGameId = returnPlayedGame.Id;
                _dataContext.Save(x, currentUser);
            });

            CreateApplicationLinkages(updatedGame.ApplicationLinkages, updatedGame.PlayedGameId, _dataContext);

            var playerIds = playerGameResults.Select(x => x.PlayerId).ToList();

            _businessLogicEventSender.SendEvent(new PlayedGameCreatedEvent(
                                                    updatedGame.PlayedGameId,
                                                    updatedGame.GameDefinitionId,
                                                    playerIds,
                                                    transactionSource,
                                                    currentUser));

            return(returnPlayedGame);
        }
Example #2
0
        public void LocalSetUp()
        {
            _playedPlayedGameMessage = new UpdatedPlayedGameMessage();

            _expectedUpdatedGame = new UpdatedGame();

            _autoMocker.Get <ITransformer>()
            .Expect(mock => mock.Transform <UpdatedGame>(_playedPlayedGameMessage))
            .IgnoreArguments()
            .Return(_expectedUpdatedGame);
            _autoMocker.Get <IPlayedGameSaver>().Expect(mock => mock.UpdatePlayedGame(
                                                            Arg <UpdatedGame> .Is.Anything,
                                                            Arg <TransactionSource> .Is.Anything,
                                                            Arg <ApplicationUser> .Is.Anything));
        }
        public void It_Does_All_Of_The_Post_Save_Stuff()
        {
            //--arrange
            SetupExpectationsForExistingPlayedGame();

            var updatedGame = new UpdatedGame
            {
                PlayedGameId     = _existingPlayedGameId,
                GameDefinitionId = _existingGameDefinitionId
            };
            var transactionSource = TransactionSource.RestApi;

            //--act
            autoMocker.ClassUnderTest.UpdatePlayedGame(updatedGame, transactionSource, currentUser);

            //--assert
            var args = autoMocker.ClassUnderTest.GetArgumentsForCallsMadeOn(
                mock => mock.DoPostSaveStuff(
                    Arg <TransactionSource> .Is.Anything,
                    Arg <ApplicationUser> .Is.Anything,
                    Arg <int> .Is.Anything,
                    Arg <int> .Is.Anything,
                    Arg <List <PlayerGameResult> > .Is.Anything));

            args.ShouldNotBeNull();
            args.Count.ShouldBe(1);
            var firstCall = args[0];

            var actualTransactionSource = (TransactionSource)firstCall[0];

            actualTransactionSource.ShouldBe(transactionSource);

            var actualUser = firstCall[1] as ApplicationUser;

            actualUser.ShouldBeSameAs(currentUser);

            var actualPlayedGameId = (int)firstCall[2];

            actualPlayedGameId.ShouldBe(_existingPlayedGameId);

            var actualGameDefinitionId = (int)firstCall[3];

            actualGameDefinitionId.ShouldBe(_existingGameDefinitionId);

            var actualPlayerGameResults = firstCall[4] as List <PlayerGameResult>;

            actualPlayerGameResults.ShouldBeSameAs(_expectedNewPlayerGameResults);
        }
        public void It_Returns_The_Saved_Played_Game()
        {
            //--arrange
            SetupExpectationsForExistingPlayedGame();

            var updatedGame = new UpdatedGame
            {
                PlayedGameId     = _existingPlayedGameId,
                GameDefinitionId = _existingGameDefinitionId
            };

            //--act
            var result = AutoMocker.ClassUnderTest.UpdatePlayedGame(updatedGame, TransactionSource.RestApi, CurrentUser);

            //--assert
            result.ShouldBeSameAs(_expectedSavedPlayedGame);
        }
        public void It_Validates_Access_To_The_New_Game_Definition()
        {
            //--arrange
            SetupExpectationsForExistingPlayedGame();

            int differentGameDefinitionId = _existingGameDefinitionId + 1;

            var updatedGame = new UpdatedGame
            {
                PlayedGameId     = _existingPlayedGameId,
                GameDefinitionId = differentGameDefinitionId
            };

            //--act
            AutoMocker.ClassUnderTest.UpdatePlayedGame(updatedGame, TransactionSource.RestApi, CurrentUser);

            //--assert
            AutoMocker.Get <ISecuredEntityValidator>().AssertWasCalled(mock => mock.RetrieveAndValidateAccess <GameDefinition>(updatedGame.GameDefinitionId, CurrentUser));
        }
        public void It_Validates_Access_To_The_Players_In_The_Game()
        {
            //--arrange
            SetupExpectationsForExistingPlayedGame();

            int differentGameDefinitionId = _existingGameDefinitionId + 1;

            var updatedGame = new UpdatedGame
            {
                PlayedGameId     = _existingPlayedGameId,
                GameDefinitionId = differentGameDefinitionId
            };

            //--act
            autoMocker.ClassUnderTest.UpdatePlayedGame(updatedGame, TransactionSource.RestApi, currentUser);

            //--assert
            autoMocker.ClassUnderTest.AssertWasCalled(partialMock => partialMock.ValidateAccessToPlayers(updatedGame.PlayerRanks, _existingGamingGroupId, currentUser));
        }
        public void It_Clears_Out_Existing_Application_Linkages()
        {
            //--arrange
            SetupExpectationsForExistingPlayedGame();

            int differentGameDefinitionId = _existingGameDefinitionId + 1;

            var updatedGame = new UpdatedGame
            {
                PlayedGameId     = _existingPlayedGameId,
                GameDefinitionId = differentGameDefinitionId
            };

            //--act
            AutoMocker.ClassUnderTest.UpdatePlayedGame(updatedGame, TransactionSource.RestApi, CurrentUser);

            //--assert
            AutoMocker.Get <IDataContext>().AssertWasCalled(mock => mock.DeleteById <PlayedGameApplicationLinkage>(_existingPlayedGameApplicationLinkageId1, CurrentUser));
            AutoMocker.Get <IDataContext>().AssertWasCalled(mock => mock.DeleteById <PlayedGameApplicationLinkage>(_existingPlayedGameApplicationLinkageId2, CurrentUser));
        }
        public void It_Throws_An_EntityDoesNotExistException_If_The_Specified_Played_Game_Id_Does_Not_Match_An_Existing_Game()
        {
            //--arrange
            AutoMocker.Get <IDataContext>().Expect(mock => mock.GetQueryable <PlayedGame>()).Return(new List <PlayedGame>().AsQueryable());

            var playerRanks = new List <PlayerRank>();
            var updatedGame = new UpdatedGame
            {
                GameDefinitionId = GameDefinition.Id,
                PlayerRanks      = playerRanks,
                PlayedGameId     = -1
            };
            var expectedException = new EntityDoesNotExistException(typeof(PlayedGame), updatedGame.PlayedGameId);

            //--act
            var actualException = Assert.Throws <EntityDoesNotExistException>(
                () => AutoMocker.ClassUnderTest.UpdatePlayedGame(updatedGame, TransactionSource.RestApi, CurrentUser));

            //--assert
            actualException.Message.ShouldBe(expectedException.Message);
        }
        public void It_Creates_The_Played_Game_Application_Linkages()
        {
            //--arrange
            SetupExpectationsForExistingPlayedGame();

            var updatedGame = new UpdatedGame
            {
                PlayedGameId        = _existingPlayedGameId,
                GameDefinitionId    = _existingGameDefinitionId,
                ApplicationLinkages = new List <ApplicationLinkage>
                {
                    new ApplicationLinkage()
                }
            };
            var transactionSource = TransactionSource.RestApi;

            //--act
            AutoMocker.ClassUnderTest.UpdatePlayedGame(updatedGame, transactionSource, CurrentUser);

            //--assert
            AutoMocker.ClassUnderTest.AssertWasCalled(mock => mock.CreateApplicationLinkages(updatedGame.ApplicationLinkages, _existingPlayedGameId, AutoMocker.Get <IDataContext>()));
        }
        public void It_Does_All_Of_The_Post_Save_Stuff()
        {
            //--arrange
            SetupExpectationsForExistingPlayedGame();

            var updatedGame = new UpdatedGame
            {
                PlayedGameId     = _existingPlayedGameId,
                GameDefinitionId = _existingGameDefinitionId
            };
            var transactionSource = TransactionSource.RestApi;

            //--act
            AutoMocker.ClassUnderTest.UpdatePlayedGame(updatedGame, transactionSource, CurrentUser);

            //--assert
            var args = AutoMocker.Get <IBusinessLogicEventSender>().GetArgumentsForCallsMadeOn(
                mock => mock.SendEvent(
                    Arg <IBusinessLogicEvent> .Is.Anything));

            var businessLogicEvent = args.AssertFirstCallIsType <IBusinessLogicEvent>();

            businessLogicEvent.ShouldNotBeNull();
            businessLogicEvent.ShouldBeOfType <PlayedGameCreatedEvent>();
            var playedGameCreatedEvent = (PlayedGameCreatedEvent)businessLogicEvent;

            playedGameCreatedEvent.TransactionSource.ShouldBe(transactionSource);

            playedGameCreatedEvent.TriggerEntityId.ShouldBe(_existingPlayedGameId);

            playedGameCreatedEvent.GameDefinitionId.ShouldBe(_existingGameDefinitionId);

            var expectedListOfPlayerIds = _expectedNewPlayerGameResults.Select(x => x.PlayerId).ToList();

            playedGameCreatedEvent.ParticipatingPlayerIds.ShouldBe(expectedListOfPlayerIds);
        }
        public void It_Reconstructs_The_Played_Game_Then_Updates_It()
        {
            //--arrange
            SetupExpectationsForExistingPlayedGame();

            int differentGameDefinitionId = _existingGameDefinitionId + 1;

            var playerRank1 = new PlayerRank
            {
                PlayerId = 100,
                GameRank = 1
            };
            var playerRank2 = new PlayerRank
            {
                PlayerId = 101,
                GameRank = 1
            };
            var playerRank3 = new PlayerRank
            {
                PlayerId = 100,
                GameRank = 1
            };

            var updatedGame = new UpdatedGame
            {
                PlayedGameId     = _existingPlayedGameId,
                GameDefinitionId = differentGameDefinitionId,
                PlayerRanks      = new List <PlayerRank>
                {
                    playerRank1,
                    playerRank2,
                    playerRank3
                },
                DatePlayed = DateTime.UtcNow
            };

            //--act
            AutoMocker.ClassUnderTest.UpdatePlayedGame(updatedGame, TransactionSource.RestApi, CurrentUser);

            //--assert
            AutoMocker.ClassUnderTest.AssertWasCalled(
                partialMock =>
                partialMock.MakePlayerGameResults(updatedGame, _existingBoardGameGeekGameDefinitionId, AutoMocker.Get <IDataContext>()));

            AutoMocker.ClassUnderTest.AssertWasCalled(
                partialMock =>
                partialMock.TransformNewlyCompletedGameIntoPlayedGame(updatedGame, _existingGamingGroupId,
                                                                      CurrentUser.Id, _expectedNewPlayerGameResults));

            var arguments =
                AutoMocker.Get <IDataContext>()
                .GetArgumentsForCallsMadeOn(
                    x => x.Save(Arg <PlayedGame> .Is.Anything, Arg <ApplicationUser> .Is.Anything));

            arguments.ShouldNotBeNull();
            arguments.Count.ShouldBe(1);
            var actualPlayedGame = arguments[0][0] as PlayedGame;

            actualPlayedGame.ShouldNotBeNull();
            actualPlayedGame.DateUpdated.Date.ShouldBe(DateTime.UtcNow.Date);
            actualPlayedGame.Id.ShouldBe(updatedGame.PlayedGameId);
        }