public void GivenDuplicateUsername_ReturnsRegisterView()
        {
            var model = new Register
            {
                Username = User.Username,
                Password = "******"
            };

            var result = Controller.Register(model) as ViewResult;
            result.Should().Not.Be.Null();

            result.Model.Should().Be.OfType<Register>();
            result.ViewName.Should().Equal("");
        }
        public void GivenDuplicateEmail_ReturnsRegisterView()
        {
            var model = new Register
            {
                Username = GetRandom.String(20),
                Email = User.Email,
                Password = "******"
            };

            var result = Controller.Register(model) as ViewResult;
            result.Should().Not.Be.Null();

            result.Model.Should().Be.OfType<Register>();
            result.ViewName.Should().Equal("");
        }
        public void GivenInvalidModelState_ReturnsRegisterView()
        {
            var model = new Register
            {
                Username = GetRandom.String(20),
                Email = GetRandom.Email(),
                Password = "******"
            };
            Controller.ModelState.AddModelError("Fake error", "error");

            var result = Controller.Register(model) as ViewResult;
            result.Should().Not.Be.Null();

            result.Model.Should().Be.OfType<Register>();
            var typedModel = result.Model as Register;
            typedModel.Email.Should().Equal(model.Email);
            typedModel.Password.Should().Be.NullOrEmpty();
            typedModel.ReturnUrl.Should().Equal(model.ReturnUrl);
            typedModel.Username.Should().Equal(model.Username);
            result.ViewName.Should().Equal("");

            var modelState = result.ViewData.ModelState;
            modelState.ContainsKey("Fake error").Should().Be.True();
        }
        public void GivenReservedUsername_ReturnsRegisterView()
        {
            var model = new Register
            {
                Username = "******",
                Email = GetRandom.Email(),
                Password = "******"
            };

            var result = Controller.Register(model) as ViewResult;
            result.Should().Not.Be.Null();

            result.Model.Should().Be.OfType<Register>();
            result.ViewName.Should().Equal("");
        }
        public void GivenValidPostRequest_SendsEmail()
        {
            var model = new Register
            {
                Username = GetRandom.String(20),
                Email = GetRandom.Email(),
                Password = "******"
            };

            Controller.Register(model);

            MailController.Verify(x => x.Welcome(It.Is<ViewModels.Mail.Welcome>(m => m.To == model.Email && m.Username == model.Username)), Times.Once());
        }
        public void GivenValidModelState_ReturnsRedirect()
        {
            var model = new Register
            {
                Username = GetRandom.String(20),
                Email = GetRandom.Email(),
                Password = "******",
                ReturnUrl = "http://google.com"
            };

            var result = Controller.Register(model) as RedirectResult;
            result.Should().Not.Be.Null();
            Controller.TempData[ViewDataConstants.Notification].Should().Not.Be.Null();
            result.Url.Should().Equal(Controller.Url.Home().Index());
        }
        public ActionResult Register(Register model)
        {
            if (ModelState.IsValid)
            {
                if (_authenticationService.ReservedUsernames.Any(x => model.Username.Equals(x, StringComparison.OrdinalIgnoreCase)))
                {
                    ModelState.AddModelErrorFor<Register>(x => x.Username, "Username is unavailable");
                }
                else
                {
                    var user = Db.Query<User>("select top 1 * from [{0}] where IsDeleted=0 AND (Username=@Username OR Email=@Email)".Fmt(Db.GetTableName<User>()), new
                        {
                            model.Username,
                            model.Email
                        }
                    ).SingleOrDefault();

                    if (user != null)
                    {
                        if (user.Username.Equals(model.Username, StringComparison.OrdinalIgnoreCase))
                        {
                            ModelState.AddModelErrorFor<Register>(x => x.Username, "Username is already in use");
                        }
                        if (user.Email.Equals(model.Email, StringComparison.OrdinalIgnoreCase))
                        {
                            ModelState.AddModelErrorFor<Register>(x => x.Email, "A user with that email exists");
                        }
                    }
                }
            }

            if (ModelState.IsValid)
            {
                var newUser = Mapper.Map<User>(model);
                newUser.Password = model.Password.ToSHAHash();

                _userService.Save(newUser);
                Metrics.Increment(Metric.Users_Register);

                _mailController.Welcome(new ViewModels.Mail.Welcome
                    {
                        Username = newUser.Username,
                        To = newUser.Email
                    }).Deliver();

                // Auto login the user
                _authenticationService.SetLoginCookie(newUser, false);

                NotifySuccess("Your account has been created and you have been logged in. Enjoy!");
                return Redirect(Url.Home().Index());
            }

            // If we got this far, something failed, redisplay form
            model.Password = null; //clear the password so they have to re-enter it
            return View(model);
        }