package tudu.integration;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.context.SecurityContextImpl;
import org.springframework.security.providers.ProviderManager;
import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.security.userdetails.UserDetailsService;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import tudu.domain.RolesEnum;
import tudu.domain.model.Role;
import tudu.domain.model.Todo;
import tudu.domain.model.TodoList;
import tudu.domain.model.User;
import tudu.service.TodoListsManager;
import tudu.service.TodosManager;
import tudu.service.UserAlreadyExistsException;
import tudu.service.UserManager;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:/META-INF/spring/*.xml"})
public class IntegrationTest {
@Autowired
private UserManager userManager;
@Autowired
private TodoListsManager todoListsManager;
@Autowired
private TodosManager todosManager;
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private ProviderManager authenticationManager;
@Test
@Transactional
public void createUser() {
try {
userManager.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");
try {
userManager.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 = userManager.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, userManager.getCurrentUser().getTodoLists().size());
todoListsManager.createTodoList(todoList);
assertEquals(1, todoList.getUsers().size());
assertEquals("test_user", todoList.getUsers().iterator().next()
.getLogin());
assertEquals(2, userManager.getCurrentUser().getTodoLists().size());
TodoList todoListFromDatabase = todoListsManager.findTodoList(todoList
.getListId());
assertEquals("test_list", todoListFromDatabase.getName());
}
public void testDeleteTodoList() {
createAuthenticatedUser();
TodoList todoList = new TodoList();
todoList.setName("test_list");
assertEquals(1, userManager.getCurrentUser().getTodoLists().size());
todoListsManager.createTodoList(todoList);
assertEquals(2, userManager.getCurrentUser().getTodoLists().size());
todoListsManager.deleteTodoList(todoList.getListId());
assertEquals(1, userManager.getCurrentUser().getTodoLists().size());
try {
todoListsManager.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();
todoListsManager.createTodoList(todoList);
Todo todo = new Todo();
todo.setDescription("test_todo");
todosManager.createTodo(todoList.getListId(), todo);
assertNotNull(todo.getCreationDate());
assertEquals(1, todoList.getTodos().size());
}
@Test
@Transactional
public void deleteTodo() {
createAuthenticatedUser();
TodoList todoList = new TodoList();
todoListsManager.createTodoList(todoList);
Todo todo = new Todo();
todo.setDescription("test_todo");
todosManager.createTodo(todoList.getListId(), todo);
todosManager.deleteTodo(todo.getTodoId());
assertEquals(0, todoList.getTodos().size());
}
@Test
@Transactional
public void sharedList() {
createAuthenticatedUser();
User user2 = new User();
user2.setLogin("test_user2");
user2.setPassword("test_password");
try {
userManager.createUser(user2);
} catch (UserAlreadyExistsException e) {
fail("User already exists in the database.");
}
TodoList todoList = new TodoList();
todoListsManager.createTodoList(todoList);
todoListsManager.addTodoListUser(todoList.getListId(), "test_user2");
assertEquals(2, todoList.getUsers().size());
assertEquals(2, user2.getTodoLists().size());
Todo todo = new Todo();
todo.setDescription("test_todo");
todosManager.createTodo(todoList.getListId(), todo);
assertEquals(1, todoList.getTodos().size());
todoListsManager.deleteTodoList(todoList.getListId());
assertEquals(1, userManager.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");
try {
userManager.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.doAuthentication(token);
secureContext.setAuthentication(token);
SecurityContextHolder.setContext(secureContext);
}
}