public void IndexActionAuthenticatesRedirectsToQueryStringParameterWhenAuthenticationModelIsValid()
        {
            var user = new Mock<User>();
            user.Object.Email = string.Empty;
            user.Object.PasswordSalt = string.Empty;
            user.Object.PasswordHashed = "hashedpassword";

            var crypto = new Mock<ICryptographer>();
            crypto.Setup(c => c.GetPasswordHash(It.IsAny<string>(), It.IsAny<string>())).Returns("hashedpassword");

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

            var auth = new Mock<IAuth>();

            var request = new Mock<HttpRequestBase>();
            var context = new Mock<HttpContextBase>();

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

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

            var model = Mock.Of<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"));
        }
        public void IndexShouldReturnViewResultWithAuthenticationModel()
        {
            var controller = new AuthenticationController(Store.OpenSession(), M<ICryptographer>(), M<IAuth>(), M<IMessagingService>());
            var result = controller.Index();
            Assert.That(result, Is.InstanceOf(typeof(ViewResult)));

            var viewresult = (ViewResult) result;
            Assert.That(viewresult.ViewData.Model, Is.Not.Null);
            Assert.That(viewresult.ViewData.Model, Is.InstanceOf(typeof(AuthenticationModel)));
        }
        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 IndexActionAuthenticatesRedirectsWhenAuthenticationModelIsValid()
        {
            var email = "*****@*****.**";
            var salt = "salt";
            var pass = "******";

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

            var crypto = new Mock<ICryptographer>();
            crypto.Setup(c => c.GetPasswordHash(pass, salt)).Returns("hashedpassword");

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

            var auth = new Mock<IAuth>();

            var request = new Mock<HttpRequestBase>();
            var context = new Mock<HttpContextBase>();

            request.Setup(c => c.QueryString).Returns(new NameValueCollection());
            context.Setup(c => c.Request).Returns(request.Object);

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

            var model = Mock.Of<AuthenticationModel>();
            model.Email = email;
            model.Password = pass;

            var result = controller.Index(model);

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

            session.Verify(s => s.Single<User>(It.IsAny<Expression<Func<User, bool>>>()), Times.Once());
            crypto.Verify(c => c.GetPasswordHash(pass, salt), Times.Once());
            auth.Verify(a => a.DoAuth(email, true), Times.Once());
        }
        public void IndexActionReturnsToViewWhenAuthenticationModelIsInValid()
        {
            var controller = new AuthenticationController(M<ICryptographer>(), M<IPersistenceSession>(), M<IAuth>(), M<IMessagingService>());
            var result = controller.Index(Mock.Of<AuthenticationModel>());

            var viewresult = result.AssertViewRendered();
            Assert.That(viewresult.ViewData.Model, Is.Not.Null);
            Assert.That(viewresult.ViewData.Model, Is.InstanceOf(typeof(AuthenticationModel)));
        }
        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"));

        }