package org.needle4j.db.operation.h2; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import org.junit.After; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.needle4j.db.Address; import org.needle4j.db.operation.JdbcConfiguration; import org.needle4j.db.transaction.VoidRunnable; import org.needle4j.junit.DatabaseRule; public class H2DeleteOperationTest { private static final JdbcConfiguration H2_DB_CONFIGURATION = new JdbcConfiguration("jdbc:h2:mem:test", "org.h2.Driver", "sa", ""); private H2DeleteOperationForTest h2DeleteOperation = new H2DeleteOperationForTest(H2_DB_CONFIGURATION); @Rule public DatabaseRule databaseRule = new DatabaseRule("H2TestDataModel", h2DeleteOperation); @Test public void testDisableReferentialIntegrity() throws Exception { Statement statement = h2DeleteOperation.getConnection().createStatement(); h2DeleteOperation.disableReferentialIntegrity(statement); insertAddressWithInvalidFk(); statement.close(); } @Test(expected = SQLException.class) public void testEnableReferentialIntegrity() throws Exception { Statement statement = null; try { statement = h2DeleteOperation.getConnection().createStatement(); h2DeleteOperation.enableReferentialIntegrity(statement); insertAddressWithInvalidFk(); } finally { statement.getConnection().commit(); statement.close(); } } private void insertAddressWithInvalidFk() throws Exception { Statement statement = null; try { statement = h2DeleteOperation.getConnection().createStatement(); List<String> table = new ArrayList<String>(); table.add(Address.TABLE_NAME); final Address address = new Address(); databaseRule.getTransactionHelper().executeInTransaction(new VoidRunnable() { @Override public void doRun(EntityManager entityManager) throws Exception { entityManager.persist(address); entityManager.flush(); } }); h2DeleteOperation.commit(); Statement st = h2DeleteOperation.getConnection().createStatement(); int executeUpdate = st.executeUpdate("update " + Address.TABLE_NAME + " set person_id = 2"); Assert.assertEquals(1, executeUpdate); st.close(); h2DeleteOperation.commit(); } finally { statement.close(); } } @Test public void testDeleteContent() throws Exception { Statement statement = null; try { statement = h2DeleteOperation.getConnection().createStatement(); databaseRule.getTransactionHelper().executeInTransaction(new VoidRunnable() { @Override public void doRun(EntityManager entityManager) throws Exception { entityManager.persist(new Address()); } }); Statement st = h2DeleteOperation.getConnection().createStatement(); ResultSet rs = st.executeQuery("select * from " + Address.TABLE_NAME); Assert.assertTrue(rs.next()); List<String> tableNames = new ArrayList<String>(); tableNames.add(Address.TABLE_NAME); h2DeleteOperation.deleteContent(tableNames, statement); st = h2DeleteOperation.getConnection().createStatement(); st.executeQuery("select * from " + Address.TABLE_NAME); Assert.assertFalse(rs.next()); rs.close(); st.close(); } finally { statement.close(); } } @After public void tearDown() throws Exception { h2DeleteOperation.closeConnection(); } class H2DeleteOperationForTest extends H2DeleteOperation { public H2DeleteOperationForTest(JdbcConfiguration configuration) { super(configuration); } @Override protected Connection getConnection() throws SQLException { return super.getConnection(); } @Override protected void closeConnection() throws SQLException { super.closeConnection(); } @Override protected void commit() throws SQLException { super.commit(); } @Override protected void rollback() throws SQLException { super.rollback(); } @Override protected void disableReferentialIntegrity(Statement statement) throws SQLException { super.disableReferentialIntegrity(statement); } @Override protected void enableReferentialIntegrity(Statement statement) throws SQLException { super.enableReferentialIntegrity(statement); } @Override protected void deleteContent(List<String> tables, Statement statement) throws SQLException { super.deleteContent(tables, statement); } } }