public void ShouldConfirmNewUserWithTokenAndNewPassword()
        {
            var model = new RegisterModelBuilder()
                .Build();

            var mock = GetEmailMock();
            string secureToken = null;

            mock.Setup(e => e.SendConfirmation(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>()))
                .Callback<string, string, string, int>((from, to, token, userId) =>
                {
                    secureToken = token;
                });
            string oldPassword = "";
            UsingSession(session =>
            {
                var controller = new AccountController(session) { EmailService = mock.Object };
                controller.Create(model);
                oldPassword = session.Query<User>().First(u => u.Username == model.Email).Password;
            });

            UsingSession(session =>
            {
                var user = session.Query<User>().First();
                var controller = new AccountController(session) { EmailService = mock.Object };
                var localPasswordModel = new LocalPasswordModelBuilder()
                    .WithSecurityToken(secureToken)
                    .WithUserId(user.Id)
                    .Build();
                var mockAccountService = new Mock<IAccountService>();
                mockAccountService.Setup(s => s.Login(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>())).Returns(true);
                controller.AccountService = mockAccountService.Object;
                var actionResult = (System.Web.Mvc.RedirectToRouteResult)(controller.RegisterConfirmation(localPasswordModel));
                Assert.AreEqual("Home", actionResult.RouteValues["controller"]);
                Assert.AreEqual("Index", actionResult.RouteValues["action"]);
            });

            UsingSession(session =>
            {
                Assert.IsTrue(session.Query<User>().First(u=>u.Username==model.Email).IsApproved);
                Assert.AreNotEqual(oldPassword,
                    session.Query<User>().First(u => u.Username == model.Email).Password);
            });
        }
        public void ShouldCreateNewUser()
        {
            var model = new RegisterModelBuilder()
                .WithEmail("*****@*****.**")
                .WithRole(Roles.Admin)
                .Build();

            UsingSession(session =>
                {
                    var controller = new AccountController(session)
                        {
                            EmailService = GetEmailMock().Object
                        };

                    var actionResult = (System.Web.Mvc.RedirectToRouteResult) (controller.Create(model));
                    Assert.AreEqual("Account", actionResult.RouteValues["controller"]);
                    Assert.AreEqual("List", actionResult.RouteValues["action"]);
                });

            UsingSession(session =>
                {
                    var users = session.Query<User>().Customize(a => a.WaitForNonStaleResultsAsOfLastWrite()).ToList();
                    Assert.AreEqual(1, users.Count());
                    var user = users.First();
                    Assert.AreEqual(model.Email, user.Username);
                    Assert.AreEqual(model.Role, user.Roles.First());
                });
        }
        public void ShouldListUsers()
        {
            var ruimin = new RegisterModelBuilder()
                .WithEmail("*****@*****.**")
                .WithRole(Roles.Author)
                .Build();
            var akani = new RegisterModelBuilder()
                .WithEmail("*****@*****.**")
                .WithRole(Roles.Admin)
                .Build();

            UsingSession(session =>
                {
                    var accountController = new AccountController(session)
                        {
                            EmailService = GetEmailMock().Object
                        };
                    accountController.Create(ruimin);
                    accountController.Create(akani);
                });

            UsingSession(session =>
                {
                    var accountController = new AccountController(session);
                    var viewResult = accountController.List();
                    var actualUsers = ((List<User>) (viewResult.Model));
                    Assert.AreEqual(2, actualUsers.Count);
                    Assert.IsTrue(UserEqual(akani, actualUsers.First()));
                    Assert.IsTrue(UserEqual(ruimin, actualUsers.Last()));
                });
        }
        public void ShouldNotBeAbleToCreateUserWithAnExistingEmail()
        {
            var model = new RegisterModelBuilder()
                .WithEmail("*****@*****.**")
                .WithRole(Roles.Admin)
                .Build();

            UsingSession(session =>
            {
                var controller = new AccountController(session)
                {
                    EmailService = GetEmailMock().Object
                };

                controller.Create(model);
            });

            UsingSession(session =>
            {
                var controller = new AccountController(session)
                {
                    EmailService = GetEmailMock().Object
                };

                var viewResult = (System.Web.Mvc.ViewResult)(controller.Create(model));

                Assert.AreEqual("A user with this email already exists", controller.TempData["flashError"]);
                Assert.AreEqual(string.Empty, viewResult.MasterName);
                Assert.AreEqual("Add a User", viewResult.ViewBag.Title);
            });
        }
        public void ShouldCreateNewUserNotApproved()
        {
            var model = new RegisterModelBuilder()
                .Build();

            var mock = GetEmailMock();

            UsingSession(session =>
            {
                var controller = new AccountController(session) {EmailService = mock.Object};
                controller.Create(model);
            });

            UsingSession(session =>
            {
                var user = session.Query<User>().Customize(a => a.WaitForNonStaleResultsAsOfLastWrite()).First();
                Assert.IsFalse(user.IsApproved);
                mock.Verify(e => e.SendConfirmation("*****@*****.**", model.Email, user.ConfirmationToken, user.Id), Times.Once());
            });
        }