public void DeleteWillNotDeleteYourself()
        {
            var userid = new ObjectId("abc123");
            var email = "*****@*****.**";
            var user = new User {Id = userid, Email=email};

            var contextuser = new Mock<IPrincipal>();
            var context = new Mock<HttpContextBase>();
            var response = new Mock<HttpResponseBase>();
            var identity = new Mock<IIdentity>();
            identity.SetupGet(i => i.Name).Returns(email);
            contextuser.Setup(u => u.Identity).Returns(identity.Object);
            context.Setup(h => h.Response).Returns(response.Object);
            context.Setup(h => h.User).Returns(contextuser.Object);

            var session = new Mock<IPersistenceSession>();
            session.Setup(s => s.Single<User>(It.IsAny<Expression<Func<User, bool>>>())).Returns(user);

            var controller = new UserController(session.Object);
            controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);

            var result = controller.Delete(userid) as ViewResult;
            session.Verify(s => s.Single<User>(It.IsAny<Expression<Func<User, bool>>>()), Times.Once());
            session.Verify(s => s.Delete<User>(It.IsAny<User>()), Times.Never());
        }
        public void ShouldNotRedirectToSetupWhenThereAreUsers()
        {
            var locator = M<IServiceLocator>();
            ServiceLocator.SetLocatorProvider(() => locator);

            var session = Store.OpenSession();
            var userdoc = new User();
            session.Store(userdoc);
            session.SaveChanges();
            locator.Expect(l => l.GetInstance<IDocumentSession>()).Return(session);

            var user = M<IPrincipal>();
            var httpContext = M<HttpContextBase>();
            var response = M<HttpResponseBase>();
            response.Expect(r => r.Redirect("/admin/setup", true)).Repeat.Never();
            user.Expect(u => u.Identity).Return(M<IIdentity>());
            httpContext.Expect(h => h.Response).Return(response);
            httpContext.Expect(h => h.User).Return(user);
            var controller = M<ControllerBase>();

            var controllerContext = new ControllerContext(httpContext, new RouteData(), controller);
            var filterContext = new ActionExecutingContext(controllerContext, M<ActionDescriptor>(), new Dictionary<string, object>());
            var attribute = new AppInitAttribute();

            attribute.OnActionExecuting(filterContext);

            response.VerifyAllExpectations();
            locator.VerifyAllExpectations();

            session.Delete(userdoc);
            session.SaveChanges();
        }
        public void IndexShouldRedirectWhenThereAreUsers()
        {
            var locator = M<IServiceLocator>();
            ServiceLocator.SetLocatorProvider(() => locator);

            var session = Store.OpenSession();
            locator.Expect(l => l.GetInstance<IDocumentSession>()).Return(session);

            var user = new User();
            session.Store(user);
            session.SaveChanges();

            var controller = new SetupController();

            var result = controller.Index();

            result.AssertActionRedirect().ToController("authentication").ToAction("index");

            session.Delete(user);
            session.SaveChanges();
        }
        public void IndexActionAuthenticatesRedirectsWhenAuthenticationModelIsValid()
        {
            var email = "*****@*****.**";
            var salt = "salt";
            var pass = "******";

            var user = new User();
            user.Email = email;
            user.PasswordSalt = salt;
            user.PasswordHashed = "hashedpassword";

            SetupData(s => s.Store(user));
            
            var crypto = M<ICryptographer>();
            crypto.Expect(c => c.GetPasswordHash(pass, salt)).Return("hashedpassword").Repeat.Once();

            var auth = M<IAuth>();
            auth.Expect(a => a.DoAuth(email, true)).Repeat.Once();

            var request = M<HttpRequestBase>();
            var context = M<HttpContextBase>();

            request.Expect(c => c.QueryString).Return(new NameValueCollection());
            context.Expect(c => c.Request).Return(request);

            var controller = new AuthenticationController(Store.OpenSession(),crypto,auth,M<IMessagingService>());
            controller.ControllerContext = new ControllerContext(context, new RouteData(), controller);
            
            var model = M<AuthenticationModel>();
            model.Email = email;
            model.Password = pass;
            
            var result = controller.Index(model);

            result.AssertActionRedirect().ToController("dashboard").ToAction("index");

            crypto.VerifyAllExpectations();
            auth.VerifyAllExpectations();

        }
        public void IndexActionAuthenticatesRedirectsToQueryStringParameterWhenAuthenticationModelIsValid()
        {
            var user = new User();
            user.Email = "e";
            user.PasswordSalt = string.Empty;
            user.PasswordHashed = "hashedpassword";

            SetupData(s => s.Store(user));

            var crypto = M<ICryptographer>();
            crypto.Expect(c => c.GetPasswordHash(Arg<string>.Is.Anything, (Arg<string>.Is.Anything))).Return("hashedpassword");

            var auth = M<IAuth>();

            var request = M<HttpRequestBase>();
            var context = M<HttpContextBase>();

            var qstrings = new NameValueCollection();
            qstrings.Add("ReturnUrl", "/somepagetoredirecto");
            request.Expect(c => c.QueryString).Return(qstrings);
            context.Expect(c => c.Request).Return(request);

            var controller = new AuthenticationController(Store.OpenSession(),crypto, auth, M<IMessagingService>());
            controller.ControllerContext = new ControllerContext(context, new RouteData(), controller);

            var model = M<AuthenticationModel>();
            model.Email = "e";
            model.Password = "******";

            var result = controller.Index(model);

            Assert.That(result, Is.InstanceOfType(typeof (RedirectResult)));
            Assert.That(((RedirectResult) result).Url, Is.EqualTo("/somepagetoredirecto"));

        }