package de.hilling.junit.cdi.jee;
import java.sql.SQLException;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import org.junit.runner.Description;
import de.hilling.junit.cdi.jee.jpa.ConnectionWrapper;
import de.hilling.junit.cdi.lifecycle.TestEvent;
import de.hilling.junit.cdi.scope.EventType;
import de.hilling.junit.cdi.scope.TestSuiteScoped;
@TestSuiteScoped
public class TestTransactionManager {
@Inject
private Instance<ConnectionWrapper> connectionWrappers;
@Inject
private EntityManager entityManager;
private EntityTransaction transaction;
protected void beginTransaction(@Observes @TestEvent(EventType.STARTING) Description description) {
cleanDatabase();
transaction = entityManager.getTransaction();
transaction.begin();
}
private void cleanDatabase() {
try {
for (ConnectionWrapper wrapper : connectionWrappers) {
if(wrapper.runWithConnection()) {
break;
}
}
} catch (SQLException e) {
throw new RuntimeException("error cleaning db", e);
}
}
protected void finishTransaction(@Observes @TestEvent(EventType.FINISHING) Description description) {
if (transaction.isActive()) {
if (transaction.getRollbackOnly()) {
transaction.rollback();
} else {
transaction.commit();
}
}
}
}