You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by mp...@apache.org on 2011/08/01 14:02:06 UTC

svn commit: r1152748 - in /incubator/rave/trunk/rave-portal/src: main/java/org/apache/rave/portal/model/ main/java/org/apache/rave/portal/web/controller/ main/java/org/apache/rave/portal/web/util/ main/java/org/apache/rave/portal/web/validator/ main/re...

Author: mpierce
Date: Mon Aug  1 12:02:04 2011
New Revision: 1152748

URL: http://svn.apache.org/viewvc?rev=1152748&view=rev
Log:
(RAVE-124) Applying patch to provide improved new user validation.  Patch also includes improved unit tests for the new account controller.

Added:
    incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/model/NewUser.java
    incubator/rave/trunk/rave-portal/src/main/resources/messages.properties
    incubator/rave/trunk/rave-portal/src/main/webapp/META-INF/MANIFEST.MF
Modified:
    incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java
    incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/util/ModelKeys.java
    incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
    incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/validator/NewAccountValidator.java
    incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/applicationContext.xml
    incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/views/newaccount.jsp
    incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java

Added: incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/model/NewUser.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/model/NewUser.java?rev=1152748&view=auto
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/model/NewUser.java (added)
+++ incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/model/NewUser.java Mon Aug  1 12:02:04 2011
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.rave.portal.model;
+
+/**
+ * {@inheritDoc}
+ *
+ * A new user registering into the system
+ */
+
+public class NewUser {
+	private String username;
+	
+	private String password;
+	
+	private String confirmPassword;
+
+	public NewUser(){
+	}
+	
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getConfirmPassword() {
+		return confirmPassword;
+	}
+
+	public void setConfirmPassword(String confirmPassword) {
+		this.confirmPassword = confirmPassword;
+	}
+	
+}
\ No newline at end of file

Modified: incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java?rev=1152748&r1=1152747&r2=1152748&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java (original)
+++ incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java Mon Aug  1 12:02:04 2011
@@ -19,8 +19,12 @@
 
 package org.apache.rave.portal.web.controller;
 
-import org.apache.rave.portal.model.User;
+import java.util.List;
+
+import org.apache.rave.portal.model.NewUser;
 import org.apache.rave.portal.service.NewAccountService;
