package de.randi2.core.integration.services;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import java.util.GregorianCalendar;
import java.util.List;
import javax.persistence.EntityTransaction;
import javax.validation.ConstraintViolationException;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.security.access.vote.AffirmativeBased;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.transaction.annotation.Transactional;
import de.randi2.dao.LoginDao;
import de.randi2.dao.TrialSiteDao;
import de.randi2.model.Login;
import de.randi2.model.Person;
import de.randi2.model.Role;
import de.randi2.model.TrialSite;
import de.randi2.services.UserService;
import de.randi2.testUtility.utility.DomainObjectFactory;
import de.randi2.testUtility.utility.TestStringUtil;
@Transactional
public class UserServiceTest extends AbstractServiceTest{
@Autowired private UserService userService;
@Autowired private DomainObjectFactory factory;
@Autowired private TestStringUtil stringUtil;
@Autowired private ApplicationContext context;
@Autowired private LoginDao loginDao;
@Autowired private TrialSiteDao trialSiteDao;
@Test
public void testInit(){
assertNotNull(userService);
}
//FIXME Create a test for the getAllRoles
@Test
public void testCreateRole(){
authenticatAsAdmin();
Role role = factory.getRole();
userService.createRole(role);
assertTrue(role.getId()>0);
}
@Test
public void testDeleteRole(){
assertTrue(true);
}
@Test
public void testPrepareInvestigator(){
userService.prepareInvestigator();
assertNotNull(SecurityContextHolder.getContext().getAuthentication().getPrincipal());
assertTrue(SecurityContextHolder.getContext().getAuthentication().getPrincipal() instanceof Login);
Login login = (Login)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
assertTrue(login.getRoles().contains(Role.ROLE_ANONYMOUS));
}
@Test
public void testRegister(){
authenticatAsAdmin();
TrialSite site = trialSiteDao.get(user.getPerson());
SecurityContextHolder.getContext().setAuthentication(null);
Login l = userService.prepareInvestigator();
l.setUsername(stringUtil.getWithLength(Login.MIN_USERNAME_LENGTH)+"@xyz.com");
l.setPassword(stringUtil.getWithLength(Login.MIN_PASSWORD_LENGTH)+".ada6");
l.setPerson(factory.getPerson());
l.getPerson().setLogin(l);
l.setLastLoggedIn(new GregorianCalendar());
userService.register(l, site);
assertTrue(l.getId()>0);
}
@Test
public void testCreate(){
authenticatAsAdmin();
TrialSite site = trialSiteDao.get(user.getPerson());
Login login = factory.getLogin();
userService.create(login, site);
assertTrue(login.getId()>0);
}
@Test
public void testUpdate(){
authenticatAsAdmin();
TrialSite site = trialSiteDao.get(user.getPerson());
Login login = factory.getLogin();
userService.create(login, site);
assertTrue(login.getId()>0);
String oldName = login.getUsername();
login.setUsername(factory.getPerson().getEmail());
userService.update(login);
Login login2 = entityManager.find(Login.class, login.getId());
assertEquals(login.getUsername(), login2.getUsername());
assertFalse(login2.getUsername().equals(oldName));
}
@Test
public void testUpdateRole(){
authenticatAsAdmin();
Role role = factory.getRole();
entityManager.persist(role);
assertTrue(role.getId()>0);
String oldName = role.getName();
role.setName(stringUtil.getWithLength(30));
userService.updateRole(role);
Role role2 = entityManager.find(Role.class,role.getId());
assertEquals(role.getName(), role2.getName());
assertFalse(role2.getName().equals(oldName));
}
@Test
public void testGetAll(){
authenticatAsAdmin();
TrialSite site = trialSiteDao.get(findLogin("admin@trialsite1.de").getPerson());
for(int i =0; i<10; i++){
Login login = factory.getLogin();
userService.create(login, site);
}
List<Login> list = userService.getAll();
assertTrue(list.size()>=10);
}
@Test
public void testGetObject(){
authenticatAsAdmin();
TrialSite site = trialSiteDao.get(user.getPerson());
((AffirmativeBased)context.getBean("methodAccessDecisionManager")).setAllowIfAllAbstainDecisions(true);
Login login = factory.getLogin();
userService.create(login, site);
Login login2 = findLogin("admin@trialsite1.de");
rolesAndRights.grantRights(login, site);
Login login3 = userService.getObject(login.getId());
assertTrue(login3 != null);
}
@Test
public void testSaveLoginWithPerson() {
authenticatAsAdmin();
TrialSite site = trialSiteDao.get(user.getPerson());
Person validPerson = factory.getPerson();
Login login = factory.getLogin();
userService.create(login, site);
assertTrue(login.getId()>0);
login = factory.getLogin();
login.setPerson(validPerson);
login.setUsername("");
try {
userService.create(login, site);
fail("should throw exception");
} catch (ConstraintViolationException e) {
}
}
}