public void SendForgotPasswordMailShouldCreatePasswordTokenAndSendConfirmationMail()
        {
            //Arrange
            var model = new ForgotPasswordModelBuilder().WithValidEmail().Build();

            var existingUser = new User
            {
                Email          = model.Email,
                EmailConfirmed = true
            };

            _userManagerMock.Setup(manager => manager.FindByEmailAsync(It.IsAny <string>())).ReturnsAsync(existingUser);

            var resetPasswordToken = Guid.NewGuid().ToString();

            _userManagerMock.Setup(manager => manager.GeneratePasswordResetTokenAsync(It.IsAny <User>()))
            .ReturnsAsync(resetPasswordToken);

            //Act
            var result = _controller.SendForgotPasswordMail(model).Result as OkResult;

            //Assert
            Assert.That(result, Is.Not.Null);

            _userManagerMock.Verify(manager => manager.FindByEmailAsync(model.Email), Times.Once);
            _mailSenderMock.Verify(sender => sender.SendForgotPasswordMessageAsync(existingUser, resetPasswordToken), Times.Once);
        }
        public void SendForgotPasswordMailShouldReturnOkResultIfUserCannotBeFound()
        {
            //Arrange
            var model = new ForgotPasswordModelBuilder().Build();

            _userManagerMock.Setup(manager => manager.FindByEmailAsync(It.IsAny <string>())).ReturnsAsync(() => null);

            //Act
            var result = _controller.SendForgotPasswordMail(model).Result as OkResult;

            //Assert
            Assert.That(result, Is.Not.Null);
            _userManagerMock.Verify(manager => manager.FindByEmailAsync(model.Email), Times.Once);
            _mailSenderMock.Verify(sender => sender.SendForgotPasswordMessageAsync(It.IsAny <User>(), It.IsAny <string>()), Times.Never);
        }
        public void SendForgotPasswordMailShouldReturnBadRequestIfCaptchaIsInvalid()
        {
            //Arrange
            var model = new ForgotPasswordModelBuilder().WithValidEmail().Build();
            var expectedCaptchaResult = new CaptchaVerificationResult {
                Success = false
            };

            _captchaValidatorMock.Setup(validator => validator.Validate(It.IsAny <string>(), It.IsAny <IPAddress>()))
            .ReturnsAsync(expectedCaptchaResult);

            //Act
            var result = _controller.SendForgotPasswordMail(model).Result as BadRequestObjectResult;

            //Assert
            Assert.That(result, Is.Not.Null);
            _captchaValidatorMock.Verify(validator => validator.Validate(model.CaptchaToken, _controller.HttpContext.Connection.RemoteIpAddress));
            _userManagerMock.Verify(manager => manager.FindByEmailAsync(It.IsAny <string>()), Times.Never);
            _mailSenderMock.Verify(sender => sender.SendConfirmUserEmailMessageAsync(It.IsAny <User>(), It.IsAny <string>()), Times.Never);
        }
        public void SendForgotPasswordMailShouldReturnBadRequestIfModelIsInvalid()
        {
            //Arrange
            var model = new ForgotPasswordModelBuilder().Build();

            var errorKey = "someValidationError";

            _controller.ModelState.AddModelError(errorKey, Guid.NewGuid().ToString());

            //Act
            var result = _controller.SendForgotPasswordMail(model).Result as BadRequestObjectResult;

            //Assert
            Assert.That(result, Is.Not.Null);
            var serializableError = result.Value as SerializableError;

            Assert.That(serializableError, Is.Not.Null);
            Assert.That(serializableError.Keys, Has.One.EqualTo(errorKey));
            _userManagerMock.Verify(manager => manager.FindByEmailAsync(It.IsAny <string>()), Times.Never);
            _mailSenderMock.Verify(sender => sender.SendForgotPasswordMessageAsync(It.IsAny <User>(), It.IsAny <string>()), Times.Never);
        }