예제 #1
0
        // TODO: Check for user in domain || Not necessary if we checking email??
        public DataAccess.Models.User Invoke(Models.UserModel user)
        {
            if (!user.IsValid() || userRepository.FindBy(x => x.Email == user.Email).Count() > 0)
            {
                return(null);
            }

            var newUser = AutoMapper.Mapper.Map <DataAccess.Models.User>(user);

            newUser.PasswordSalt = hasher.GenerateRandomSalt();
            newUser.PasswordHash = hasher.CreatePasswordHash(user.Password, newUser.PasswordSalt);

            userRepository.Add(newUser);

            var newUserToken = new DataAccess.Models.UserToken
            {
                User        = newUser,
                SecretToken = hasher.GenerateRandomGuid()
            };

            userTokenRepository.Add(newUserToken);
            _unitOfWork.Save();

            return(newUser);
        }
예제 #2
0
        public void Invoke_ValidData_DeleteAndSaveAreCalled()
        {
            var guid            = new Guid();
            var userTokenFromDb = new DataAccess.Models.UserToken
            {
                Id = guid
            };

            var findByResult = new List <DataAccess.Models.UserToken> {
                userTokenFromDb
            };

            var mockedUserTokenRepository = new Mock <IUserTokenRepository>();

            mockedUserTokenRepository.Setup(r => r.FindBy(It.IsAny <Expression <Func <DataAccess.Models.UserToken, bool> > >()))
            .Returns(findByResult.AsQueryable());
            var mockedUnitOfWork = new Mock <IUnitOfWork>();

            var action = new DeleteUserTokenByTokenString(mockedUserTokenRepository.Object, mockedUnitOfWork.Object);

            // action
            var actionResult = action.Invoke("123");

            // assert
            Assert.True(actionResult);
            mockedUserTokenRepository.Verify(r => r.Delete(It.IsAny <DataAccess.Models.UserToken>()), Times.Once());
            mockedUnitOfWork.Verify(r => r.Save(), Times.Once());
        }
예제 #3
0
        public void Invoke_ValidData_AddsUserToDatabaseWithCorrectValues()
        {
            var user = new DataAccess.Models.User
            {
                Name = "Ryszard"
            };

            DataAccess.Models.UserToken tokensaved = null;

            var mockedUserTokenRepository = new Mock <IUserTokenRepository>();
            var mockedUserRepository      = new Mock <IUserRepository>();
            var mockedHasher = new Mock <IHasher>();

            mockedUserRepository.Setup(r => r.GetById(It.IsAny <Guid>())).Returns(user);

            mockedHasher.Setup(r => r.GenerateRandomGuid()).Returns("123");

            mockedUserTokenRepository.Setup(r => r.Add(It.IsAny <DataAccess.Models.UserToken>()))
            .Callback <DataAccess.Models.UserToken>(u => tokensaved = u);
            var mockedUnitOfWork = new Mock <IUnitOfWork>();

            var action = new AddUserTokenToUser(mockedUserTokenRepository.Object, mockedUserRepository.Object, mockedUnitOfWork.Object, mockedHasher.Object);

            action.Invoke(Guid.NewGuid());

            Assert.Equal("Ryszard", tokensaved.User.Name);
            Assert.Equal("123", tokensaved.SecretToken);

            mockedUserTokenRepository.Verify(r => r.Delete(It.IsAny <DataAccess.Models.UserToken>()), Times.Never);
            mockedUserTokenRepository.Verify(r => r.Add(It.IsAny <DataAccess.Models.UserToken>()), Times.Once());
            mockedUnitOfWork.Verify(r => r.Save(), Times.Once());
        }
예제 #4
0
        public string Invoke(Guid userId)
        {
            if (userId == Guid.Empty)
            {
                return(string.Empty);
            }

            var user = userRepository.GetById(userId);

            if (user == null)
            {
                return(string.Empty);
            }

            var token = userTokenRepository.GetById(userId);

            if (token != null)
            {
                userTokenRepository.Delete(token);
            }

            var userToken = new DataAccess.Models.UserToken
            {
                User        = user,
                SecretToken = hasher.GenerateRandomGuid()
            };

            userTokenRepository.Add(userToken);
            _unitOfWork.Save();

            return(userToken.SecretToken);
        }
