package de.randi2.core.integration.services;
import static junit.framework.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.authentication.dao.SystemWideSaltSource;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import de.randi2.model.Login;
import de.randi2.testUtility.utility.DomainObjectFactory;
import de.randi2.testUtility.utility.InitializeDatabaseUtil;
import de.randi2.utility.security.RolesAndRights;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/META-INF/service-test.xml",
"/META-INF/subconfig/test.xml" })
public abstract class AbstractServiceTest {
@Autowired
protected DomainObjectFactory factory;
@Autowired
protected RolesAndRights rolesAndRights;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private SystemWideSaltSource saltSource;
@Autowired
private InitializeDatabaseUtil databaseUtil;
protected EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
protected Login user;
@Before
public void setUp() {
try {
databaseUtil.setUpDatabaseUserAndTrialSites();
} catch (Exception e) {
fail(e.getMessage());
}
}
@After
public void afterTest() {
SecurityContextHolder.getContext().setAuthentication(null);
entityManager.clear();
}
protected void authenticatAsAdmin() {
user = findLogin("admin@trialsite1.de");
AnonymousAuthenticationToken authToken = new AnonymousAuthenticationToken(
"admin@trialsite1.de", user, new ArrayList<GrantedAuthority>(
user.getAuthorities()));
// Perform authentication
SecurityContextHolder.getContext().setAuthentication(authToken);
SecurityContextHolder.getContext().getAuthentication()
.setAuthenticated(true);
}
protected void authenticatAsPrincipalInvestigator() {
user = findLogin("p_investigator@trialsite1.de");
AnonymousAuthenticationToken authToken = new AnonymousAuthenticationToken(
"admin@trialsite1.de", user, new ArrayList<GrantedAuthority>(
user.getAuthorities()));
// Perform authentication
SecurityContextHolder.getContext().setAuthentication(authToken);
SecurityContextHolder.getContext().getAuthentication()
.setAuthenticated(true);
}
protected void authenticatAsInvestigator() {
user = findLogin("investigator@trialsite1.de");
AnonymousAuthenticationToken authToken = new AnonymousAuthenticationToken(
"admin@trialsite1.de", user, new ArrayList<GrantedAuthority>(
user.getAuthorities()));
// Perform authentication
SecurityContextHolder.getContext().setAuthentication(authToken);
SecurityContextHolder.getContext().getAuthentication()
.setAuthenticated(true);
}
@SuppressWarnings("unchecked")
protected Login findLogin(String username) {
String query = "from de.randi2.model.Login login where "
+ "login.username = :username";
List<Login> loginList = entityManager
.createQuery(query).setParameter("username", username).getResultList();
if (loginList.size() == 1)
return loginList.get(0);
else
return null;
}
}