diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b07e2ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.iml +.idea/ +src/main/webapp/META-INF/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8390815 --- /dev/null +++ b/pom.xml @@ -0,0 +1,141 @@ + + + + 4.0.0 + fr.plil.sio + spring-mvc-sample + war + 0.2 + + + + + org.springframework + spring-webmvc + ${spring.version} + + + + org.springframework + spring-web + ${spring.version} + + + + org.springframework + spring-context + ${spring.version} + + + + javax.servlet + javax.servlet-api + ${servlet.version} + provided + + + + javax.servlet.jsp + jsp-api + ${jsp.version} + provided + + + + javax.el + el-api + ${jsp.el.version} + provided + + + + javax.servlet + jstl + ${jsp.jstl.version} + + + + junit + junit + ${junit.version} + test + + + + org.springframework + spring-test + ${spring.version} + test + + + + org.slf4j + slf4j-api + ${slf4j.version} + compile + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + log4j-over-slf4j + ${slf4j.version} + + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + + + + org.slf4j + jul-to-slf4j + ${slf4j.version} + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + maven-war-plugin + + false + + 2.1.1 + + + spring-mvc-sample + + + + UTF-8 + 3.2.5.RELEASE + 1.7.5 + 4.10 + 1.0.13 + 3.1.0 + 2.2 + 2.2 + 1.2 + + + \ No newline at end of file diff --git a/src/main/java/fr/plil/sio/web/mvc/CheckUserInterceptor.java b/src/main/java/fr/plil/sio/web/mvc/CheckUserInterceptor.java new file mode 100644 index 0000000..fafeee3 --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/CheckUserInterceptor.java @@ -0,0 +1,44 @@ +package fr.plil.sio.web.mvc; + +import java.io.IOException;import javax.annotation.Resource; +; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +public class CheckUserInterceptor extends HandlerInterceptorAdapter { + + private static final Logger logger = LoggerFactory.getLogger(CheckUserInterceptor.class); + + @Resource + private UserSession userSession; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, + Object handler) throws IOException { + + logger.debug("path info: " + request.getPathInfo()); + + if (request.getPathInfo().equals("/login")) { + logger.debug("access granted as path is /login"); + return true; + } + + String username = userSession.getUsername(); + + if (username != null) { + logger.debug("authenticated"); + return true; + } else { + logger.debug("not authenticated"); + response.sendRedirect("login"); + return false; + } + } + + void setUserSession(UserSession userSession) { + this.userSession = userSession; + } +} diff --git a/src/main/java/fr/plil/sio/web/mvc/LoginController.java b/src/main/java/fr/plil/sio/web/mvc/LoginController.java new file mode 100644 index 0000000..61d6e37 --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/LoginController.java @@ -0,0 +1,51 @@ +package fr.plil.sio.web.mvc; + +import javax.annotation.Resource; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +@Controller +public class LoginController { + + @Resource + private UserDao userDao; + + @Resource + private UserSession userSession; + + @RequestMapping(value = "/login", method = RequestMethod.GET) + public ModelAndView getLoginForm() { + return new ModelAndView("login", "user", new User()); + } + + @RequestMapping(value = "/login", method = RequestMethod.POST) + public String postLoginCheck(User user, BindingResult result) { + + User userFromDao = userDao.getFromUsername(user.getUsername()); + + if (userFromDao == null) { + result.rejectValue("username","login.form.invalid"); + return "login"; + } + + if(!userFromDao.getPassword().equals(user.getPassword())) { + result.rejectValue("username","login.form.invalid"); + return "login"; + } + + userSession.setUsername(userFromDao.getUsername()); + + return "redirect:/"; + } + + public void setUserDao(UserDao userDao) { + this.userDao = userDao; + } + + public void setUserSession(UserSession userSession) { + this.userSession = userSession; + } +} \ No newline at end of file diff --git a/src/main/java/fr/plil/sio/web/mvc/LogoutController.java b/src/main/java/fr/plil/sio/web/mvc/LogoutController.java new file mode 100644 index 0000000..16235a0 --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/LogoutController.java @@ -0,0 +1,23 @@ +package fr.plil.sio.web.mvc; + +import javax.annotation.Resource; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +public class LogoutController { + + @Resource + private UserSession userSession; + + @RequestMapping(value = {"/logout"}, method = RequestMethod.GET) + public String getLogout() { + userSession.setUsername(null); + return "redirect:/"; + } + + public void setUserSession(UserSession userSession) { + this.userSession = userSession; + } +} diff --git a/src/main/java/fr/plil/sio/web/mvc/NewUserController.java b/src/main/java/fr/plil/sio/web/mvc/NewUserController.java new file mode 100644 index 0000000..8576505 --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/NewUserController.java @@ -0,0 +1,60 @@ +package fr.plil.sio.web.mvc; + +import javax.annotation.Resource; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +@Controller +public class NewUserController { + + @Resource + private UserDao userDao; + @Resource + private UserSession userSession; + @Resource + private UserValidator userValidator; + + @RequestMapping(value = {"/newUser"}, method = RequestMethod.GET) + public ModelAndView getNewUserForm() { + return new ModelAndView("newUser", "user", new User()); + } + + @RequestMapping(value = {"/newUser"}, method = RequestMethod.POST) + public String postNewUser(User user, BindingResult result) { + + if (!userSession.getUsername().equals("admin")) { + result.rejectValue("username", "new.user.only.admin"); + } + + userValidator.validate(user, result); + + boolean present = (userDao.getFromUsername(user.getUsername()) != null); + + if (present) { + result.rejectValue("username", "new.user.form.present"); + } + + if(result.hasErrors()) { + return "newUser"; + } + + userDao.save(user); + + return "redirect:/"; + } + + public void setUserDao(UserDao userDao) { + this.userDao = userDao; + } + + public void setUserSession(UserSession userSession) { + this.userSession = userSession; + } + + public void setUserValidator(UserValidator userValidator) { + this.userValidator = userValidator; + } +} diff --git a/src/main/java/fr/plil/sio/web/mvc/User.java b/src/main/java/fr/plil/sio/web/mvc/User.java new file mode 100644 index 0000000..da993b3 --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/User.java @@ -0,0 +1,42 @@ +package fr.plil.sio.web.mvc; + +public class User { + + private String username; + private String password; + + 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; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final User other = (User) obj; + return !((this.username == null) ? (other.username != null) : !this.username.equals(other.username)); + } + + @Override + public int hashCode() { + int hash = 7; + hash = 29 * hash + (this.username != null ? this.username.hashCode() : 0); + return hash; + } +} diff --git a/src/main/java/fr/plil/sio/web/mvc/UserDao.java b/src/main/java/fr/plil/sio/web/mvc/UserDao.java new file mode 100644 index 0000000..9fb32d1 --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/UserDao.java @@ -0,0 +1,16 @@ +package fr.plil.sio.web.mvc; + +import java.util.Set; + +public interface UserDao { + + boolean save(User user); + + User getFromUsername(String username); + + Set getAllUsers(); + + boolean update(User user); + + boolean delete(User user); +} diff --git a/src/main/java/fr/plil/sio/web/mvc/UserDaoImpl.java b/src/main/java/fr/plil/sio/web/mvc/UserDaoImpl.java new file mode 100644 index 0000000..313d294 --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/UserDaoImpl.java @@ -0,0 +1,48 @@ +package fr.plil.sio.web.mvc; + +import java.util.HashSet; +import java.util.Set; +import org.springframework.stereotype.Repository; + +@Repository(value = "userDao") +public class UserDaoImpl implements UserDao { + + private Set users = new HashSet(); + + public UserDaoImpl() { + User user = new User(); + user.setUsername("admin"); + user.setPassword("admin"); + users.add(user); + } + + @Override + public boolean save(User user) { + return users.add(user); + } + + @Override + public User getFromUsername(String username) { + for (User user : users) { + if (user.getUsername().equals(username)) { + return user; + } + } + return null; + } + + @Override + public Set getAllUsers() { + return users; + } + + @Override + public boolean update(User user) { + throw new UnsupportedOperationException("Not supported."); + } + + @Override + public boolean delete(User user) { + throw new UnsupportedOperationException("Not supported."); + } +} diff --git a/src/main/java/fr/plil/sio/web/mvc/UserSession.java b/src/main/java/fr/plil/sio/web/mvc/UserSession.java new file mode 100644 index 0000000..0d7c99a --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/UserSession.java @@ -0,0 +1,17 @@ +package fr.plil.sio.web.mvc; + +import java.io.Serializable; +import org.springframework.stereotype.Component; + +public class UserSession implements Serializable { + + private String username; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } +} diff --git a/src/main/java/fr/plil/sio/web/mvc/UserValidator.java b/src/main/java/fr/plil/sio/web/mvc/UserValidator.java new file mode 100644 index 0000000..d8d1b08 --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/UserValidator.java @@ -0,0 +1,28 @@ +package fr.plil.sio.web.mvc; + +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; + +@Component +public class UserValidator implements Validator { + + @Override + public boolean supports(Class clazz) { + return User.class.equals(clazz); + } + + @Override + public void validate(Object target, Errors errors) { + User user = (User)target; + + if (user.getUsername().length() < 3) { + errors.rejectValue("username", "validator.user.username.minimal.size"); + } + + if (user.getPassword().length() < 3) { + errors.rejectValue("password", "validator.user.password.minimal.size"); + } + } + +} diff --git a/src/main/java/fr/plil/sio/web/mvc/ViewUsersController.java b/src/main/java/fr/plil/sio/web/mvc/ViewUsersController.java new file mode 100644 index 0000000..7edadbf --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/ViewUsersController.java @@ -0,0 +1,41 @@ +package fr.plil.sio.web.mvc; + +import java.util.Set; +import javax.annotation.Resource; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +public class ViewUsersController { + + @Resource + private UserDao userDao; + + @Resource + private UserSession userSession; + + @ModelAttribute("users") + public Set populateUsers() { + return userDao.getAllUsers(); + } + + @ModelAttribute("userSession") + public UserSession populateUser() { + return userSession; + } + + @RequestMapping(value={"/"},method=RequestMethod.GET) + public String getViewUsers() { + return "viewUsers"; + } + + public void setUserDao(UserDao userDao) { + this.userDao = userDao; + } + + public void setUserSession(UserSession userSession) { + this.userSession = userSession; + } +} diff --git a/src/main/java/fr/plil/sio/web/mvc/WebAppConfig.java b/src/main/java/fr/plil/sio/web/mvc/WebAppConfig.java new file mode 100644 index 0000000..f313578 --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/WebAppConfig.java @@ -0,0 +1,62 @@ +package fr.plil.sio.web.mvc; + +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.context.support.ResourceBundleMessageSource; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import org.springframework.web.servlet.view.InternalResourceViewResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; + +@EnableWebMvc +@ComponentScan(basePackages = {"fr.plil.sio.web.mvc"}, scopedProxy = ScopedProxyMode.TARGET_CLASS) +@Configuration +public class WebAppConfig extends WebMvcConfigurationSupport { + + @Bean + @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) + public UserSession userSession() { + return new UserSession(); + } + + @Bean + public CheckUserInterceptor checkUserInterceptor() { + return new CheckUserInterceptor(); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + CheckUserInterceptor interceptor = checkUserInterceptor(); + interceptor.setUserSession(userSession()); + registry.addInterceptor(interceptor); + } + + @Bean + public MessageSource messageSource() { + ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); + messageSource.setBasename("messages"); + return messageSource; + } + + @Bean + public ViewResolver viewResolver() { + InternalResourceViewResolver resolver = new InternalResourceViewResolver(); + resolver.setPrefix("/WEB-INF/jsp/"); + resolver.setSuffix(".jsp"); + return resolver; + } + + @Bean + public RequestMappingHandlerMapping requestMappingHandlerMapping() { + RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping(); + handlerMapping.setUseSuffixPatternMatch(false); + handlerMapping.setUseTrailingSlashMatch(false); + return handlerMapping; + } +} diff --git a/src/main/java/fr/plil/sio/web/mvc/WebAppInitializer.java b/src/main/java/fr/plil/sio/web/mvc/WebAppInitializer.java new file mode 100644 index 0000000..87399fd --- /dev/null +++ b/src/main/java/fr/plil/sio/web/mvc/WebAppInitializer.java @@ -0,0 +1,28 @@ +package fr.plil.sio.web.mvc; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.servlet.DispatcherServlet; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.WebApplicationContext; + +public class WebAppInitializer implements WebApplicationInitializer { + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + WebApplicationContext context = getContext(); + servletContext.addListener(new ContextLoaderListener(context)); + ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context)); + dispatcher.setLoadOnStartup(1); + dispatcher.addMapping("/*"); + } + + private AnnotationConfigWebApplicationContext getContext() { + AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); + context.register(WebAppConfig.class); + return context; + } +} diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties new file mode 100644 index 0000000..f5cd2b0 --- /dev/null +++ b/src/main/resources/messages.properties @@ -0,0 +1,21 @@ +domain.user.username=Username +domain.user.password=Password + +validator.user.username.minimal.size=Username must be at least 3 characters +validator.user.password.minimal.size=Password must be at least 3 characters + +login.page.title=Login Page +login.main.header=Please login... +login.form.submit=login +login.form.invalid=Invalid username and/or password + +view.users.page.title=User List +view.users.main.header=List of users +view.users.greetings=Hello +view.users.main.logout=Logout + +new.user.page.title=New user +new.user.main.header=Add a new user +new.user.form.submit=Add the user +new.user.only.admin=Only administrator user can do it +new.user.form.present=user already present \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/login.jsp b/src/main/webapp/WEB-INF/jsp/login.jsp new file mode 100644 index 0000000..200c55a --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/login.jsp @@ -0,0 +1,33 @@ +<%@ page contentType="text/html" pageEncoding="UTF-8" %> +<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> + + + + + + + <spring:message code="login.page.title"/> + + +

