public void A_user_can_associate_SIMPL_username_to_their_corp_username() { using (ShimsContext.Create()) { //Setup var session = new System.Web.SessionState.Fakes.ShimHttpSessionState() { ItemGetString = (key) => { return key == "CurrentUser" ? new ShimCurrentUser() : null; } }; var context = new System.Web.Fakes.ShimHttpContext(); var applicationShim = new System.Web.Fakes.ShimHttpApplicationState(); context.ApplicationGet = delegate { return applicationShim; }; System.Web.Fakes.ShimHttpContext.CurrentGet = delegate { return context; }; System.Web.Fakes.ShimHttpContext.AllInstances.SessionGet = delegate { return session; }; ShimUserEvents.AllInstances.InitializeSessionStringString = delegate { }; ShimSingleConcurrentLoginManager.AllInstances.CreateLoginRecordStringString = delegate { return true; }; var calledSetCurrentUser = false; ShimCurrentUser.SetInstanceString = delegate { calledSetCurrentUser = true; }; ShimCurrentUser.Clear = delegate { }; ShimCurrentUser.SessionInstanceGet = delegate { return new ShimCurrentUser(); }; ShimLoginModel.AllInstances.SyncWithOrImportDataFromASPPIErrorLoggingServiceString = (loginModel, errorLoggingService, userNameSentToLoginModel) => { }; var calledSetAuthCookie = false; ShimFormsAuthentication.SetAuthCookieStringBooleanString = delegate { calledSetAuthCookie = true; }; // Given a user const string corpUserName = "******"; const string corpPassword = "******"; const string simplUserName = "******"; const string simplPassword = "******"; var requestStub = new StubHttpRequestBase(); var contextStub = new StubHttpContextBase {RequestGet = () => requestStub}; var calledUpdateHistoricalRecored = false; ShimUserRepository.AllInstances.UpdateHistoricalRecordStringString = delegate { calledUpdateHistoricalRecored = true; return true; }; var userAssociationModel = new AssociationViewModel(); // And has known corp credentials userAssociationModel.UserName = corpUserName; userAssociationModel.Password = corpPassword; // And has known SIMPL credentials userAssociationModel.SIMPLUserName = simplUserName; userAssociationModel.SIMPLPassword = simplPassword; var wasAttemptToLogUserInCalledForCorp = false; var wasAttemptToLogUserInCalledForSIMPL = false; ShimLoginModel.AllInstances.AttemptToLogUserInStringString = (loginModel, userName, password) => { if (wasAttemptToLogUserInCalledForCorp && wasAttemptToLogUserInCalledForSIMPL) { return new LoginModel(); } if (userName == corpUserName && password == corpPassword) { wasAttemptToLogUserInCalledForCorp = true; return new LoginModel() { Message = SIMPL.Models.Code.Constants.Areas.Common.LoginModel.AuthenticationResultMessages.NoUserRoles }; } if (userName == simplUserName && password == simplPassword) { wasAttemptToLogUserInCalledForSIMPL = true; return new LoginModel(); } return new LoginModel() { Errors = true, Message = SIMPL.Models.Code.Constants.Areas.Common.LoginModel.AuthenticationResultMessages.UnknownResult }; }; // And corp username doesn’t match SIMPL username // When submitting the association form ShimUserManagement.AllInstances.UpdateUsernameStringString = delegate { return UserManagement.UpdateUsernameResult.Success; }; LoginControllerForTests.ControllerContext = new ControllerContext { HttpContext = contextStub }; var userAssociationResult = LoginControllerForTests.UserNameAssociation(userAssociationModel); // Then usernames are associated Assert.IsTrue(wasAttemptToLogUserInCalledForCorp, "Corp credential were not Authorized"); Assert.IsTrue(wasAttemptToLogUserInCalledForSIMPL, "SIMPL credentials were not Authorized"); Assert.IsTrue(calledUpdateHistoricalRecored, "UpdateHistoricalRecords was not called"); Assert.IsNotNull(userAssociationResult); #pragma warning disable 183 // ReSharper generates a warning on the next line, but having this check will guarantee that the return type is checked before the other asserts Assert.IsTrue(userAssociationResult is ActionResult, "The return from the UserLogin action method was not a ActionResult"); #pragma warning restore 183 Assert.IsTrue(userAssociationResult is RedirectResult, "The return from the UserLogin action method was not a RedirectResult"); // And user is logged in Assert.IsTrue(calledSetCurrentUser, "The set CurrentUser was never called"); Assert.IsTrue(calledSetAuthCookie, "The set Authorization cookie was never called"); // And a message is displayed stating “Username association successful! Please use your corp credentials for future logins to SIMPL.” var redirectResult = userAssociationResult as RedirectResult; Assert.AreEqual("~/SIMPLNET/Search", redirectResult.Url, "The redirect URL was not the search page which should be called when you have a successful login"); } }
public void SIMPL_user_timesout_then_logs_back_in_gets_correct_return_url() { using (ShimsContext.Create()) { // Arrange //Given a user const string userName = "******"; const string password = "******"; const string returnUrl = "/SIMPLNET/Subscriber?subID=370001704986|state=WA|billingRegion="; const string redirectURL = "/SIMPLNET/Subscriber?subID=370001704986&state=WA&billingRegion="; var session = new System.Web.SessionState.Fakes.ShimHttpSessionState() { ItemGetString = (key) => { return key == "CurrentUser" ? new ShimCurrentUser() : null; } }; var context = new System.Web.Fakes.ShimHttpContext(); var applicationShim = new System.Web.Fakes.ShimHttpApplicationState(); context.ApplicationGet = delegate { return applicationShim; }; var requestStub = new StubHttpRequestBase(); var contextStub = new StubHttpContextBase { RequestGet = () => requestStub }; System.Web.Fakes.ShimHttpContext.CurrentGet = delegate { return context; }; System.Web.Fakes.ShimHttpContext.AllInstances.SessionGet = delegate { return session; }; ShimUserEvents.AllInstances.InitializeSessionStringString = delegate { }; ShimSingleConcurrentLoginManager.AllInstances.CreateLoginRecordStringString = delegate { return true; }; ShimCurrentUser.SetInstanceString = delegate { }; ShimCurrentUser.Clear = delegate { }; ShimCurrentUser.SessionInstanceGet = delegate { return new ShimCurrentUser(); }; ShimLoginModel.AllInstances.SyncWithOrImportDataFromASPPIErrorLoggingServiceString = (loginModel, errorLoggingService, userNameSentToLoginModel) => { }; ShimSingleConcurrentLoginManager.AllInstances.CreateLoginRecordStringString = delegate { return true; }; ShimFormsAuthentication.SetAuthCookieStringBooleanString = delegate { }; //And an known AD username and password ShimUserManagement.AllInstances.AuthenticateStringString = delegate { return ASPP.UserManagement.AuthenticationResults.Success; }; //And the AD username does not exist in ASPP ShimUserManagement.AllInstances.GetUserDetailsString = delegate { return new ASPP_Users(); }; ShimUserManagement.AllInstances.GetUserGroupsString = delegate { return new List<ASPP_Groups> { new ASPP_Groups() }; }; LoginControllerForTests.ControllerContext = new ControllerContext { HttpContext = contextStub }; //When attempting to log in to SIMPL var resultUserLogin = LoginControllerForTests.UserLogin(userName, password, returnUrl); //Then an error is reported to the user to log in using their ASPP credentials Assert.IsNotNull(resultUserLogin); #pragma warning disable 183 // ReSharper generates a warning on the next line, but having this check will guarantee that the return type is checked before the other asserts Assert.IsTrue(resultUserLogin is ActionResult, "The return from the UserLogin action method was not a ActionResult"); #pragma warning restore 183 Assert.IsTrue(resultUserLogin is RedirectResult, "The return from the UserLogin action method was not a ViewResult"); var resultUserLoginAsRedirectResult = resultUserLogin as RedirectResult; Assert.AreEqual(redirectURL, resultUserLoginAsRedirectResult.Url, string.Format("The RedirectUrl is {0}, should redirect to {1}", resultUserLoginAsRedirectResult.Url, redirectURL)); } }