using System; using System.Security.Principal; using System.Web; using System.Web.Mvc; using System.Web.Routing; using System.Web.Security; using Microsoft.VisualStudio.TestTools.UnitTesting; using NzbDrone.Web; using NzbDrone.Web.Controllers; using NzbDrone.Web.Models; namespace NzbDrone.Web.Tests.Controllers { [TestClass] public class AccountControllerTest { [TestMethod] public void ChangePassword_Get_ReturnsView() { // Arrange AccountController controller = GetAccountController(); // Act ActionResult result = controller.ChangePassword(); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); Assert.AreEqual(10, ((ViewResult)result).ViewData["PasswordLength"]); } [TestMethod] public void ChangePassword_Post_ReturnsRedirectOnSuccess() { // Arrange AccountController controller = GetAccountController(); ChangePasswordModel model = new ChangePasswordModel() { OldPassword = "goodOldPassword", NewPassword = "goodNewPassword", ConfirmPassword = "goodNewPassword" }; // Act ActionResult result = controller.ChangePassword(model); // Assert Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult)); RedirectToRouteResult redirectResult = (RedirectToRouteResult)result; Assert.AreEqual("ChangePasswordSuccess", redirectResult.RouteValues["action"]); } [TestMethod] public void ChangePassword_Post_ReturnsViewIfChangePasswordFails() { // Arrange AccountController controller = GetAccountController(); ChangePasswordModel model = new ChangePasswordModel() { OldPassword = "goodOldPassword", NewPassword = "badNewPassword", ConfirmPassword = "badNewPassword" }; // Act ActionResult result = controller.ChangePassword(model); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); ViewResult viewResult = (ViewResult)result; Assert.AreEqual(model, viewResult.ViewData.Model); Assert.AreEqual("The current password is incorrect or the new password is invalid.", controller.ModelState[""].Errors[0].ErrorMessage); Assert.AreEqual(10, viewResult.ViewData["PasswordLength"]); } [TestMethod] public void ChangePassword_Post_ReturnsViewIfModelStateIsInvalid() { // Arrange AccountController controller = GetAccountController(); ChangePasswordModel model = new ChangePasswordModel() { OldPassword = "goodOldPassword", NewPassword = "goodNewPassword", ConfirmPassword = "goodNewPassword" }; controller.ModelState.AddModelError("", "Dummy error message."); // Act ActionResult result = controller.ChangePassword(model); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); ViewResult viewResult = (ViewResult)result; Assert.AreEqual(model, viewResult.ViewData.Model); Assert.AreEqual(10, viewResult.ViewData["PasswordLength"]); } [TestMethod] public void ChangePasswordSuccess_ReturnsView() { // Arrange AccountController controller = GetAccountController(); // Act ActionResult result = controller.ChangePasswordSuccess(); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); } [TestMethod] public void LogOff_LogsOutAndRedirects() { // Arrange AccountController controller = GetAccountController(); // Act ActionResult result = controller.LogOff(); // Assert Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult)); RedirectToRouteResult redirectResult = (RedirectToRouteResult)result; Assert.AreEqual("Home", redirectResult.RouteValues["controller"]); Assert.AreEqual("Index", redirectResult.RouteValues["action"]); Assert.IsTrue(((MockFormsAuthenticationService)controller.FormsService).SignOut_WasCalled); } [TestMethod] public void LogOn_Get_ReturnsView() { // Arrange AccountController controller = GetAccountController(); // Act ActionResult result = controller.LogOn(); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); } [TestMethod] public void LogOn_Post_ReturnsRedirectOnSuccess_WithoutReturnUrl() { // Arrange AccountController controller = GetAccountController(); LogOnModel model = new LogOnModel() { UserName = "someUser", Password = "goodPassword", RememberMe = false }; // Act ActionResult result = controller.LogOn(model, null); // Assert Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult)); RedirectToRouteResult redirectResult = (RedirectToRouteResult)result; Assert.AreEqual("Home", redirectResult.RouteValues["controller"]); Assert.AreEqual("Index", redirectResult.RouteValues["action"]); Assert.IsTrue(((MockFormsAuthenticationService)controller.FormsService).SignIn_WasCalled); } [TestMethod] public void LogOn_Post_ReturnsRedirectOnSuccess_WithReturnUrl() { // Arrange AccountController controller = GetAccountController(); LogOnModel model = new LogOnModel() { UserName = "someUser", Password = "goodPassword", RememberMe = false }; // Act ActionResult result = controller.LogOn(model, "/someUrl"); // Assert Assert.IsInstanceOfType(result, typeof(RedirectResult)); RedirectResult redirectResult = (RedirectResult)result; Assert.AreEqual("/someUrl", redirectResult.Url); Assert.IsTrue(((MockFormsAuthenticationService)controller.FormsService).SignIn_WasCalled); } [TestMethod] public void LogOn_Post_ReturnsViewIfModelStateIsInvalid() { // Arrange AccountController controller = GetAccountController(); LogOnModel model = new LogOnModel() { UserName = "someUser", Password = "goodPassword", RememberMe = false }; controller.ModelState.AddModelError("", "Dummy error message."); // Act ActionResult result = controller.LogOn(model, null); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); ViewResult viewResult = (ViewResult)result; Assert.AreEqual(model, viewResult.ViewData.Model); } [TestMethod] public void LogOn_Post_ReturnsViewIfValidateUserFails() { // Arrange AccountController controller = GetAccountController(); LogOnModel model = new LogOnModel() { UserName = "someUser", Password = "badPassword", RememberMe = false }; // Act ActionResult result = controller.LogOn(model, null); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); ViewResult viewResult = (ViewResult)result; Assert.AreEqual(model, viewResult.ViewData.Model); Assert.AreEqual("The user name or password provided is incorrect.", controller.ModelState[""].Errors[0].ErrorMessage); } [TestMethod] public void Register_Get_ReturnsView() { // Arrange AccountController controller = GetAccountController(); // Act ActionResult result = controller.Register(); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); Assert.AreEqual(10, ((ViewResult)result).ViewData["PasswordLength"]); } [TestMethod] public void Register_Post_ReturnsRedirectOnSuccess() { // Arrange AccountController controller = GetAccountController(); RegisterModel model = new RegisterModel() { UserName = "someUser", Email = "goodEmail", Password = "goodPassword", ConfirmPassword = "goodPassword" }; // Act ActionResult result = controller.Register(model); // Assert Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult)); RedirectToRouteResult redirectResult = (RedirectToRouteResult)result; Assert.AreEqual("Home", redirectResult.RouteValues["controller"]); Assert.AreEqual("Index", redirectResult.RouteValues["action"]); } [TestMethod] public void Register_Post_ReturnsViewIfRegistrationFails() { // Arrange AccountController controller = GetAccountController(); RegisterModel model = new RegisterModel() { UserName = "duplicateUser", Email = "goodEmail", Password = "goodPassword", ConfirmPassword = "goodPassword" }; // Act ActionResult result = controller.Register(model); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); ViewResult viewResult = (ViewResult)result; Assert.AreEqual(model, viewResult.ViewData.Model); Assert.AreEqual("Username already exists. Please enter a different user name.", controller.ModelState[""].Errors[0].ErrorMessage); Assert.AreEqual(10, viewResult.ViewData["PasswordLength"]); } [TestMethod] public void Register_Post_ReturnsViewIfModelStateIsInvalid() { // Arrange AccountController controller = GetAccountController(); RegisterModel model = new RegisterModel() { UserName = "someUser", Email = "goodEmail", Password = "goodPassword", ConfirmPassword = "goodPassword" }; controller.ModelState.AddModelError("", "Dummy error message."); // Act ActionResult result = controller.Register(model); // Assert Assert.IsInstanceOfType(result, typeof(ViewResult)); ViewResult viewResult = (ViewResult)result; Assert.AreEqual(model, viewResult.ViewData.Model); Assert.AreEqual(10, viewResult.ViewData["PasswordLength"]); } private static AccountController GetAccountController() { AccountController controller = new AccountController() { FormsService = new MockFormsAuthenticationService(), MembershipService = new MockMembershipService() }; controller.ControllerContext = new ControllerContext() { Controller = controller, RequestContext = new RequestContext(new MockHttpContext(), new RouteData()) }; return controller; } private class MockFormsAuthenticationService : IFormsAuthenticationService { public bool SignIn_WasCalled; public bool SignOut_WasCalled; public void SignIn(string userName, bool createPersistentCookie) { // verify that the arguments are what we expected Assert.AreEqual("someUser", userName); Assert.IsFalse(createPersistentCookie); SignIn_WasCalled = true; } public void SignOut() { SignOut_WasCalled = true; } } private class MockHttpContext : HttpContextBase { private readonly IPrincipal _user = new GenericPrincipal(new GenericIdentity("someUser"), null /* roles */); public override IPrincipal User { get { return _user; } set { base.User = value; } } } private class MockMembershipService : IMembershipService { public int MinPasswordLength { get { return 10; } } public bool ValidateUser(string userName, string password) { return (userName == "someUser" && password == "goodPassword"); } public MembershipCreateStatus CreateUser(string userName, string password, string email) { if (userName == "duplicateUser") { return MembershipCreateStatus.DuplicateUserName; } // verify that values are what we expected Assert.AreEqual("goodPassword", password); Assert.AreEqual("goodEmail", email); return MembershipCreateStatus.Success; } public bool ChangePassword(string userName, string oldPassword, string newPassword) { return (userName == "someUser" && oldPassword == "goodOldPassword" && newPassword == "goodNewPassword"); } } } }