+ + + + + + + + + + + + + + + +
"/>
+
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/newUser.jsp b/src/main/webapp/WEB-INF/jsp/newUser.jsp new file mode 100644 index 0000000..200ffcf --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/newUser.jsp @@ -0,0 +1,36 @@ +<%@ page contentType="text/html" pageEncoding="UTF-8" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> +<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> + + + + + + + <spring:message code="new.user.page.title"/> + + +

+ + + + + + + + + + + + + + + + + + +
"/>
+
+ + diff --git a/src/main/webapp/WEB-INF/jsp/viewUsers.jsp b/src/main/webapp/WEB-INF/jsp/viewUsers.jsp new file mode 100644 index 0000000..81b28b1 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/viewUsers.jsp @@ -0,0 +1,39 @@ +<%@ page contentType="text/html" pageEncoding="UTF-8" %> +<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + + <spring:message code="view.users.page.title"/> + + +

+ +

${userSession.username} !

+ + + + + + + + + + + + + + +
${user.username}
+ +
    +
  • +
  • +
+ + + diff --git a/src/test/java/fr/plil/sio/web/mvc/CheckUserInterceptorTest.java b/src/test/java/fr/plil/sio/web/mvc/CheckUserInterceptorTest.java new file mode 100644 index 0000000..f16f13a --- /dev/null +++ b/src/test/java/fr/plil/sio/web/mvc/CheckUserInterceptorTest.java @@ -0,0 +1,45 @@ +package fr.plil.sio.web.mvc; + +import java.io.IOException; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; + +public class CheckUserInterceptorTest { + + private CheckUserInterceptor interceptor; + private UserSession userSession; + private MockHttpServletRequest request; + private MockHttpServletResponse response; + + @Before + public void createInstances() { + interceptor = new CheckUserInterceptor(); + userSession = new UserSession(); + interceptor.setUserSession(userSession); + request = new MockHttpServletRequest(); + response = new MockHttpServletResponse(); + } + + @Test + public void checkPreHandleServletPathIsLogin() throws IOException { + request.setPathInfo("/login"); + assertTrue(interceptor.preHandle(request, response, null)); + } + + @Test + public void checkPreHandleUsernameInSession() throws IOException { + userSession.setUsername("admin"); + request.setPathInfo("/blabla"); + assertTrue(interceptor.preHandle(request, response, null)); + } + + @Test + public void checkPreHandleUsernameNotInSession() throws IOException { + request.setPathInfo("/blabla"); + assertFalse(interceptor.preHandle(request, response, null)); + assertEquals(response.getRedirectedUrl(),"login"); + } +} diff --git a/src/test/java/fr/plil/sio/web/mvc/LoginControllerTest.java b/src/test/java/fr/plil/sio/web/mvc/LoginControllerTest.java new file mode 100644 index 0000000..c92f8db --- /dev/null +++ b/src/test/java/fr/plil/sio/web/mvc/LoginControllerTest.java @@ -0,0 +1,55 @@ +package fr.plil.sio.web.mvc; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import org.springframework.validation.BeanPropertyBindingResult; +import org.springframework.validation.BindingResult; +import org.springframework.web.servlet.ModelAndView; + +public class LoginControllerTest { + + private LoginController loginController; + private BindingResult results; + private User user; + private UserDao userDao; + private UserSession userSession; + + @Before + public void createInstances() { + loginController = new LoginController(); + user = new User(); + results = new BeanPropertyBindingResult(user, "user"); + userDao = new UserDaoImpl(); + loginController.setUserDao(userDao); + userSession = new UserSession(); + loginController.setUserSession(userSession); + } + + @Test + public void testGetLoginForm() { + ModelAndView mav = loginController.getLoginForm(); + assertEquals("login", mav.getViewName()); + assertEquals(1, mav.getModelMap().size()); + assertTrue(mav.getModel().containsKey("user")); + assertTrue(mav.getModel().get("user") instanceof User); + } + + @Test + public void testPostLoginCheckSucceed() { + user.setUsername("admin"); + user.setPassword("admin"); + String view = loginController.postLoginCheck(user, results); + assertFalse(results.hasErrors()); + assertEquals("redirect:/",view); + } + + @Test + public void testPostLoginCheckFailed() { + user.setUsername("abc"); + user.setPassword("abc"); + String view = loginController.postLoginCheck(user, results); + assertTrue(results.hasErrors()); + assertEquals("login",view); + } +} diff --git a/src/test/java/fr/plil/sio/web/mvc/LogoutControllerTest.java b/src/test/java/fr/plil/sio/web/mvc/LogoutControllerTest.java new file mode 100644 index 0000000..04e24ff --- /dev/null +++ b/src/test/java/fr/plil/sio/web/mvc/LogoutControllerTest.java @@ -0,0 +1,18 @@ +package fr.plil.sio.web.mvc; + +import static org.junit.Assert.*; +import org.junit.Test; + +public class LogoutControllerTest { + + @Test + public void testGetLogout() { + LogoutController logoutController = new LogoutController(); + UserSession userSession = new UserSession(); + userSession.setUsername("blabla"); + logoutController.setUserSession(userSession); + String view = logoutController.getLogout(); + assertNull(userSession.getUsername()); + assertEquals("redirect:/",view); + } +} diff --git a/src/test/java/fr/plil/sio/web/mvc/NewUserControllerTest.java b/src/test/java/fr/plil/sio/web/mvc/NewUserControllerTest.java new file mode 100644 index 0000000..3a9707a --- /dev/null +++ b/src/test/java/fr/plil/sio/web/mvc/NewUserControllerTest.java @@ -0,0 +1,78 @@ +package fr.plil.sio.web.mvc; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import org.springframework.validation.BeanPropertyBindingResult; +import org.springframework.validation.BindingResult; +import org.springframework.web.servlet.ModelAndView; + +public class NewUserControllerTest { + + private NewUserController newUserController; + private BindingResult results; + private User user; + private UserDao userDao; + private UserSession userSession; + private UserValidator userValidator; + + @Before + public void createInstances() { + newUserController = new NewUserController(); + user = new User(); + results = new BeanPropertyBindingResult(user, "user"); + userDao = new UserDaoImpl(); + newUserController.setUserDao(userDao); + userSession = new UserSession(); + userSession.setUsername("admin"); + newUserController.setUserSession(userSession); + userValidator = new UserValidator(); + newUserController.setUserValidator(userValidator); + } + + @Test + public void testGetNewUserForm() { + ModelAndView mav = newUserController.getNewUserForm(); + assertEquals("newUser", mav.getViewName()); + assertEquals(1, mav.getModelMap().size()); + assertTrue(mav.getModel().containsKey("user")); + assertTrue(mav.getModel().get("user") instanceof User); + } + + @Test + public void testPostNewUserSucceed() { + user.setUsername("abc"); + user.setPassword("abc"); + String view = newUserController.postNewUser(user, results); + assertFalse(results.hasErrors()); + assertEquals("redirect:/",view); + } + + @Test + public void testPostNewUserFailedNotAdmin() { + user.setUsername("abc"); + user.setPassword("abc"); + userSession.setUsername("blabla"); + String view = newUserController.postNewUser(user, results); + assertTrue(results.hasErrors()); + assertEquals("newUser",view); + } + + @Test + public void testPostNewUserFailedValidate() { + user.setUsername("a"); + user.setPassword("abc"); + String view = newUserController.postNewUser(user, results); + assertTrue(results.hasErrors()); + assertEquals("newUser",view); + } + + @Test + public void testPostNewUserFailedAlreadyPresent() { + user.setUsername("admin"); + user.setPassword("blabla"); + String view = newUserController.postNewUser(user, results); + assertTrue(results.hasErrors()); + assertEquals("newUser",view); + } +} diff --git a/src/test/java/fr/plil/sio/web/mvc/UserDaoTest.java b/src/test/java/fr/plil/sio/web/mvc/UserDaoTest.java new file mode 100644 index 0000000..2cdeb1c --- /dev/null +++ b/src/test/java/fr/plil/sio/web/mvc/UserDaoTest.java @@ -0,0 +1,63 @@ +package fr.plil.sio.web.mvc; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; + +public class UserDaoTest { + + private UserDao userDao; + + @Before + public void createInstances() { + userDao = new UserDaoImpl(); + } + + @Test + public void testAdminPresent() { + assertEquals(1, userDao.getAllUsers().size()); + assertNotNull(userDao.getFromUsername("admin")); + assertEquals("admin", userDao.getFromUsername("admin").getUsername()); + } + + @Test + public void testSaveSucceed() { + User user = new User(); + user.setUsername("abc"); + user.setPassword("abc"); + assertTrue(userDao.save(user)); + } + + @Test + public void testSaveFailed() { + User user = new User(); + user.setUsername("admin"); + user.setPassword("abc"); + assertFalse(userDao.save(user)); + } + + @Test + public void testGetFromUsernameFound() { + User user = new User(); + user.setUsername("abc"); + user.setPassword("abc"); + userDao.save(user); + assertNotNull(userDao.getFromUsername("admin")); + assertEquals("admin",userDao.getFromUsername("admin").getUsername()); + } + + @Test + public void testGetFromUsernameNotFound() { + assertNull(userDao.getFromUsername("abc")); + } + + @Test + public void testGetAllUsers() { + assertEquals(1,userDao.getAllUsers().size()); + User user = new User(); + user.setUsername("abc"); + user.setPassword("abc"); + assertTrue(userDao.save(user)); + assertEquals(2,userDao.getAllUsers().size()); + } +} \ No newline at end of file diff --git a/src/test/java/fr/plil/sio/web/mvc/UserValidatorTest.java b/src/test/java/fr/plil/sio/web/mvc/UserValidatorTest.java new file mode 100644 index 0000000..e1344c8 --- /dev/null +++ b/src/test/java/fr/plil/sio/web/mvc/UserValidatorTest.java @@ -0,0 +1,48 @@ +package fr.plil.sio.web.mvc; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import org.springframework.validation.BeanPropertyBindingResult; +import org.springframework.validation.Errors; + +public class UserValidatorTest { + + private User user; + private UserValidator validator; + private Errors results; + + @Before + public void createInstances() { + validator = new UserValidator(); + user = new User(); + user.setUsername("abc"); + user.setPassword("abc"); + results = new BeanPropertyBindingResult(user, "user"); + } + + @Test + public void testSupports() { + assertTrue(validator.supports(User.class)); + } + + @Test + public void testValidateCorrect() { + validator.validate(user,results); + assertFalse(results.hasErrors()); + } + + @Test + public void testValidatePasswordTooShort() { + user.setPassword("ab"); + validator.validate(user,results); + assertTrue(results.hasErrors()); + } + + @Test + public void testValidateUsernameTooShort() { + user.setUsername("ab"); + validator.validate(user,results); + assertTrue(results.hasErrors()); + } +} diff --git a/src/test/java/fr/plil/sio/web/mvc/ViewUsersControllerTest.java b/src/test/java/fr/plil/sio/web/mvc/ViewUsersControllerTest.java new file mode 100644 index 0000000..cd599ca --- /dev/null +++ b/src/test/java/fr/plil/sio/web/mvc/ViewUsersControllerTest.java @@ -0,0 +1,37 @@ +package fr.plil.sio.web.mvc; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; + +public class ViewUsersControllerTest { + + private ViewUsersController viewUsersController; + private UserDao userDao; + private UserSession userSession; + + @Before + public void createInstances() { + viewUsersController = new ViewUsersController(); + userDao = new UserDaoImpl(); + viewUsersController.setUserDao(userDao); + userSession = new UserSession(); + userSession.setUsername("admin"); + viewUsersController.setUserSession(userSession); + } + + @Test + public void testPopulateUsers() { + assertEquals(1, viewUsersController.populateUsers().size()); + } + + @Test + public void testPopulateUser() { + assertEquals("admin", viewUsersController.populateUser().getUsername()); + } + + @Test + public void testGetViewUsers() { + assertEquals("viewUsers",viewUsersController.getViewUsers()); + } +} -- libgit2 0.21.2