public void TestEdit_WhenUserIsDeleted_AddModelErrorAndReturnEditView()
        {
            // Arrange
            IUnitOfWork unitOfWork = new UnitOfWork();
            UserController target = new UserController(unitOfWork);
            Nullable<bool> errorOccurred = null;

            // Act
            ViewResult actual = target.Edit(2, errorOccurred) as ViewResult;

            // Assert
            Assert.AreEqual("Edit", actual.ViewName);
            Assert.IsFalse(target.ModelState.IsValid);
        }
        public void TestEdit_WhenUserIDIsZero_ReturnIndexViewAndErrorMessage()
        {
            // Arrange
            IUnitOfWork unitOfWork = new UnitOfWork();
            UserController target = new UserController(unitOfWork);
            Nullable<bool> errorOccurred = null;

            // Act
            RedirectToRouteResult actual = target.Edit(0, errorOccurred) as RedirectToRouteResult;

            // Assert
            Assert.AreEqual("Index", actual.RouteValues["action"]);
            Assert.AreEqual(true, actual.RouteValues["errorOccurred"]);
        }
        public void TestEdit_WhenNoError_ReturnEditView()
        {
            // Arrange
            IUnitOfWork unitOfWork = new UnitOfWork();
            UserController target = new UserController(unitOfWork);
            Nullable<bool> errorOccurred = null;

            // Act
            ViewResult actual = target.Edit(1, errorOccurred) as ViewResult;

            // Assert
            Assert.AreEqual("Edit", actual.ViewName);
        }
        public void TestEdit_WhenNoError_EditUserAndReturnIndexView()
        {
            // Arrange
            IUnitOfWork unitOfWork = new UnitOfWork();
            UserController target = new UserController(unitOfWork);

            var editedUser = userRepository.GetUserByID(1);
            editedUser.FirstName = "Edited_First_Name";
            editedUser.LastName = "Edited_Last_Name";
            editedUser.Email = "*****@*****.**";

            // Act
            RedirectToRouteResult actual = target.Edit(editedUser) as RedirectToRouteResult;

            // Assert
            Assert.AreEqual("Index", actual.RouteValues["action"]);
            Assert.IsNotNull(editedUser.DateModified);
            Assert.IsNull(editedUser.IsDeleted);
        }
        public void TestEdit_WhenError_ReturnEditViewAndErrorMessage()
        {
            // Arrange
            IUnitOfWork unitOfWork = new UnitOfWork();
            UserController target = new UserController(unitOfWork);
            Nullable<bool> errorOccurred = true;

            // Act
            ViewResult actual = target.Edit(1, errorOccurred) as ViewResult;

            // Assert
            Assert.AreEqual("Edit", actual.ViewName);
            Assert.AreEqual("Error occurred.", actual.ViewBag.ErrorMessage);
        }
        public void TestEdit_WhenError_ModelStateNotValid_ReturnEditView()
        {
            // Arrange
            IUnitOfWork unitOfWork = new UnitOfWork();
            UserController target = new UserController(unitOfWork);

            var editedUser = userRepository.GetUserByID(1);
            editedUser.FirstName = "";
            editedUser.LastName = "";
            editedUser.Email = "";
            //TODO: it shows that modelstate is valid, throws an exception when saving

            // Act
            ViewResult actual = target.Edit(editedUser) as ViewResult;

            // Assert
            Assert.AreEqual("Edit", actual.ViewName);
            Assert.IsFalse(target.ModelState.IsValid);
        }