public void ExternalLoginCallback_RedirectsTo_ExternalLoginConfirm_WhenUserIsNew()
        {
            // Arrange
            var mocks = new OAuthMocks();
            var controller = GetController(mocks);
            var extraData = new Dictionary<string, string> {{"accesstoken", "providerAccessToken"}};
            var authResult = new AuthenticationResult(true, PROVIDER, PROVIDER_USERID, USERNAME, extraData);
            var mxClient = new MxClient(new InMemoryOAuthTokenManager("a", "b"));

            mocks.Response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns(RETURN_URL);
            mocks.OAuthWebSecurity.Setup(ows => ows.VerifyAuthentication(It.IsAny<string>())).Returns(authResult);
            mocks.OAuthWebSecurity.Setup(ows => ows.Login(PROVIDER, PROVIDER_USERID, false)).Returns(false);
            mocks.Identity.Setup(i => i.IsAuthenticated).Returns(false);

            mocks.OAuthWebSecurity.Setup(ows => ows.SerializeProviderUserId(PROVIDER, PROVIDER_USERID)).Returns(PROVIDER_USERID);
            mocks.OAuthWebSecurity.Setup(ows => ows.GetOAuthClientData(PROVIDER)).Returns(new AuthenticationClientData(mxClient, PROVIDER_DISPLAY_NAME, null));

            // Act
            var result = controller.ExternalLoginCallback(RETURN_URL) as ViewResult;

            // Assert
            Assert.NotNull(result, "result");
            Assert.AreEqual(result.ViewBag.ProviderDisplayName, PROVIDER_DISPLAY_NAME);

            var model = result.Model as RegisterExternalLoginModel;
            Assert.NotNull(model, "result");
            Assert.AreEqual(model.UserName, authResult.UserName);
            Assert.AreEqual(model.ExternalLoginData, authResult.ProviderUserId);
            Assert.AreEqual(model.AccessToken, "providerAccessToken");
        }
        public void ExternalLoginCallback_RedirectsTo_ExternalLoginConfirm_WhenUserIsNew()
        {
            // Arrange
            var mocks = new OAuthMocks();
            var controller = GetController(mocks);
            var extraData = new Dictionary<string, string> {{"accesstoken", "providerAccessToken"}};
            var authResult = new AuthenticationResult(true, PROVIDER, PROVIDER_USERID, USERNAME, extraData);
            var mxClient = new MxClient(new InMemoryOAuthTokenManager("a", "b"));

            mocks.Response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns(RETURN_URL);
            mocks.OAuthWebSecurity.Setup(ows => ows.VerifyAuthentication(It.IsAny<string>())).Returns(authResult);
            mocks.OAuthWebSecurity.Setup(ows => ows.Login(PROVIDER, PROVIDER_USERID, false)).Returns(false);
            mocks.Identity.Setup(i => i.IsAuthenticated).Returns(false);

            mocks.OAuthWebSecurity.Setup(ows => ows.SerializeProviderUserId(PROVIDER, PROVIDER_USERID)).Returns(PROVIDER_USERID);
            mocks.OAuthWebSecurity.Setup(ows => ows.GetOAuthClientData(PROVIDER)).Returns(new AuthenticationClientData(mxClient, PROVIDER_DISPLAY_NAME, null));

            // Act
            var result = controller.ExternalLoginCallback(RETURN_URL) as ViewResult;

            // Assert
            Assert.NotNull(result, "result");
            Assert.AreEqual(result.ViewBag.ProviderDisplayName, PROVIDER_DISPLAY_NAME);

            var model = result.Model as RegisterExternalLoginModel;
            Assert.NotNull(model, "result");
            Assert.AreEqual(model.UserName, authResult.UserName);
            Assert.AreEqual(model.ExternalLoginData, authResult.ProviderUserId);
            Assert.AreEqual(model.AccessToken, "providerAccessToken");
        }
        public OAuthController GetController(OAuthMocks mocks)
        {

            var controller = new OAuthController(mocks.WebSecurity.Object, mocks.OAuthWebSecurity.Object);
            controller.ControllerContext = new ControllerContext(mocks.Context.Object, new RouteData(), controller);
            controller.Url = new UrlHelper(new RequestContext(mocks.Context.Object, new RouteData()), mocks.Routes);

            return controller;
        }
        public void ExternalLogin_RedirectsTo_ExternalLoginFailure_OnFailure()
        {
            // Arrange
            var mocks = new OAuthMocks();
            var controller = GetController(mocks);

            mocks.Response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns(RETURN_URL);
            mocks.OAuthWebSecurity.Setup(ows => ows.VerifyAuthentication(It.IsAny<string>())).Returns(new AuthenticationResult(false));

            // Act
            var result = controller.ExternalLoginCallback(RETURN_URL) as RedirectToRouteResult;

            // Assert
            Assert.NotNull(result, "result");
            Assert.NotNull(result.RouteValues["action"], "ExternalLoginFailure");
        }
        public void ExternalLogin_Returns_ExternalLoginResult()
        {
            // Arrange
            var mocks = new OAuthMocks();
            var controller = GetController(mocks);


            mocks.Response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns(RETURN_URL);

            // Act
            var result = controller.ExternalLogin(PROVIDER, RETURN_URL) as OAuthController.ExternalLoginResult;

            // Assert
            Assert.NotNull(result, "result");
            Assert.AreEqual(result.Provider, PROVIDER);
            Assert.AreEqual(result.ReturnUrl, RETURN_URL);
        }
        public void UnauthenticatedUser_And_KnownProviderUserId_Should_LoginUser_And_RedirectToReturnUrl()
        {
            // Arrange
            var mocks = new OAuthMocks();
            var controller = GetController(mocks);
            var authResult = new AuthenticationResult(true, PROVIDER, PROVIDER_USERID, USERNAME, null);

            mocks.Response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns(RETURN_URL);
            mocks.OAuthWebSecurity.Setup(ows => ows.VerifyAuthentication(It.IsAny<string>())).Returns(authResult);
            mocks.OAuthWebSecurity.Setup(ows => ows.Login(PROVIDER, PROVIDER_USERID, false)).Returns(true);

            // Act
            var result = controller.ExternalLoginCallback(RETURN_URL) as RedirectResult;

            // Assert
            Assert.NotNull(result, "result");
            Assert.NotNull(result.Url, RETURN_URL);
            mocks.OAuthWebSecurity.Verify(ows => ows.Login(PROVIDER, PROVIDER_USERID, false),Times.Exactly(1));
        }
        public void AuthenticatedUser_And_NewProviderUserId_Should_UpdateAccount()
        {
            // Arrange
            var mocks = new OAuthMocks();
            var controller = GetController(mocks);
            var authResult = new AuthenticationResult(true, PROVIDER, PROVIDER_USERID, USERNAME, null);

            mocks.Response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns(RETURN_URL);
            mocks.OAuthWebSecurity.Setup(ows => ows.VerifyAuthentication(It.IsAny<string>())).Returns(authResult);
            mocks.OAuthWebSecurity.Setup(ows => ows.Login(PROVIDER, PROVIDER_USERID, false)).Returns(false);
            mocks.Identity.Setup(i => i.IsAuthenticated).Returns(true);
            mocks.Identity.Setup(i => i.Name).Returns(USERNAME);
            mocks.OAuthWebSecurity.Setup(ows => ows.CreateOrUpdateAccount(PROVIDER, PROVIDER_USERID, USERNAME));

            // Act
            var result = controller.ExternalLoginCallback(RETURN_URL) as RedirectResult;

            // Assert
            Assert.NotNull(result, "result");
            Assert.NotNull(result.Url, RETURN_URL);
            mocks.OAuthWebSecurity.Verify(ows => ows.CreateOrUpdateAccount(PROVIDER, PROVIDER_USERID, USERNAME), Times.Exactly(1));
        }
        public OAuthController GetController(OAuthMocks mocks)
        {
            var controller = new OAuthController(mocks.WebSecurity.Object, mocks.OAuthWebSecurity.Object);
            controller.ControllerContext = new ControllerContext(mocks.Context.Object, new RouteData(), controller);
            controller.Url = new UrlHelper(new RequestContext(mocks.Context.Object, new RouteData()), mocks.Routes);

            return controller;
        }
        public void ExternalLogin_Returns_ExternalLoginResult()
        {
            // Arrange
            var mocks = new OAuthMocks();
            var controller = GetController(mocks);

            mocks.Response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns(RETURN_URL);

            // Act
            var result = controller.ExternalLogin(PROVIDER, RETURN_URL) as OAuthController.ExternalLoginResult;

            // Assert
            Assert.NotNull(result, "result");
            Assert.AreEqual(result.Provider, PROVIDER);
            Assert.AreEqual(result.ReturnUrl, RETURN_URL);
        }
        public void ExternalLogin_RedirectsTo_ExternalLoginFailure_OnFailure()
        {
            // Arrange
            var mocks = new OAuthMocks();
            var controller = GetController(mocks);

            mocks.Response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns(RETURN_URL);
            mocks.OAuthWebSecurity.Setup(ows => ows.VerifyAuthentication(It.IsAny<string>())).Returns(new AuthenticationResult(false));

            // Act
            var result = controller.ExternalLoginCallback(RETURN_URL) as RedirectToRouteResult;

            // Assert
            Assert.NotNull(result, "result");
            Assert.NotNull(result.RouteValues["action"], "ExternalLoginFailure");
        }