package tudu.integration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import tudu.domain.*;
import tudu.service.TodoListsService;
import tudu.service.TodosService;
import tudu.service.UserAlreadyExistsException;
import tudu.service.UserService;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:/META-INF/spring/application-context-test.xml"})
public class IntegrationTest {
private final Log log = LogFactory.getLog(IntegrationTest.class);
@Autowired
private UserService userService;
@Autowired
private TodoListsService todoListsService;
@Autowired
private TodosService todosService;
@Autowired
private UserDetailsService userDetailsService;
@Autowired
@Qualifier("authenticationManager")
private AuthenticationManager authenticationManager;
@Test
@Transactional
public void createUser() {
try {
userService.findUser("test_user");
fail("User already exists in the database.");
} catch (ObjectRetrievalFailureException orfe) {
// User should not already exist in the database.
}
User user = new User();
user.setLogin("test_user");
user.setFirstName("First name");
user.setLastName("Last name");
user.setPassword("password");
user.setVerifyPassword("password");
try {
userService.createUser(user);
assertTrue(user.isEnabled());
assertNotNull(user.getCreationDate());
assertNotNull(user.getLastAccessDate());
assertEquals(1, user.getRoles().size());
Role testRole = user.getRoles().iterator().next();
assertEquals(RolesEnum.ROLE_USER.toString(), testRole.getRole());
assertEquals(1, user.getTodoLists().size());
TodoList testTodoList = user.getTodoLists().iterator().next();
assertNotNull(testTodoList.getLastUpdate());
assertEquals(1, testTodoList.getTodos().size());
} catch (UserAlreadyExistsException e) {
fail("User already exists in the database.");
}
try {
User userFoundInDatabase = userService.findUser("test_user");
assertEquals("First name", userFoundInDatabase.getFirstName());
assertEquals("Last name", userFoundInDatabase.getLastName());
} catch (ObjectRetrievalFailureException orfe) {
fail("User should have been found in the database.");
}
}
@Test
@Transactional
public void createTodoList() {
createAuthenticatedUser();
TodoList todoList = new TodoList();
todoList.setName("test_list");
assertEquals(1, userService.getCurrentUser().getTodoLists().size());
todoListsService.createTodoList(todoList);
assertEquals(1, todoList.getUsers().size());
assertEquals("test_user", todoList.getUsers().iterator().next()
.getLogin());
assertEquals(2, userService.getCurrentUser().getTodoLists().size());
TodoList todoListFromDatabase = todoListsService.findTodoList(todoList
.getListId());
assertEquals("test_list", todoListFromDatabase.getName());
}
@Test
@Transactional
public void testDeleteTodoList() {
createAuthenticatedUser();
TodoList todoList = new TodoList();
todoList.setName("test_list");
assertEquals(1, userService.getCurrentUser().getTodoLists().size());
todoListsService.createTodoList(todoList);
assertEquals(2, userService.getCurrentUser().getTodoLists().size());
todoListsService.deleteTodoList(todoList.getListId());
assertEquals(1, userService.getCurrentUser().getTodoLists().size());
try {
todoListsService.findTodoList(todoList.getListId());
fail("The todo list should have been deleted");
} catch (ObjectRetrievalFailureException orfe) {
// The todo list should not exist.
}
}
@Test
@Transactional
public void createTodo() {
createAuthenticatedUser();
TodoList todoList = new TodoList();
todoListsService.createTodoList(todoList);
Todo todo = new Todo();
todo.setDescription("test_todo");
todosService.createTodo(todoList.getListId(), todo);
assertNotNull(todo.getCreationDate());
assertEquals(1, todoList.getTodos().size());
}
@Test
@Transactional
public void deleteTodo() {
createAuthenticatedUser();
TodoList todoList = new TodoList();
todoList.setName("My List");
todoListsService.createTodoList(todoList);
assertEquals(0, todoList.getTodos().size());
Todo todo = new Todo();
todo.setDescription("test_todo");
todosService.createTodo(todoList.getListId(), todo);
assertNotNull(todosService.findTodo(todo.getTodoId()));
assertEquals(1, todoList.getTodos().size());
todosService.deleteTodo(todo);
TodoList todoList2 = todoListsService.findTodoList(todoList.getListId());
assertNull(todosService.findTodo(todo.getTodoId()));
assertEquals(0, todoList2.getTodos().size());
}
@Test
@Transactional
public void sharedList() {
createAuthenticatedUser();
User user2 = new User();
user2.setLogin("test_user2");
user2.setPassword("test_password");
try {
userService.createUser(user2);
} catch (UserAlreadyExistsException e) {
fail("User already exists in the database.");
}
TodoList todoList = new TodoList();
todoListsService.createTodoList(todoList);
todoListsService.addTodoListUser(todoList.getListId(), "test_user2");
assertEquals(2, todoList.getUsers().size());
assertEquals(2, user2.getTodoLists().size());
Todo todo = new Todo();
todo.setDescription("test_todo");
todosService.createTodo(todoList.getListId(), todo);
assertEquals(1, todoList.getTodos().size());
todoListsService.deleteTodoList(todoList.getListId());
assertEquals(1, userService.getCurrentUser().getTodoLists().size());
assertEquals(1, user2.getTodoLists().size());
}
/**
* Authenticate the current user using Acegi Security.
*/
private void createAuthenticatedUser() {
User user = new User();
user.setLogin("test_user");
user.setPassword("test_password");
user.setFirstName("Test");
user.setLastName("User");
try {
userService.createUser(user);
} catch (UserAlreadyExistsException e) {
fail("User already exists in the database.");
}
SecurityContextImpl secureContext = new SecurityContextImpl();
UserDetails userDetails = userDetailsService
.loadUserByUsername("test_user");
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
userDetails, "test_password");
authenticationManager.authenticate(token);
secureContext.setAuthentication(token);
SecurityContextHolder.setContext(secureContext);
}
}