public void ForgotPassword_InvalidUserName_DoesntSendEmail_But_RedirectsTo_PasswordResetRequestedView()
        {
            // Arrange
            const string nonExistingUser = "******";

            _webSecurity.Setup(x => x.GetUserId(nonExistingUser)).Returns(-1);

            // Act
            var model = new ForgotPasswordViewModel
            {
                UserNameOrEmail = nonExistingUser
            };
            Mother.ControllerHelpers.SetupControllerModelState(model, _controllerUnderTest);
            var response = _controllerUnderTest.ForgotPassword(model);

            // Assert
            var result = response as RedirectToRouteResult;
            Assert.AreEqual("PasswordResetRequested", result.RouteValues["action"]);

            _messageService.Verify(x => x.SendMessage(It.IsAny<Message>(), It.IsAny<Person>(), It.IsAny<string>()), Times.Never);
        }
        public ActionResult ForgotPassword(ForgotPasswordViewModel model)
        {
            if (ModelState.IsValid)
            {
                // First assume the username was typed in.
                var userName = model.UserNameOrEmail;
                var userId = _webSecurity.GetUserId(model.UserNameOrEmail);
                if (userId == -1)
                {
                    // If the user was not found by name, assume his email was typed in.
                    var user = _volunteerSvc.FindUserByEmail(model.UserNameOrEmail);
                    if (user != null)
                    {
                        userName = user.UserName;
                        userId = user.Id;
                    }
                }

                // Only send email when user actually exists. For security reasons
                // don't show an error when the given user doesn't exist.
                if (userId != -1)
                {
                    var volunteer = _volunteerSvc.FindByUserId(userId);
                    if (volunteer != null)
                    {
                        var token = _webSecurity.GeneratePasswordResetToken(userName);
                        // Generate the absolute Url for the password reset action.
                        var routeValues = new RouteValueDictionary { { "token", token } };
                        var passwordResetLink = Url.Action("ResetPassword", "Account", routeValues, Request.Url.Scheme);

                        var body = String.Format(@"<p>Click on the following link to reset your password: <a href='{0}'>{0}</a></p>", passwordResetLink);
                        var message = new Message("CrisisCheckin - Password Reset", body);

                        _messageService.SendMessage(message, volunteer);
                    }
                }
                return RedirectToAction("PasswordResetRequested");
            }
            return View(model);
        }
        public void ForgotPassword_ValidEmailInsteadOfUsername_SendsEmail_And_RedirectsTo_PasswordResetRequestedView()
        {
            // Arrange
            const string usernameOrEmail = "*****@*****.**";
            const int existingUserId = 42;
            const string existingUsername = "******";
            const string token = "t-o-k-e-n";
            var person = new Person {Id = existingUserId};

            _webSecurity.Setup(x => x.GetUserId(usernameOrEmail))
                .Returns(-1);
            _volunteerService.Setup(x => x.FindUserByEmail(usernameOrEmail))
                .Returns(new User { Id = existingUserId, UserName = existingUsername});
            _webSecurity.Setup(x => x.GeneratePasswordResetToken(existingUsername))
                .Returns(token);
            _volunteerService.Setup(x => x.FindByUserId(existingUserId))
                .Returns(person);

            _routeCollection.MapRoute(
                name: "PasswordReset",
                url: "{controller}/{action}",
                defaults: new { controller = "Account", action = "PasswordReset" }
            );

            // Act
            var model = new ForgotPasswordViewModel
            {
                UserNameOrEmail = usernameOrEmail
            };
            Mother.ControllerHelpers.SetupControllerModelState(model, _controllerUnderTest);
            var response = _controllerUnderTest.ForgotPassword(model);

            // Assert
            var result = response as RedirectToRouteResult;
            Assert.AreEqual("PasswordResetRequested", result.RouteValues["action"]);

            _messageService.Verify(x => x.SendMessage(It.IsAny<Message>(), person, It.IsAny<string>()));
        }
 public ActionResult ForgotPassword()
 {
     var model = new ForgotPasswordViewModel();
     return View(model);
 }