Exemplo n.º 1
0
        public void Pass_Remind_To_Correct_Email_With_Valid_Captcha()
        {
            // Arrange
            PassReminderViewModel model = new PassReminderViewModel
            {
                Email   = "correct",
                Captcha = "correct"
            };
            Mock <IAuthProvider> mock = new Mock <IAuthProvider>();

            mock.Setup(m => m.IsEmailExists(It.Is <string>(s => s == model.Email)))
            .Returns(true);
            AccountController target  = new AccountController(mock.Object);
            SessionStorage    storage = SessionStorage.Current;

            storage.CaptchaCode = model.Captcha;

            // Act
            ActionResult result = target.PassReminder(model, "#true", storage);

            // Assert
            Assert.IsInstanceOfType(result, typeof(RedirectResult));
            mock.Verify(m => m.IsEmailExists(It.IsAny <string>()), Times.Once());
            mock.Verify(m => m.RemindPass(It.IsAny <string>(), It.IsAny <string>()), Times.Once());
            // тест может не проходить на слабых процессорах, изза фонового потока в контролллере
            Assert.IsTrue(storage.UnsucLoginAttempts == 0);
        }
Exemplo n.º 2
0
        public ActionResult PassReminder(PassReminderViewModel model, string returnUrl, SessionStorage storage)
        {
            ValidateCaptcha(model.Captcha, storage.CaptchaCode);

            if (ModelState.IsValid)
            {
                if (authProvider.IsEmailExists(model.Email))
                {
                    storage.UnsucLoginAttempts = 0;
                    storage.CaptchaCode        = null;

                    Task.Factory.StartNew(() =>
                    {
                        // Блокируем общий для главного и фонового потока ресурс
                        // deadlock не ожидается, потому как пока это единственный монитор
                        // + выполниться этот процесс должен оч. быстро.
                        lock (BlogSettings.Current)
                        {
                            string url = "";
                            if (Request != null) // при юнит-тестировании пропускаем этот блок
                            {
                                url = Request.Url.Authority + Url.Action("ConfirmNewPass");
                            }
                            authProvider.RemindPass(model.Email, url);
                        }
                    });

                    // Перенаправляем пользователя с сообщением об отправлении письма (almost POST/Redirect/GET pattern)
                    // и продолжим обработку запроса (отправку письма) в отдельном потоке (чуть выше)

                    string redirectUrl = "mock";
                    if (Url != null) // т.к. объект Url == null при юнит-тестировании
                    {
                        redirectUrl = Url.Action("PassReminder", new { email = model.Email, returnUrl = returnUrl });
                    }

                    TempData["msgSended"] = true;
                    return(Redirect(redirectUrl));
                }
                else
                {
                    storage.UnsucLoginAttempts++;
                    ModelState.AddModelError("email", "Указанный email-адрес не зарегистрирован");
                    return(View(model));
                }
            }
            else
            {
                storage.UnsucLoginAttempts++;
                return(View(model));
            }
        }
Exemplo n.º 3
0
        public void Dont_Pass_Remind_To_Invalid_Email()
        {
            // Arrange
            PassReminderViewModel model = new PassReminderViewModel
            {
                Email = "invalid",
            };
            IAuthProvider     authProv = new FormsAuthProvider("", "", "correct");
            AccountController target   = new AccountController(authProv);

            // Act
            ActionResult result = target.PassReminder(model, "#true", SessionStorage.Current);

            // Assert
            Assert.IsInstanceOfType(result, typeof(ViewResult));
        }
Exemplo n.º 4
0
        public void Dont_Pass_Remind_To_Correct_Email_With_Invalid_Captcha_3()
        {
            // Arrange
            PassReminderViewModel model = new PassReminderViewModel
            {
                Email = "correct"
            };
            IAuthProvider     authProv = new FormsAuthProvider("", "", model.Email);
            AccountController target   = new AccountController(authProv);
            SessionStorage    storage  = SessionStorage.Current;

            storage.CaptchaCode = "correct";

            // Act
            ActionResult result = target.PassReminder(model, "#true", storage);

            // Assert
            Assert.IsInstanceOfType(result, typeof(ViewResult));
            Assert.IsTrue(storage.UnsucLoginAttempts == 1);
        }