Skip to content

Commit

Permalink
Refactor DBUnitProvider
Browse files Browse the repository at this point in the history
  • Loading branch information
seanf committed May 19, 2018
1 parent 6b41f62 commit 1107649
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 26 deletions.
Expand Up @@ -20,14 +20,16 @@
*/
package org.zanata.test;

import javax.persistence.EntityManager;

import org.dbunit.DatabaseUnitException;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.hibernate.Session;
import org.hibernate.engine.spi.SessionImplementor;
import org.zanata.provider.DBUnitProvider;
import org.zanata.test.rule.DataSetOperation;

import javax.persistence.EntityManager;

/**
* Utility test class to run DBUnit data sets using a provided entity manager.
* Use this instead of extending {@link org.zanata.ZanataDbunitJpaTest}.
Expand All @@ -37,9 +39,13 @@
public class DBUnitDataSetRunner {

private final EntityManager em;
// private final DBUnitProvider dbUnitProvider;

public DBUnitDataSetRunner(EntityManager em) {
this.em = em;
// this.dbUnitProvider = new DBUnitProvider(
// () -> new DatabaseConnection(
// ((SessionImplementor) em.getDelegate()).connection()));
}

public void runDataSetOperations(DataSetOperation... operations) {
Expand All @@ -50,6 +56,9 @@ public void runDataSetOperations(DataSetOperation... operations) {
}

protected void executeOperations(DataSetOperation... operations) {
// TODO eliminate org.zanata.test.rule.DataSetOperation in favour of
// org.zanata.provider.DBUnitProvider.DataSetOperation and use this:
// dbUnitProvider.executeOperations(asList(operations));
// NB: Hibernate specific
em.unwrap(Session.class).doWork(connection -> {
try {
Expand Down
Expand Up @@ -35,6 +35,7 @@
* @see {@link org.zanata.test.DBUnitDataSetRunner}
* @see {@link @org.zanata.ZanataDbunitJpaTest.DataSetOperation}
*/
// TODO combine both classes called DataSetOperation into one!
public class DataSetOperation {
String dataSetLocation;
ReplacementDataSet dataSet;
Expand Down
Expand Up @@ -88,12 +88,8 @@ public abstract class RestTest {
"X-Auth-User", ADMIN,
"X-Auth-Token", ADMIN_KEY);

private DBUnitProvider dbUnitProvider = new DBUnitProvider() {
@Override
protected IDatabaseConnection getConnection() {
return RestTest.this.getConnection();
}
};
private DBUnitProvider dbUnitProvider = new DBUnitProvider(
RestTest.this::getConnection);

@ArquillianResource
private URL deploymentUrl;
Expand Down
Expand Up @@ -30,6 +30,7 @@
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;

import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.IDatabaseConnection;
Expand All @@ -46,7 +47,10 @@
* @author Carlos Munoz <a
* href="mailto:camunoz@redhat.com">camunoz@redhat.com</a>
*/
public abstract class DBUnitProvider {
public class DBUnitProvider {
private static final H2DataTypeFactory H2_DATA_TYPE_FACTORY =
new H2DataTypeFactory();
private final Callable<IDatabaseConnection> connectionSupplier;
protected String binaryDir;
protected boolean replaceNull = true;
protected List<DataSetOperation> beforeTestOperations =
Expand All @@ -56,6 +60,10 @@ public abstract class DBUnitProvider {

private boolean prepared = false;

public DBUnitProvider(Callable<IDatabaseConnection> connectionSupplier) {
this.connectionSupplier = connectionSupplier;
}

public void setBinaryDir(String binaryDir) {
if (binaryDir == null)
return;
Expand Down Expand Up @@ -110,7 +118,7 @@ private void clearCache() {
*/
}

protected void executeOperations(List<DataSetOperation> list) {
public void executeOperations(List<DataSetOperation> list) {
IDatabaseConnection con = getConnection();
try {
editConfig(con.getConfig());
Expand All @@ -132,6 +140,7 @@ protected void executeOperations(List<DataSetOperation> list) {
}
}

// TODO combine both classes called DataSetOperation into one!
public static class DataSetOperation {

String dataSetLocation;
Expand Down Expand Up @@ -254,21 +263,22 @@ public String toString() {
}

/**
* Override this method to provide your own DBUnit
* <tt>IDatabaseConnection</tt> instance.
* <p/>
*
* @return a DBUnit database connection (wrapped)
*/
// TODO This is hibernate specific
protected abstract IDatabaseConnection getConnection();
protected IDatabaseConnection getConnection() {
try {
return connectionSupplier.call();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

/**
* Execute whatever statement is necessary to either defer or disable
* foreign key constraint checking on the given database connection, which
* is used by DBUnit to import datasets.
*
* @param con
* @param conn
* A DBUnit connection wrapper, which is used afterwards for
* dataset operations
*/
Expand All @@ -285,7 +295,7 @@ protected void disableReferentialIntegrity(Connection conn) {
* Execute whatever statement is necessary to enable integrity constraint
* checks after dataset operations.
*
* @param con
* @param conn
* A DBUnit connection wrapper, before it is used by the
* application again
*/
Expand All @@ -310,8 +320,9 @@ protected void enableReferentialIntegrity(Connection conn) {
* A DBUnit <tt>DatabaseConfig</tt> object for setting properties
* and features
*/
protected void editConfig(DatabaseConfig config) {
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new H2DataTypeFactory());
public static void editConfig(DatabaseConfig config) {
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
H2_DATA_TYPE_FACTORY);
}

/**
Expand Down
Expand Up @@ -42,12 +42,8 @@
@RunWith(Arquillian.class)
public abstract class ArquillianTest {

protected DBUnitProvider dbUnitProvider = new DBUnitProvider() {
@Override
protected IDatabaseConnection getConnection() {
return ArquillianTest.getConnection();
}
};
private DBUnitProvider dbUnitProvider = new DBUnitProvider(
ArquillianTest::getConnection);

/**
* Implement this in a subclass.
Expand Down

0 comments on commit 1107649

Please sign in to comment.