예제 #5
0
        public void Invoke_ValidData_SavedAndEditAreCalled()
        {
            // prepare
            var guid       = new Guid();
            var userFromDb = new DataAccess.Models.User
            {
                Id           = guid,
                Name         = "Name",
                PasswordHash = "hash",
                PasswordSalt = "salt"
            };

            var userToken = new DataAccess.Models.UserToken
            {
                SecretToken = "123"
            };

            var findByResult = new List <DataAccess.Models.UserToken> {
                userToken
            };

            DataAccess.Models.User userSaved = null;
            var mockedUserRepository         = new Mock <IUserRepository>();

            mockedUserRepository.Setup(r => r.GetById(It.IsAny <Guid>())).Returns(userFromDb);
            mockedUserRepository.Setup(r => r.Edit(It.IsAny <DataAccess.Models.User>()))
            .Callback <DataAccess.Models.User>(u => userSaved = u);

            var mockedUserTokenRepo = new Mock <IUserTokenRepository>();

            mockedUserTokenRepo.Setup(r => r.FindBy(It.IsAny <Expression <Func <DataAccess.Models.UserToken, bool> > >()))
            .Returns(findByResult.AsQueryable);

            var mockedHasher = new Mock <IHasher>();

            mockedHasher.Setup(h => h.GenerateRandomSalt()).Returns("salt-generated");
            mockedHasher.Setup(h => h.CreatePasswordHash("plain", "salt-generated")).Returns("plain-hashed");
            var mockedUnitOfWork = new Mock <IUnitOfWork>();

            var action = new EditUserPassword(mockedUserTokenRepo.Object, mockedUserRepository.Object, mockedUnitOfWork.Object, mockedHasher.Object);

            // action
            var actionResult = action.Invoke(Guid.NewGuid(), "plain");

            // assert
            Assert.True(actionResult);
            Assert.Equal("plain-hashed", userSaved.PasswordHash);
            Assert.Equal("salt-generated", userSaved.PasswordSalt);
            Assert.Equal("Name", userSaved.Name);
            Assert.Equal("123", userToken.SecretToken);

            mockedHasher.Verify(r => r.GenerateRandomSalt(), Times.Once);
            mockedHasher.Verify(r => r.CreatePasswordHash(It.IsAny <string>(), It.IsAny <string>()), Times.Once);

            mockedUserRepository.Verify(r => r.Edit(It.IsAny <DataAccess.Models.User>()), Times.Once());

            mockedUserTokenRepo.Verify(r => r.Delete(It.IsAny <DataAccess.Models.UserToken>()), Times.Once());
            mockedUnitOfWork.Verify(r => r.Save(), Times.Once());
        }
        public void Verify_ForDoubledAction_UpdatesEmailConfirmedOnOnce()
        {
            // prepare
            var guid       = new Guid();
            var userFromDb = new DataAccess.Models.User
            {
                Id = guid,
                EmailConfirmedOn = null
            };

            var userTokenFromDb = new DataAccess.Models.UserToken
            {
                User                 = userFromDb,
                SecretToken          = "123",
                SecretTokenTimeStamp = DateTime.UtcNow.AddDays(1)
            };

            DataAccess.Models.User userSaved = null;

            var getAllResults = new List <DataAccess.Models.UserToken> {
                userTokenFromDb
            };

            var mockedUserTokenRepository = new Mock <IUserTokenRepository>();

            mockedUserTokenRepository.SetupSequence(r => r.FindBy(It.IsAny <Expression <Func <DataAccess.Models.UserToken, bool> > >()))
            .Returns(getAllResults.AsQueryable())
            .Returns(new List <DataAccess.Models.UserToken>().AsQueryable());

            var mockedUserRepo = new Mock <IUserRepository>();

            mockedUserRepo.Setup(r => r.Edit(It.IsAny <DataAccess.Models.User>()))
            .Callback <DataAccess.Models.User>(u => userSaved = u);
            var mockedUnitOfWork = new Mock <IUnitOfWork>();

            var action = new ConfirmUserEmailByToken(mockedUserTokenRepository.Object, mockedUserRepo.Object, mockedUnitOfWork.Object);

            // action
            action.Invoke("1");
            action.Invoke("1");

            // assert
            Assert.NotNull(userSaved.EmailConfirmedOn);
            mockedUserRepo.Verify(r => r.Edit(It.IsAny <DataAccess.Models.User>()), Times.Once());
            mockedUserTokenRepository.Verify(r => r.Delete(It.IsAny <DataAccess.Models.UserToken>()), Times.Once());
            mockedUnitOfWork.Verify(r => r.Save(), Times.Once());
        }
