package br.com.geraldoferraz.testyourquery.runner;
import java.sql.Connection;
import java.sql.SQLException;
import javax.persistence.EntityManager;
import org.junit.runners.model.FrameworkMethod;
import br.com.geraldoferraz.testyourquery.annotations.MassPreparer;
import br.com.geraldoferraz.testyourquery.config.Configuration;
import br.com.geraldoferraz.testyourquery.file.ScriptLoader;
import br.com.geraldoferraz.testyourquery.util.ScriptRunner;
import br.com.geraldoferraz.testyourquery.util.database.ConnectionManager;
import br.com.geraldoferraz.testyourquery.util.reflection.ClassReflector;
public class RunnerSessionPerTestCase implements Runner {
private EntityManager em;
private Connection conn;
private ConnectionFactory connectionFactory;
private EntityManagerConnectionInjector injector;
private Object testObject;
public RunnerSessionPerTestCase(ClassReflector clazzReflector, Configuration configuration) throws Exception {
testObject = clazzReflector.createInstance();
ConnectionManager connectionManager = new ConnectionManager(configuration.getEntityManagerProvider());
runScriptIfAny(configuration, connectionManager);
em = connectionManager.getNewEntityManager();
conn = connectionManager.getConnection();
initializeConnectionFactory();
initializeInjector(clazzReflector);
}
private void runScriptIfAny(Configuration configuration, ConnectionManager connectionManager) throws SQLException, Exception {
if (configuration.getScript() != null && !(configuration.getScript().length() == 0)){
connectionManager.executeScript(new ScriptLoader(configuration.getScript()).load());
}
}
private void initializeConnectionFactory() {
connectionFactory = new ConnectionFactory() {
public EntityManager getEntityManager() {
return em;
}
public Connection getConnection() {
return conn;
}
};
}
private void initializeInjector(ClassReflector clazzReflector) throws Exception {
injector = new EntityManagerConnectionInjector(clazzReflector, connectionFactory);
}
public void beforeRunTest(FrameworkMethod method) {
if(!em.getTransaction().isActive()){
em.getTransaction().begin();
}
MassPreparer massPreparer = method.getAnnotation(MassPreparer.class);
if(massPreparer != null){
Class<? extends ScriptRunner> scriptRunnerClass = massPreparer.value();
if(scriptRunnerClass != null){
try {
ScriptRunner scriptRunner = scriptRunnerClass.newInstance();
scriptRunner.run(connectionFactory.getEntityManager());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public void afterRunTest() {
em.getTransaction().commit();
}
public Object createTestObject() {
try {
injector.injectOn(testObject);
} catch (Exception e) {
e.printStackTrace();
}
return testObject;
}
}