+import org.apache.rave.portal.web.util.ModelKeys;
+import org.apache.rave.portal.web.util.ViewNames;
 import org.apache.rave.portal.web.validator.NewAccountValidator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,6 +33,7 @@ import org.springframework.stereotype.Co
 import org.springframework.ui.Model;
 import org.springframework.ui.ModelMap;
 import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
 import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -53,40 +58,45 @@ public class NewAccountController {
     @RequestMapping(value ="/newaccount.jsp")
 	 public void setUpForm(ModelMap model) {
 		  logger.debug("Initializing form");
-		  //TODO this should use view keys like other pages.
-		  model.addAttribute("newUser",new User());
+		  //TODO this should use view keys like other pages. (done)
+		  model.addAttribute(ModelKeys.NEW_USER,new NewUser());
 	 }
 
     @RequestMapping(value = { "/newaccount","/newacount/*"}, method = RequestMethod.POST)
-		  public String create(@ModelAttribute User user, BindingResult results, Model model,@RequestParam String username, @RequestParam String password){
+		  public String create(@ModelAttribute NewUser newUser, BindingResult results, Model model,@RequestParam String username, @RequestParam String password){
 		  logger.debug("Creating a new user account");
-		  model.addAttribute("newUser",user);
+		  model.addAttribute(ModelKeys.NEW_USER,newUser);
 		  
-		  newAccountValidator.validate(user,results);
+		  newAccountValidator.validate(newUser,results);
 		  if(results.hasErrors()){
-				return "newaccount";
+			  logger.error("newaccount.jsp: shows validation errors");
+			  //TODO: change this to a viewname (done)
+			  return ViewNames.NEW_ACCOUNT;
 		  }
 
 		  //Now attempt to create the account.
 		  try {
-				newAccountService.createNewAccount(username,password);
-				return "redirect:/";
+			    logger.debug("newaccount.jsp: passed form validation");
+			    
+			    newAccountService.createNewAccount(username,password);
+			    //TODO: change this to a viewname (done)
+				return ViewNames.REDIRECT;
 		  }
 		  
 		  catch (org.springframework.dao.IncorrectResultSizeDataAccessException ex) {
 				//This exception is thrown if the account already exists.
 				logger.error("Account creation failed: "+ex.getMessage());
 				results.reject("Account already exists","Unable to create account");
-				//TODO: change this to a viewname
-				return "newaccount";
+				//TODO: change this to a viewname (done)
+				return ViewNames.NEW_ACCOUNT;
 				
 		  }
 		  //TODO need to handle more specific exceptions
 		  catch (Exception ex) {
 				logger.error("Account creation failed: "+ex.getMessage());
 				results.reject("Unable to create account:"+ex.getMessage(),"Unable to create account");
-				//TODO: change this to a viewname
-				return "newaccount";
+				//TODO: change this to a viewname (done)
+				return ViewNames.NEW_ACCOUNT;
 		  }
 		  
 	 }

Modified: incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/util/ModelKeys.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/util/ModelKeys.java?rev=1152748&r1=1152747&r2=1152748&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/util/ModelKeys.java (original)
+++ incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/util/ModelKeys.java Mon Aug  1 12:02:04 2011
@@ -30,4 +30,5 @@ public class ModelKeys {
     public static final String WIDGET = "widget";
     public static final String REFERRING_PAGE_ID = "referringPageId";
     public static final String OPENSOCIAL_ENVIRONMENT = "openSocialEnv";
+    public static final String NEW_USER = "newUser"; //a new user instance created
 }
\ No newline at end of file

Modified: incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/util/ViewNames.java?rev=1152748&r1=1152747&r2=1152748&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/util/ViewNames.java (original)
+++ incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/util/ViewNames.java Mon Aug  1 12:02:04 2011
@@ -27,4 +27,6 @@ public class ViewNames {
     public static final String HOME = "home";
     public static final String STORE = "store";
     public static final String WIDGET = "widget";
+    public static final String NEW_ACCOUNT = "newaccount";
+    public static final String REDIRECT = "redirect:/";
 }

Modified: incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/validator/NewAccountValidator.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/validator/NewAccountValidator.java?rev=1152748&r1=1152747&r2=1152748&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/validator/NewAccountValidator.java (original)
+++ incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/validator/NewAccountValidator.java Mon Aug  1 12:02:04 2011
@@ -19,21 +19,90 @@
 //TODO is this the right package name convention?
 package org.apache.rave.portal.web.validator;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.rave.portal.model.NewUser;
+import org.apache.rave.portal.service.UserService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.Errors;
+import org.springframework.validation.ObjectError;
 import org.springframework.validation.Validator;
 
-
 public class NewAccountValidator implements Validator {
 
 	 protected final Logger logger=LoggerFactory.getLogger(getClass());
+	 
+	 private UserService userService;
 
+	 @Autowired
+	 public NewAccountValidator(UserService userService) {
+		 this.userService = userService;
+	 }
+	 
 	 public boolean supports(Class aClass){
 		  return NewAccountValidator.class.equals(aClass);
 	 }
 	 
 	 public void validate(Object obj, Errors errors){
 		  logger.debug("Validator called");
+		  NewUser newUser = (NewUser) obj;
+		  List<ObjectError> errorList = new ArrayList<ObjectError>();
+		  
+		  //check if the username is null
+		  if(newUser.getUsername() == "") {
+			  errors.rejectValue("username", "username.required");
+			  logger.error("Username required");
+		  }
+		  
+		  //check if username length is less than 2
+		  else if(newUser.getUsername().length() < 2) {
+			  errors.rejectValue("username", "username.invalid.length");
+			  logger.error("Username must be atleast 2 characters long");
+		  }
+		  
+		  //check if username is already in use
+		  
+		  else if(userService.getUserByUsername(newUser.getUsername()) != null) {
+			  errors.rejectValue("username", "username.exits");
+			  logger.error("Username already exists");
+		  }
+		  
+		  
+		  //check if the password is null
+		  if(newUser.getPassword() == "") {
+			  errors.rejectValue("password", "password.required");
+			  logger.error("Password required");
+		  }
+		  
+		  //check if the password length is less than 4
+		  else if(newUser.getPassword().length() < 4) {
+			  errors.rejectValue("password", "password.invalid.lenght");
+			  logger.error("Password must be atleast 4 characters long");
+		  }
+		  
+		  //check if the confirm password is null
+		  if(newUser.getConfirmPassword() == "") {
+			  errors.rejectValue("confirmPassword", "confirmPassword.required");
+			  logger.error("Confirm Password required");
+		  }
+		  
+		  //check if the confirm password matches the previous entered password
+		  if(newUser.getConfirmPassword().length() != newUser.getPassword().length() || newUser.getConfirmPassword().compareTo(newUser.getPassword()) != 0) {
+			  errors.rejectValue("confirmPassword", "confirmPassword.mismatch");
+			  logger.error("Password mismatch");
+		  }
+
+		  if(errors.hasErrors()){
+			  errorList = errors.getAllErrors();
+			  for (ObjectError error : errorList) {
+				  logger.error("Validation error: " + error.toString());
+			  }
+		  }
+		  else {
+			  logger.debug("Validation successful");
+		  }
 	 }
 }
\ No newline at end of file

Added: incubator/rave/trunk/rave-portal/src/main/resources/messages.properties
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/resources/messages.properties?rev=1152748&view=auto
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/resources/messages.properties (added)
+++ incubator/rave/trunk/rave-portal/src/main/resources/messages.properties Mon Aug  1 12:02:04 2011
@@ -0,0 +1,9 @@
+username.required=Username required
+username.invalid.length=Username must be atleast 2 characters long
+username.exits=Username already exists
+
+password.required=Password required
+password.invalid.lenght=Password must be atleast 4 characters long
+
+confirmPassword.required=Confirm Password required
+confirmPassword.mismatch=Password mismatch
\ No newline at end of file

Added: incubator/rave/trunk/rave-portal/src/main/webapp/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/webapp/META-INF/MANIFEST.MF?rev=1152748&view=auto
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/webapp/META-INF/MANIFEST.MF (added)
+++ incubator/rave/trunk/rave-portal/src/main/webapp/META-INF/MANIFEST.MF Mon Aug  1 12:02:04 2011
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path: 
+

Modified: incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/applicationContext.xml
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/applicationContext.xml?rev=1152748&r1=1152747&r2=1152748&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/applicationContext.xml (original)
+++ incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/applicationContext.xml Mon Aug  1 12:02:04 2011
@@ -96,5 +96,9 @@
         <property name="engineRoot" value="${portal.opensocial_engine.root}"/>
         <property name="engineGadgetPath" value="${portal.opensocial_engine.gadget_path}"/>
     </bean>
-	 <bean id="newAccountValidator" class="org.apache.rave.portal.web.validator.NewAccountValidator"/>
+	<bean id="newAccountValidator" class="org.apache.rave.portal.web.validator.NewAccountValidator"/>
+	
+	<!-- Configuring messages.properties file --> 
+	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="messages" />
+
 </beans>
\ No newline at end of file

Modified: incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/views/newaccount.jsp
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/views/newaccount.jsp?rev=1152748&r1=1152747&r2=1152748&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/views/newaccount.jsp (original)
+++ incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/views/newaccount.jsp Mon Aug  1 12:02:04 2011
@@ -27,38 +27,33 @@
     <form:form id="newAccountForm" commandName="newUser" action="newaccount" method="POST">
         <fieldset>
             <p>All fields are required</p>
-				<p><form:errors cssClass="error2"/>
+				<p><form:errors cssClass="error"/>
             <p>
                 <label for="userNameField">Username:</label>
                 <form:input id="userNameField" type="text" path="username" required="required" autofocus="autofocus"/>
+                <form:errors path="username" cssClass="error" />
             </p>
             <p>
                 <label for="passwordField">Password:</label>
                 <form:input id="passwordField" type="password" path="password" required="required"/>
+            	<form:errors path="password" cssClass="error" />
             </p>
             <p>
                 <label for="passwordConfirmField">Confirm Password:</label>
-                <input id="passwordConfirmField" type="password" name="passwordConfirm" required="required"/>
+                <form:input id="passwordConfirmField" type="password" path="confirmPassword" required="required"/>
+            	<form:errors path="confirmPassword" cssClass="error" />
             </p>
         </fieldset>
         <fieldset>
              <input type="submit" value="Create Account" />
         </fieldset>
     </form:form>
-    <form id="loginForm" action="/portal/login.jsp" method="get">
-	<fieldset>
-		<p>
-			<label for="navigateToLoginPageButton">Already Registered? </label>
-			<input id="navigateToLoginPageButton" type="submit" value="User Login" />
-		</p>
-	</fieldset>
-    </form>
 </div>
 <script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.1.min.js"></script>
 <script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.8.1/jquery.validate.min.js"></script>
 <script src="<spring:url value="/script/rave.js"/>"></script>
 <script src="<spring:url value="/script/rave_forms.js"/>"></script>
 
-<script>$(document).ready(rave.forms.validateNewAccountForm());</script>
+<!--  <script>$(document).ready(rave.forms.validateNewAccountForm());</script> -->
 </rave:rave_generic_page>
-  
+  
\ No newline at end of file

Modified: incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java?rev=1152748&r1=1152747&r2=1152748&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java (original)
+++ incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java Mon Aug  1 12:02:04 2011
@@ -19,10 +19,358 @@
 
 package org.apache.rave.portal.web.controller;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.rave.portal.model.NewUser;
+import org.apache.rave.portal.model.User;
+import org.apache.rave.portal.service.NewAccountService;
+import org.apache.rave.portal.service.UserService;
+import org.apache.rave.portal.web.util.ModelKeys;
+import org.apache.rave.portal.web.util.ViewNames;
+import org.apache.rave.portal.web.validator.NewAccountValidator;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.ui.Model;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.Errors;
+import org.springframework.validation.ObjectError;
+
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.assertThat;
+
+
 /**
  * This is a test class for NewAccountController, which is used to make new user accounts through
  * a web form.
  */
 public class NewAccountControllerTest {
 	 //Tests need to be implemented.
+	private NewAccountController newAccountController;
+	private NewAccountService newAccountService;
+	private NewAccountValidator newAccountValidator;
+	private UserService userService;
+	
+	@Before
+	public void setup() {
+		newAccountService = createNiceMock(NewAccountService.class);
+		userService = createNiceMock(UserService.class);
+		newAccountValidator = new NewAccountValidator(userService);
+		newAccountController = new NewAccountController(newAccountService, newAccountValidator);
+	}
+	
+	@Test
+	public void setUpForm_ShouldAddAttributeForNewUser() {
+		final ModelMap model = new ModelMap();
+		String newUser = new String(ModelKeys.NEW_USER);
+		newAccountController.setUpForm(model);
+		
+		//assert that the model is not null
+		assertThat(model, CoreMatchers.notNullValue());
+		
+		//assert that the model size is one
+		assertThat(model.size(), CoreMatchers.equalTo(1));
+		
+		//assert that the model does contain an attribute associated with newUser after setUpForm() is called
+		assertThat(model.containsAttribute(newUser), CoreMatchers.equalTo(true)); 
+		
+		//assert that the model does not contain new user as null
+		assertThat(model.get(newUser), CoreMatchers.notNullValue());
+	}
+	
+	@Test
+	public void create_UsernameNotSpecified() {
+		final Model model = createNiceMock(Model.class);
+		final NewUser newUser = new NewUser();
+		final BindingResult errors = createNiceMock(BindingResult.class);
+		final String username = ""; //no username specified
+		final String password = "password";
+		final String confirmPassword = password;
+		List<ObjectError> errorList = new ArrayList<ObjectError>();
+		final ObjectError error = new ObjectError("username.required", "Username required");
+		
+		newUser.setUsername(username);
+		newUser.setPassword(password);
+		newUser.setConfirmPassword(confirmPassword);
+		
+		errorList.add(error);
+		
+		expect(errors.hasErrors()).andReturn(true).anyTimes();		
+		expect(errors.getAllErrors()).andReturn(errorList).anyTimes();
+		replay(errors);
+		
+		String result = new String(newAccountController.create(newUser, errors, model, username, password));
+		errorList = errors.getAllErrors();
+
+		assertThat(errorList.size(), CoreMatchers.equalTo(1));
+		assertThat(errorList.get(0).getDefaultMessage(), CoreMatchers.equalTo("Username required"));
+		assertThat(result, CoreMatchers.equalTo(ViewNames.NEW_ACCOUNT));
+	}
+	
+	@Test
+	public void create_UsernameAlreadyExists() {
+		final Model model = createNiceMock(Model.class);
+		final NewUser newUser = new NewUser();
+		final BindingResult errors = createNiceMock(BindingResult.class);
+		final String username = "canonical"; //specified username already exists in database
+		final String password = "password";
+		final String confirmPassword = password;
+		final User existingUser = new User();
+		List<ObjectError> errorList = new ArrayList<ObjectError>();
+		final ObjectError error = new ObjectError("username.exists", "Username already exists");
+		
+		newUser.setUsername(username);
+		newUser.setPassword(password);
+		newUser.setConfirmPassword(confirmPassword);
+		
+		existingUser.setUsername(username);
+		existingUser.setPassword(password);
+		
+		errorList.add(error);
+		
+		expect(errors.hasErrors()).andReturn(true).anyTimes();		
+		expect(errors.getAllErrors()).andReturn(errorList).anyTimes();
+		replay(errors);
+		
+		expect(userService.getUserByUsername(username)).andReturn(existingUser).anyTimes();
+		replay(userService);
+		
+		String result = new String(newAccountController.create(newUser, errors, model, username, password));
+		errorList = errors.getAllErrors();
+
+		assertThat(errorList.size(), CoreMatchers.equalTo(1));
+		assertThat(errorList.get(0).getDefaultMessage(), CoreMatchers.equalTo("Username already exists"));
+		assertThat(result, CoreMatchers.equalTo(ViewNames.NEW_ACCOUNT));
+	}
+		
+	@Test
+	public void create_InvalidUsernameLength() {
+		final Model model = createNiceMock(Model.class);
+		final NewUser newUser = new NewUser();
+		final BindingResult errors = createNiceMock(BindingResult.class);
+		final String username = "u"; //username length less than 2 characters
+		final String password = "password";
+		final String confirmPassword = password;
+		List<ObjectError> errorList = new ArrayList<ObjectError>();
+		final ObjectError error = new ObjectError("username.invalid.length", "Username must be atleast 2 characters long");
+		
+		newUser.setUsername(username);
+		newUser.setPassword(password);
+		newUser.setConfirmPassword(confirmPassword);
+		
+		errorList.add(error);
+		
+		expect(errors.hasErrors()).andReturn(true).anyTimes();		
+		expect(errors.getAllErrors()).andReturn(errorList).anyTimes();
+		replay(errors);
+		
+		String result = new String(newAccountController.create(newUser, errors, model, username, password));
+		errorList = errors.getAllErrors();
+
+		assertThat(errorList.size(), CoreMatchers.equalTo(1));
+		assertThat(errorList.get(0).getDefaultMessage(), CoreMatchers.equalTo("Username must be atleast 2 characters long"));
+		assertThat(result, CoreMatchers.equalTo(ViewNames.NEW_ACCOUNT));
+	}
+	
+	@Test
+	public void create_PasswordNotSpecified() {
+		final Model model = createNiceMock(Model.class);
+		final NewUser newUser = new NewUser();
+		final BindingResult errors = createNiceMock(BindingResult.class);
+		final String username = "username"; 
+		final String password = ""; //password not specified
+		final String confirmPassword = password;
+		List<ObjectError> errorList = new ArrayList<ObjectError>();
+				
+		newUser.setUsername(username);
+		newUser.setPassword(password);
+		newUser.setConfirmPassword(confirmPassword);
+		
+		errorList.add(new ObjectError("password.required", "Password required"));
+		errorList.add(new ObjectError("confirmPassword.required", "Confirm password required"));
+		
+		expect(errors.hasErrors()).andReturn(true).anyTimes();		
+		expect(errors.getAllErrors()).andReturn(errorList).anyTimes();
+		replay(errors);
+		
+		String result = new String(newAccountController.create(newUser, errors, model, username, password));
+		errorList = errors.getAllErrors();
+
+		assertThat(errorList.size(), CoreMatchers.equalTo(2));
+		assertThat(errorList.get(0).getDefaultMessage(), CoreMatchers.equalTo("Password required"));
+		assertThat(errorList.get(1).getDefaultMessage(), CoreMatchers.equalTo("Confirm password required"));
+		assertThat(result, CoreMatchers.equalTo(ViewNames.NEW_ACCOUNT));
+	}
+	
+	@Test
+	public void create_ConfirmPasswordNotSpecified() {
+		final Model model = createNiceMock(Model.class);
+		final NewUser newUser = new NewUser();
+		final BindingResult errors = createNiceMock(BindingResult.class);
+		final String username = "usename"; 
+		final String password = "pasword";
+		final String confirmPassword = ""; //confirm password not specified
+		List<ObjectError> errorList = new ArrayList<ObjectError>();
+				
+		newUser.setUsername(username);
+		newUser.setPassword(password);
+		newUser.setConfirmPassword(confirmPassword);
+		
+		errorList.add(new ObjectError("confirmPassword.required", "Confirm password required"));
+		
+		expect(errors.hasErrors()).andReturn(true).anyTimes();		
+		expect(errors.getAllErrors()).andReturn(errorList).anyTimes();
+		replay(errors);
+		
+		String result = new String(newAccountController.create(newUser, errors, model, username, password));
+		errorList = errors.getAllErrors();
+
+		assertThat(errorList.size(), CoreMatchers.equalTo(1));
+		assertThat(errorList.get(0).getDefaultMessage(), CoreMatchers.equalTo("Confirm password required"));
+		assertThat(result, CoreMatchers.equalTo(ViewNames.NEW_ACCOUNT));
+	}
+	
+	@Test
+	public void create_InvalidPasswordLength() {
+		final Model model = createNiceMock(Model.class);
+		final NewUser newUser = new NewUser();
+		final BindingResult errors = createNiceMock(BindingResult.class);
+		final String username = "usename"; 
+		final String password = "pas"; //invalid length password
+		final String confirmPassword = password;
+		List<ObjectError> errorList = new ArrayList<ObjectError>();
+				
+		newUser.setUsername(username);
+		newUser.setPassword(password);
+		newUser.setConfirmPassword(confirmPassword);
+		
+		errorList.add(new ObjectError("password.invalid.length", "Password must be atleast 4 characters long"));
+		
+		expect(errors.hasErrors()).andReturn(true).anyTimes();		
+		expect(errors.getAllErrors()).andReturn(errorList).anyTimes();
+		replay(errors);
+		
+		String result = new String(newAccountController.create(newUser, errors, model, username, password));
+		errorList = errors.getAllErrors();
+
+		assertThat(errorList.size(), CoreMatchers.equalTo(1));
+		assertThat(errorList.get(0).getDefaultMessage(), CoreMatchers.equalTo("Password must be atleast 4 characters long"));
+		assertThat(result, CoreMatchers.equalTo(ViewNames.NEW_ACCOUNT));
+	}
+	
+	@Test
+	public void create_PasswordMismatchCaseOne() {
+		final Model model = createNiceMock(Model.class);
+		final NewUser newUser = new NewUser();
+		final BindingResult errors = createNiceMock(BindingResult.class);
+		final String username = "username"; 
+		final String password = "password";
+		final String confirmPassword = "passwor"; //confirm password not of same length as password
+		List<ObjectError> errorList = new ArrayList<ObjectError>();
+				
+		newUser.setUsername(username);
+		newUser.setPassword(password);
+		newUser.setConfirmPassword(confirmPassword);
+		
+		errorList.add(new ObjectError("confirmPassword.mismatch", "Password mismatch"));
+		
+		expect(errors.hasErrors()).andReturn(true).anyTimes();		
+		expect(errors.getAllErrors()).andReturn(errorList).anyTimes();
+		replay(errors);
+		
+		String result = new String(newAccountController.create(newUser, errors, model, username, password));
+		errorList = errors.getAllErrors();
+
+		assertThat(errorList.size(), CoreMatchers.equalTo(1));
+		assertThat(errorList.get(0).getDefaultMessage(), CoreMatchers.equalTo("Password mismatch"));
+		assertThat(result, CoreMatchers.equalTo(ViewNames.NEW_ACCOUNT));
+	}
+	
+	@Test
+	public void create_PasswordMismatchCaseTwo() {
+		final Model model = createNiceMock(Model.class);
+		final NewUser newUser = new NewUser();
+		final BindingResult errors = createNiceMock(BindingResult.class);
+		final String username = "username"; 
+		final String password = "password";
+		final String confirmPassword = "passwodr"; //confirm password mistyped
+		List<ObjectError> errorList = new ArrayList<ObjectError>();
+				
+		newUser.setUsername(username);
+		newUser.setPassword(password);
+		newUser.setConfirmPassword(confirmPassword);
+		
+		errorList.add(new ObjectError("confirmPassword.mismatch", "Password mismatch"));
+		
+		expect(errors.hasErrors()).andReturn(true).anyTimes();		
+		expect(errors.getAllErrors()).andReturn(errorList).anyTimes();
+		replay(errors);
+		
+		String result = new String(newAccountController.create(newUser, errors, model, username, password));
+		errorList = errors.getAllErrors();
+
+		assertThat(errorList.size(), CoreMatchers.equalTo(1));
+		assertThat(errorList.get(0).getDefaultMessage(), CoreMatchers.equalTo("Password mismatch"));
+		assertThat(result, CoreMatchers.equalTo(ViewNames.NEW_ACCOUNT));
+	}
+	
+	@Test
+	public void create_BlankFormSubmitted() {
+		final Model model = createNiceMock(Model.class);
+		final NewUser newUser = new NewUser();
+		final BindingResult errors = createNiceMock(BindingResult.class);
+		final String username = ""; //Username not specified
+		final String password = ""; //Password not specified
+		final String confirmPassword = ""; //Confirm password not specified
+		List<ObjectError> errorList = new ArrayList<ObjectError>();
+				
+		newUser.setUsername(username);
+		newUser.setPassword(password);
+		newUser.setConfirmPassword(confirmPassword);
+		
+		errorList.add(new ObjectError("username.required", "Username required"));
+		errorList.add(new ObjectError("password.required", "Password required"));
+		errorList.add(new ObjectError("confirmPassword.required", "Confirm password required"));
+		
+		expect(errors.hasErrors()).andReturn(true).anyTimes();		
+		expect(errors.getAllErrors()).andReturn(errorList).anyTimes();
+		replay(errors);
+		
+		String result = new String(newAccountController.create(newUser, errors, model, username, password));
+		errorList = errors.getAllErrors();
+
+		assertThat(errorList.size(), CoreMatchers.equalTo(3));
+		assertThat(errorList.get(0).getDefaultMessage(), CoreMatchers.equalTo("Username required"));
+		assertThat(errorList.get(1).getDefaultMessage(), CoreMatchers.equalTo("Password required"));
+		assertThat(errorList.get(2).getDefaultMessage(), CoreMatchers.equalTo("Confirm password required"));
+		assertThat(result, CoreMatchers.equalTo(ViewNames.NEW_ACCOUNT));
+	}
+	
+	@Test
+	public void create_ValidFormSubmitted() {
+		final Model model = createNiceMock(Model.class);
+		final NewUser newUser = new NewUser();
+		final BindingResult errors = createNiceMock(BindingResult.class);
+		final String username = "username"; //Username not specified
+		final String password = "password"; //Password not specified
+		final String confirmPassword = password; //Confirm password not specified
+		List<ObjectError> errorList = new ArrayList<ObjectError>();
+				
+		newUser.setUsername(username);
+		newUser.setPassword(password);
+		newUser.setConfirmPassword(confirmPassword);
+		
+		expect(errors.hasErrors()).andReturn(false).anyTimes();		
+		expect(errors.getAllErrors()).andReturn(errorList).anyTimes();
+		replay(errors);
+		
+		String result = new String(newAccountController.create(newUser, errors, model, username, password));
+		errorList = errors.getAllErrors();
+
+		assertThat(errorList.size(), CoreMatchers.equalTo(0));
+		assertThat(result, CoreMatchers.equalTo(ViewNames.REDIRECT));
+	}
 }
\ No newline at end of file