예제 #7
0
        public void Invoke_ValidData_ReturnsCorrectModel()
        {
            var guid       = new Guid();
            var userFromDb = new DataAccess.Models.User
            {
                Id               = guid,
                Name             = "Name",
                Email            = "*****@*****.**",
                EmailConfirmedOn = DateTime.MinValue,
                LockedOn         = null,
                CreatedOn        = DateTime.MinValue,
                ModifiedOn       = DateTime.MinValue,
                DeletedOn        = null
            };

            var userTokenFromDb = new DataAccess.Models.UserToken
            {
                Id          = new Guid(),
                User        = userFromDb,
                SecretToken = "123"
            };

            var findByResult = new List <DataAccess.Models.UserToken> {
                userTokenFromDb
            };

            // prepare
            var mockedUserTokenRepository = new Mock <IUserTokenRepository>();

            mockedUserTokenRepository.Setup(r => r.FindBy(It.IsAny <Expression <Func <DataAccess.Models.UserToken, bool> > >()))
            .Returns(findByResult.AsQueryable);
            var action = new GetUserByToken(mockedUserTokenRepository.Object);

            // action
            var user = action.Invoke("123");

            // check
            Assert.Equal(guid, user.Id);
            Assert.Equal("Name", user.Name);
            Assert.Equal("*****@*****.**", user.Email);
            Assert.Equal(DateTime.MinValue, user.EmailConfirmedOn);
            Assert.Null(user.LockedOn);
            Assert.Equal(DateTime.MinValue, user.CreatedOn);
            Assert.Equal(DateTime.MinValue, user.ModifiedOn);
            Assert.Null(user.DeletedOn);
            mockedUserTokenRepository.Verify(r => r.FindBy(It.IsAny <Expression <Func <DataAccess.Models.UserToken, bool> > >()), Times.Once);
        }
예제 #8
0
        public void Invoke_ValidData_NoUser()
        {
            // prepare
            var userToken = new DataAccess.Models.UserToken
            {
                SecretToken = "123"
            };

            var findByResult = new List <DataAccess.Models.UserToken> {
                userToken
            };

            DataAccess.Models.User userSaved = null;
            var mockedUserRepository         = new Mock <IUserRepository>();

            var mockedUserTokenRepo = new Mock <IUserTokenRepository>();

            mockedUserTokenRepo.Setup(r => r.FindBy(It.IsAny <Expression <Func <DataAccess.Models.UserToken, bool> > >()))
            .Returns(findByResult.AsQueryable);

            var mockedHasher = new Mock <IHasher>();

            mockedHasher.Setup(h => h.GenerateRandomSalt()).Returns("salt-generated");
            mockedHasher.Setup(h => h.CreatePasswordHash("plain", "salt-generated")).Returns("plain-hashed");
            var mockedUnitOfWork = new Mock <IUnitOfWork>();

            var action = new EditUserPassword(mockedUserTokenRepo.Object, mockedUserRepository.Object, mockedUnitOfWork.Object, mockedHasher.Object);

            // action
            var actionResult = action.Invoke(Guid.NewGuid(), "plain");

            // assert
            Assert.False(actionResult);
            Assert.Null(userSaved);

            mockedHasher.Verify(r => r.GenerateRandomSalt(), Times.Never);
            mockedHasher.Verify(r => r.CreatePasswordHash(It.IsAny <string>(), It.IsAny <string>()), Times.Never);

            mockedUserRepository.Verify(r => r.Edit(It.IsAny <DataAccess.Models.User>()), Times.Never);
            mockedUnitOfWork.Verify(r => r.Save(), Times.Never);

            mockedUserTokenRepo.Verify(r => r.Delete(It.IsAny <DataAccess.Models.UserToken>()), Times.Never);
            mockedUnitOfWork.Verify(r => r.Save(), Times.Never);
        }
예제 #9
0
        public void Invoke_ValidData_AddsUserToDatabaseWithCorrectValues()
        {
            // prepare
            var userData = new UserModel
            {
                Email    = "email",
                Password = "******",
                Name     = "Ryszard"
            };

            DataAccess.Models.User      userSaved      = null;
            DataAccess.Models.UserToken userTokenSaved = null;

            var mockedUserTokenRepository = new Mock <IUserTokenRepository>();

            mockedUserTokenRepository.Setup(r => r.Add(It.IsAny <DataAccess.Models.UserToken>()))
            .Callback <DataAccess.Models.UserToken>(u => userTokenSaved = u);

            var mockedUserRepo = new Mock <IUserRepository>();

            mockedUserRepo.Setup(r => r.Add(It.IsAny <DataAccess.Models.User>()))
            .Callback <DataAccess.Models.User>(u => userSaved = u);

            var mockedHasher = new Mock <IHasher>();

            mockedHasher.Setup(h => h.GenerateRandomSalt()).Returns("salt-generated");
            mockedHasher.Setup(h => h.CreatePasswordHash("plain", "salt-generated")).Returns("plain-hashed");
            var mockedUnitOfWork = new Mock <IUnitOfWork>();

            var action = new AddNewUser(mockedUserRepo.Object, mockedUserTokenRepository.Object, mockedUnitOfWork.Object, mockedHasher.Object);

            // action
            action.Invoke(userData);

            // assert
            Assert.Equal("plain-hashed", userSaved.PasswordHash);
            Assert.Equal("salt-generated", userSaved.PasswordSalt);
            Assert.Equal("Ryszard", userSaved.Name);
            mockedUserRepo.Verify(r => r.Add(It.IsAny <DataAccess.Models.User>()), Times.Once());
            mockedUserTokenRepository.Verify(r => r.Add(It.IsAny <DataAccess.Models.UserToken>()), Times.Once());
            mockedUnitOfWork.Verify(r => r.Save(), Times.Exactly(1));
            Assert.NotNull(userTokenSaved);
        }
