public void ItSetsTheNewNemesisIfItChanged()
        {
            NemesisData nemesisData = new NemesisData() { NemesisPlayerId = -1 };
            _playerRepositoryMock.Expect(mock => mock.GetNemesisData(_playerId))
                            .Return(nemesisData);

            _dataContextMock.Expect(mock => mock.GetQueryable<Nemesis>())
                .Return(new List<Nemesis>().AsQueryable());

            _nemesisRecalculator.RecalculateNemesis(_playerId, _currentUser);

            _dataContextMock.AssertWasCalled(mock => mock.Save<Nemesis>(
                Arg<Nemesis>.Matches(savedNemesis => savedNemesis.MinionPlayerId == _playerId
                                        && savedNemesis.NemesisPlayerId == nemesisData.NemesisPlayerId
                                        && savedNemesis.NumberOfGamesLost == nemesisData.NumberOfGamesLost
                                        && savedNemesis.LossPercentage == nemesisData.LossPercentage),
                Arg<ApplicationUser>.Is.Same(_currentUser)));
            _dataContextMock.AssertWasCalled(mock => mock.Save<Player>(
                Arg<Player>.Matches(player => player.NemesisId == _newNemesisId), Arg<ApplicationUser>.Is.Same(_currentUser)));
        }
        public void ItReturnsTheNewNemesisIfItWasChanged()
        {
            //change the nemesis
            NemesisData nemesisData = new NemesisData() { NemesisPlayerId = 19383 };
            _playerRepositoryMock.Expect(mock => mock.GetNemesisData(_playerId))
                            .Return(nemesisData);

            List<Nemesis> nemesisList = new List<Nemesis>();
            Nemesis existingNemesis = new Nemesis()
            {
                Id = _existingNemesisId,
                MinionPlayerId = _playerId

            };
            nemesisList.Add(existingNemesis);
            _dataContextMock.Expect(mock => mock.GetQueryable<Nemesis>())
                .Return(nemesisList.AsQueryable());

            Nemesis actualNemesis = _nemesisRecalculator.RecalculateNemesis(_playerId, _currentUser);

            Assert.AreSame(_savedNemesis, actualNemesis);
        }
        public void ItReturnsTheUpdatedNemesisIfItWasUpdated()
        {
            int expectedLossPercentage = 15;
            NemesisData nemesisData = new NemesisData() { LossPercentage = expectedLossPercentage };
            _playerRepositoryMock.Expect(mock => mock.GetNemesisData(_playerId))
                            .Return(nemesisData);

            List<Nemesis> nemesisList = new List<Nemesis>();
            Nemesis existingNemesis = new Nemesis()
            {
                Id = _existingNemesisId,
                MinionPlayerId = _playerId
                
            };
            nemesisList.Add(existingNemesis);
            _dataContextMock.Expect(mock => mock.GetQueryable<Nemesis>())
                .Return(nemesisList.AsQueryable());

            Nemesis actualNemesis = _nemesisRecalculator.RecalculateNemesis(_playerId, _currentUser);

            Assert.AreSame(_savedNemesis, actualNemesis);
        }
        public void ItUpdatesTheExistingNemesisIfOnlyTheDataHasChanged()
        {
            int nemesisPlayerId = 1;
            int gamesLost = 1;
            int lossPercentage = 1;
            NemesisData nemesisData = new NemesisData()
            {
                NemesisPlayerId = nemesisPlayerId,
                NumberOfGamesLost = gamesLost,
                LossPercentage = lossPercentage
            };
            _playerRepositoryMock.Expect(mock => mock.GetNemesisData(_playerId))
                            .Return(nemesisData);

            List<Nemesis> nemesisList = new List<Nemesis>();
            Nemesis existingNemesis = new Nemesis()
            {
                Id = _existingNemesisId,
                NemesisPlayerId = nemesisPlayerId,
                MinionPlayerId = _playerId,
                //add 1 so the data is different
                NumberOfGamesLost = gamesLost + 1,
                LossPercentage = lossPercentage
            };
            nemesisList.Add(existingNemesis);
            _dataContextMock.Expect(mock => mock.GetQueryable<Nemesis>())
                .Return(nemesisList.AsQueryable());

            _nemesisRecalculator.RecalculateNemesis(_playerId, _currentUser);

            _dataContextMock.AssertWasCalled(mock => mock.Save<Nemesis>(
                Arg<Nemesis>.Matches(nem => nem.Id == _existingNemesisId
                                        && nem.MinionPlayerId == _playerId
                                        && nem.NemesisPlayerId == nemesisPlayerId
                                        && nem.NumberOfGamesLost == nemesisData.NumberOfGamesLost
                                        && nem.LossPercentage == nemesisData.LossPercentage),
                Arg<ApplicationUser>.Is.Anything));
        }
        public void ItDoesntBotherSavingTheNemesisIfNothingHasChanged()
        {
            int nemesisPlayerId = 1;
            int gamesLost = 1;
            int lossPercentage = 1;
            NemesisData nemesisData = new NemesisData() 
            { 
                NemesisPlayerId = nemesisPlayerId,
                NumberOfGamesLost = gamesLost,
                LossPercentage = lossPercentage
            };
            _playerRepositoryMock.Expect(mock => mock.GetNemesisData(_playerId))
                            .Return(nemesisData);

            List<Nemesis> nemesisList = new List<Nemesis>();
            nemesisList.Add(new Nemesis() 
                                { 
                                    Id = _existingNemesisId,
                                    NemesisPlayerId = nemesisPlayerId,
                                    MinionPlayerId = _playerId,
                                    NumberOfGamesLost = gamesLost,
                                    LossPercentage = lossPercentage
                                });
            _dataContextMock.Expect(mock => mock.GetQueryable<Nemesis>())
                .Return(nemesisList.AsQueryable());

            _nemesisRecalculator.RecalculateNemesis(_playerId, _currentUser);

            _dataContextMock.AssertWasNotCalled(mock => mock.Save<Nemesis>(
                Arg<Nemesis>.Is.Anything,
                Arg<ApplicationUser>.Is.Anything));
        }
        public void ItSetsThePreviousNemesisIfTheCurrentOneChanges()
        {
            NemesisData nemesisData = new NemesisData() { NemesisPlayerId = -1 };
            _playerRepositoryMock.Expect(mock => mock.GetNemesisData(_playerId))
                            .Return(nemesisData);

            _dataContextMock.Expect(mock => mock.GetQueryable<Nemesis>())
                .Return(new List<Nemesis>().AsQueryable());

            _nemesisRecalculator.RecalculateNemesis(_playerId, _currentUser);

            _dataContextMock.AssertWasCalled(mock => mock.Save<Player>(
                Arg<Player>.Matches(player => player.PreviousNemesisId == _existingNemesisId), Arg<ApplicationUser>.Is.Same(_currentUser)));
        }