public void GetPasswordResetTokensUsedNotNotified_SomeNotNotified_OnlyNotNotified()
        {
            var token2 = new UserPasswordResetToken() { Code = Guid.NewGuid(), UserId = 2 };
            m_tokenRepository.Add(token2);

            var token3 = new UserPasswordResetToken() { Code = Guid.NewGuid(), UserId = 3 };
            m_tokenRepository.Add(token3);

            m_unitOfWork.Commit();

            var actual = m_target.GetPasswordResetTokensUsedNotNotified().ToList();
            Assert.AreEqual(0, actual.Count);

            token2.Used = true;
            actual = m_target.GetPasswordResetTokensUsedNotNotified().ToList();
            Assert.AreEqual(1, actual.Count);

            token3.Used = true;
            actual = m_target.GetPasswordResetTokensUsedNotNotified().ToList();
            Assert.AreEqual(2, actual.Count);

            m_target.MarkPasswordResetTokenAsNotifiedUse(token3.Id);
            actual = m_target.GetPasswordResetTokensUsedNotNotified().ToList();
            Assert.AreEqual(1, actual.Count);
        }
        public void InitializeTest()
        {
            UserPasswordService.PasswordResetTokenMinutesTimeout = 10;
            m_unitOfWork = new MemoryUnitOfWork();
            m_userService = MockRepository.GenerateMock<IUserService>();
            var tokenId = 0;
            m_tokenRepository = new MemoryRepository<UserPasswordResetToken>(m_unitOfWork, (o) => ++tokenId);
            var token = new UserPasswordResetToken() { Code = Guid.NewGuid(), UserId = 3 };
            m_tokenRepository.Add(token);

            var historyId = 0;
            m_historyRepository = new MemoryRepository<UserPasswordHistory>(m_unitOfWork, (o) => ++historyId);

            m_target = new UserPasswordService(m_tokenRepository, m_historyRepository, m_userService);

            m_userService.Expect(e => e.GetById(1)).Return(new User() { Id = 1, Password = m_target.Encrypt("11"), Email = "*****@*****.**" });
            m_userService.Expect(e => e.GetById(2)).Return(new User() { Id = 2, Password = m_target.Encrypt("22"), Email = "*****@*****.**" });
            m_userService.Expect(e => e.GetById(3)).Return(new User() { Id = 3, Password = m_target.Encrypt("33"), Email = "*****@*****.**" });

            m_userService.Expect(e => e.GetByEmail("*****@*****.**")).Return(new User() { Id = 1, Password = m_target.Encrypt("11"), Email = "*****@*****.**" });
            m_userService.Expect(e => e.GetByEmail("*****@*****.**")).Return(new User() { Id = 2, Password = m_target.Encrypt("22"), Email = "*****@*****.**" });
            m_userService.Expect(e => e.GetByEmail("*****@*****.**")).Return(new User() { Id = 3, Password = m_target.Encrypt("33"), Email = "*****@*****.**" });

            m_unitOfWork.Commit();
        }
        /// <summary>
        /// Realiza a geração de um token para redefinição de senha do usuário com o e-mail informado.
        /// </summary>
        /// <param name="email">O e-mail do usuário.</param>
        /// <returns>O token gerado.</returns>
        public UserPasswordResetToken GeneratePasswordResetToken(string email)
        {
            ExceptionHelper.ThrowIfNull("email", email);

            var user = m_userService.GetByEmail(email);

            if (user == null)
            {
                throw new ArgumentException(Texts.ThereIsNoUserWithThisEmail);
            }

            var oldToken = m_tokenRepository.FindFirst(t => t.UserId.Equals(user.Id));

            if (oldToken != null)
            {
                m_tokenRepository.Remove(oldToken);
            }

            var newToken = new UserPasswordResetToken()
            {
                UserId = user.Id,
                Code = Guid.NewGuid()
            };

            m_tokenRepository.Add(newToken);

            return newToken;
        }