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
+
+
+
+ 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" %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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" %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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" %>
+
+
+
+
+
+
+
+
+
+
+
+ ${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