package de.randi2.core.integration.modelDatabase;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import de.randi2.model.AbstractDomainObject;
import de.randi2.model.Login;
import de.randi2.model.Person;
import de.randi2.model.Role;
import de.randi2.model.TrialSite;
import de.randi2.testUtility.utility.AbstractDomainDatabaseTest;
@Transactional
public class LoginDatabaseTest extends AbstractDomainDatabaseTest<Login> {
private Login validLogin;
public LoginDatabaseTest() {
super(Login.class);
}
@Before
public void setUp(){
super.setUp();
validLogin = factory.getLogin();
}
@Test
public void testPerson(){
Person p = factory.getPerson();
validLogin.setPerson(p);
assertNotNull(validLogin.getPerson());
entityManager.persist(validLogin);
Login l = entityManager.find(Login.class, validLogin.getId());
assertNotNull(l);
assertEquals(validLogin.getUsername(), l.getUsername());
assertNotNull(l.getPerson());
assertEquals(validLogin.getPerson().getId(), l.getPerson().getId());
}
@Test
public void testLocale(){
validLogin.setPrefLocale(Locale.GERMAN);
assertEquals(Locale.GERMAN, validLogin.getPrefLocale());
entityManager.persist(validLogin);
assertTrue(validLogin.getId()!=AbstractDomainObject.NOT_YET_SAVED_ID);
Login l = entityManager.find(Login.class, validLogin.getId());
assertEquals(validLogin.getId(), l.getId());
assertEquals(Locale.GERMAN, l.getPrefLocale());
}
@Test
public void testRole(){
initializeRoles();
validLogin.addRole(Role.ROLE_ADMIN);
entityManager.persist(validLogin);
entityManager.flush();
entityManager.clear();
assertTrue(validLogin.getId()!=AbstractDomainObject.NOT_YET_SAVED_ID);
Login l = entityManager.find(Login.class, validLogin.getId());
assertEquals(validLogin.getId(), l.getId());
assertEquals(2, l.getRoles().size());
assertTrue(l.getRoles().contains(Role.ROLE_USER));
assertTrue(l.getRoles().contains(Role.ROLE_ADMIN));
l.addRole(Role.ROLE_INVESTIGATOR);
entityManager.merge(l);
entityManager.flush();
entityManager.clear();
Login l1 = entityManager.find(Login.class, validLogin.getId());
assertEquals(validLogin.getId(), l.getId());
assertEquals(3, l1.getRoles().size());
assertTrue(l1.getRoles().contains(Role.ROLE_USER));
assertTrue(l1.getRoles().contains(Role.ROLE_ADMIN));
assertTrue(l1.getRoles().contains(Role.ROLE_INVESTIGATOR));
l1.removeRole(Role.ROLE_ADMIN);
entityManager.merge(l1);
entityManager.flush();
entityManager.clear();
Login l2 = entityManager.find(Login.class, validLogin.getId());
assertEquals(validLogin.getId(), l.getId());
assertEquals(2, l2.getRoles().size());
assertTrue(l2.getRoles().contains(Role.ROLE_USER));
assertTrue(l2.getRoles().contains(Role.ROLE_INVESTIGATOR));
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
private void initializeRoles(){
entityManager.persist(Role.ROLE_INVESTIGATOR);
entityManager.persist(Role.ROLE_USER);
entityManager.persist(Role.ROLE_STATISTICAN);
entityManager.persist(Role.ROLE_MONITOR);
entityManager.persist(
Role.ROLE_P_INVESTIGATOR);
entityManager.persist(Role.ROLE_ANONYMOUS);
entityManager.persist(Role.ROLE_ADMIN);
}
@Test
public void databaseIntegrationTest() {
validLogin.setLockTime(new GregorianCalendar());
validLogin.setNumberWrongLogins(Login.MAX_WRONG_LOGINS);
validLogin.setPrefLocale(Locale.ENGLISH);
GregorianCalendar dateL = new GregorianCalendar(2008,2,1);
validLogin.setLastLoggedIn(dateL);
entityManager.persist(validLogin);
entityManager.flush();
assertTrue(validLogin.getId()>0);
Login login = entityManager.find(Login.class, validLogin.getId());
assertEquals(validLogin.getId(), login.getId());
// FIXME: Clear out
//assertEquals(Arrays.asList(validLogin.getAuthorities()), Arrays.asList(login.getAuthorities()));
//FIXME: Depends on the SaveOrUpdate Listener
// assertNotNull(login.getCreatedAt());
// assertNotNull(login.getUpdatedAt());
assertEquals(validLogin.getUsername(), login.getUsername());
assertEquals(validLogin.getPrefLocale(), login.getPrefLocale());
assertEquals(validLogin.getUIName(), login.getUIName());
assertEquals(validLogin.getRoles(), login.getRoles());
assertEquals(validLogin.getNumberWrongLogins(), login.getNumberWrongLogins());
// FIXME in test with mysql it is a difference of nearly 1 second
// assertEquals(validLogin.getLockTime(), login.getLockTime());
assertEquals(validLogin.getPerson().getId(), login.getPerson().getId());
}
@Test
@Ignore
public void namedQueryAllLoginsWithRolesAndNotTrialSiteScopeTest(){
fail();
}
@Test
@Ignore
public void namedQueryLoginsWriteOtherUserTest(){
fail();
}
@Test
@Ignore
public void namedQueryLoginsWithPermissionTest(){
fail();
}
@Test
public void namedQueryAllLoginsWithSpecificRoleTest(){
/*
* generate test data
* 10 Logins with 2 roles
*/
List<Login> logins = new ArrayList<Login>();
for(int i =0; i<10;i++){
logins.add(factory.getLogin());
entityManager.persist(logins.get(i));
}
Role role1 = new Role("ROLE_Name1", false, false, false, false, false,
true, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false,
false, false, false, false, false, null);
entityManager.persist(role1);
Role role2 = new Role("ROLE_Name2", false, false, false, false, false,
true, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false,
false, false, false, false, false, null);
entityManager.persist(role2);
//Logins
logins.get(0).getRoles().add(role1);
logins.get(1).getRoles().add(role1);
logins.get(2).getRoles().add(role2);
logins.get(3).getRoles().add(role2);
logins.get(4).getRoles().add(role1);//login 4 has two roles
logins.get(4).getRoles().add(role2);
//Logins
logins.get(5).getRoles().add(role1);
logins.get(6).getRoles().add(role1);
logins.get(7).getRoles().add(role2);
logins.get(8).getRoles().add(role2);
logins.get(9).getRoles().add(role1);//login 9 has two roles
logins.get(9).getRoles().add(role2);
for(Login l: logins){
l = entityManager.merge(l);
}
//Flush session and clear the entity manager
entityManager.flush();
entityManager.clear();
//Test named query
List<Login> result = entityManager.createNamedQuery("login.AllLoginsWithSpecificRole").setParameter(1, role1.getId()).getResultList();
assertEquals(6, result.size());
assertTrue(result.contains(logins.get(0)));
assertTrue(result.contains(logins.get(1)));
assertTrue(result.contains(logins.get(4)));
assertTrue(result.contains(logins.get(5)));
assertTrue(result.contains(logins.get(6)));
assertTrue(result.contains(logins.get(9)));
result = entityManager.createNamedQuery("login.AllLoginsWithSpecificRole").setParameter(1, role2.getId()).getResultList();
assertEquals(6, result.size());
assertTrue(result.contains(logins.get(2)));
assertTrue(result.contains(logins.get(3)));
assertTrue(result.contains(logins.get(4)));
assertTrue(result.contains(logins.get(7)));
assertTrue(result.contains(logins.get(8)));
assertTrue(result.contains(logins.get(9)));
}
@Test
@Ignore(value="different behaviour if only the test class is executed")
public void namedQueryAllLoginsWithSpecificRoleAndTrialSiteTest(){
/*
* generate test data
* 10 Logins in two trial sites with 2 roles
* the first 5 logins in site1 the other in site2
*/
List<Login> logins = new ArrayList<Login>();
for(int i =0; i<10;i++){
logins.add(factory.getLogin());
entityManager.persist(logins.get(i));
}
TrialSite site1 = factory.getTrialSite();
entityManager.persist(site1);
TrialSite site2 = factory.getTrialSite();
entityManager.persist(site2);
Role role1 = new Role("ROLE_Name1", false, false, false, false, false,
true, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false,
false, false, false, false, false, null);
entityManager.persist(role1);
Role role2 = new Role("ROLE_Name2", false, false, false, false, false,
true, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false,
false, false, false, false, false, null);
entityManager.persist(role2);
for(int i=0;i< logins.size();i++){
if(i<5){
site1.getMembers().add(logins.get(i).getPerson());
}else{
site2.getMembers().add(logins.get(i).getPerson());
}
}
site1 = entityManager.merge(site1);
site2 = entityManager.merge(site2);
//Logins site1
logins.get(0).getRoles().add(role1);
logins.get(1).getRoles().add(role1);
logins.get(2).getRoles().add(role2);
logins.get(3).getRoles().add(role2);
logins.get(4).getRoles().add(role1);//login 4 has two roles
logins.get(4).getRoles().add(role2);
//Logins site2
logins.get(5).getRoles().add(role1);
logins.get(6).getRoles().add(role1);
logins.get(7).getRoles().add(role2);
logins.get(8).getRoles().add(role2);
logins.get(9).getRoles().add(role1);//login 9 has two roles
logins.get(9).getRoles().add(role2);
for(Login l: logins){
l = entityManager.merge(l);
}
//Flush session and clear the entity manager
entityManager.flush();
entityManager.clear();
//Test named query
List<Login> result = entityManager.createNamedQuery("login.AllLoginsWithSpecificRoleAndTrialSite").setParameter(1, role1.getId()).setParameter(2, site1.getId()).getResultList();
assertEquals(3, result.size());
assertTrue(result.contains(logins.get(0)));
assertTrue(result.contains(logins.get(1)));
assertTrue(result.contains(logins.get(4)));
result = entityManager.createNamedQuery("login.AllLoginsWithSpecificRoleAndTrialSite").setParameter(1, role2.getId()).setParameter(2, site1.getId()).getResultList();
assertEquals(3, result.size());
assertTrue(result.contains(logins.get(2)));
assertTrue(result.contains(logins.get(3)));
assertTrue(result.contains(logins.get(4)));
result = entityManager.createNamedQuery("login.AllLoginsWithSpecificRoleAndTrialSite").setParameter(1, role1.getId()).setParameter(2, site2.getId()).getResultList();
assertEquals(3, result.size());
assertTrue(result.contains(logins.get(5)));
assertTrue(result.contains(logins.get(6)));
assertTrue(result.contains(logins.get(9)));
result = entityManager.createNamedQuery("login.AllLoginsWithSpecificRoleAndTrialSite").setParameter(1, role2.getId()).setParameter(2, site2.getId()).getResultList();
assertEquals(3, result.size());
assertTrue(result.contains(logins.get(7)));
assertTrue(result.contains(logins.get(8)));
assertTrue(result.contains(logins.get(9)));
}
}