예제 #10
0
        public void Invoke_ValidData_ReturnsCorrectModel()
        {
            var guid            = Guid.NewGuid();
            var userTokenFromDb = new DataAccess.Models.UserToken
            {
                Id                   = guid,
                SecretToken          = "123",
                SecretTokenTimeStamp = DateTime.MaxValue,
                CreatedOn            = DateTime.MinValue,
                ModifiedOn           = DateTime.MinValue,
                DeletedOn            = null,
                User                 = new DataAccess.Models.User {
                    Name = "bob"
                }
            };

            var findByResult = new List <DataAccess.Models.UserToken> {
                userTokenFromDb
            };

            // prepare
            var userTokenRepository = new Mock <IUserTokenRepository>();

            userTokenRepository.Setup(r => r.FindBy(It.IsAny <Expression <Func <DataAccess.Models.UserToken, bool> > >()))
            .Returns(findByResult.AsQueryable());
            var action = new GetUserTokenByUserId(userTokenRepository.Object);

            // action
            var userToken = action.Invoke(guid);

            // check
            Assert.Equal(guid, userToken.Id);
            Assert.Equal("bob", userToken.User.Name);
            Assert.Equal("123", userToken.SecretToken);
            Assert.Equal(DateTime.MaxValue, userToken.SecretTokenTimeStamp);
            Assert.Equal(DateTime.MinValue, userToken.CreatedOn);
            Assert.Equal(DateTime.MinValue, userToken.ModifiedOn);
            Assert.Null(userToken.DeletedOn);
        }
        public void Verify_EmailAlreadyConfirmed_SaveNorEditCalled()
        {
            // prepare
            DateTime dateNow    = DateTime.UtcNow;
            var      guid       = new Guid();
            var      userFromDb = new DataAccess.Models.User
            {
                Id = guid,
                EmailConfirmedOn = dateNow
            };

            var userTokenFromDb = new DataAccess.Models.UserToken
            {
                User        = userFromDb,
                SecretToken = "123"
            };

            var getAllResults = new List <DataAccess.Models.UserToken> {
                userTokenFromDb
            };

            var mockedUserTokenRepository = new Mock <IUserTokenRepository>();

            mockedUserTokenRepository.Setup(r => r.FindBy(It.IsAny <Expression <Func <DataAccess.Models.UserToken, bool> > >()))
            .Returns(getAllResults.AsQueryable());
            var mockedUserRepo   = new Mock <IUserRepository>();
            var mockedUnitOfWork = new Mock <IUnitOfWork>();

            var action = new ConfirmUserEmailByToken(mockedUserTokenRepository.Object, mockedUserRepo.Object, mockedUnitOfWork.Object);

            // action
            action.Invoke("123");

            // assert
            Assert.Equal(userFromDb.EmailConfirmedOn, dateNow);
            mockedUserRepo.Verify(r => r.Edit(It.IsAny <DataAccess.Models.User>()), Times.Never);
            mockedUnitOfWork.Verify(r => r.Save(), Times.Never);
        }
예제 #12
0
            public void Invoke_ValidData_DeleteAndSaveAreCalled()
            {
                // prepare
                var guid            = Guid.NewGuid();
                var userTokenFromDb = new DataAccess.Models.UserToken
                {
                    Id = guid
                };

                var mockedUserTokenRepository = new Mock <IUserTokenRepository>();

                mockedUserTokenRepository.Setup(r => r.GetById(guid)).Returns(userTokenFromDb);
                var mockedUnitOfWork = new Mock <IUnitOfWork>();

                var action = new DeleteUserTokenById(mockedUserTokenRepository.Object, mockedUnitOfWork.Object);

                // action
                var actionResult = action.Invoke(guid);

                // assert
                Assert.True(actionResult);
                mockedUserTokenRepository.Verify(r => r.Delete(It.IsAny <DataAccess.Models.UserToken>()), Times.Once());
                mockedUnitOfWork.Verify(r => r.Save(), Times.Once());
            }