From 110764914cdad4897559a4befcad3a557e9d2ad0 Mon Sep 17 00:00:00 2001 From: Sean Flanigan Date: Thu, 17 May 2018 13:16:54 +1000 Subject: [PATCH] Refactor DBUnitProvider --- .../org/zanata/test/DBUnitDataSetRunner.java | 13 +++++-- .../zanata/test/rule/DataSetOperation.java | 1 + .../src/main/java/org/zanata/RestTest.java | 8 ++--- .../org/zanata/provider/DBUnitProvider.java | 35 ++++++++++++------- .../test/java/org/zanata/ArquillianTest.java | 8 ++--- 5 files changed, 39 insertions(+), 26 deletions(-) diff --git a/server/services/src/test/java/org/zanata/test/DBUnitDataSetRunner.java b/server/services/src/test/java/org/zanata/test/DBUnitDataSetRunner.java index 2a891ab03a..18517c042f 100644 --- a/server/services/src/test/java/org/zanata/test/DBUnitDataSetRunner.java +++ b/server/services/src/test/java/org/zanata/test/DBUnitDataSetRunner.java @@ -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}. @@ -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) { @@ -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 { diff --git a/server/services/src/test/java/org/zanata/test/rule/DataSetOperation.java b/server/services/src/test/java/org/zanata/test/rule/DataSetOperation.java index 56169304f2..aae1915b22 100644 --- a/server/services/src/test/java/org/zanata/test/rule/DataSetOperation.java +++ b/server/services/src/test/java/org/zanata/test/rule/DataSetOperation.java @@ -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; diff --git a/server/zanata-model-test/src/main/java/org/zanata/RestTest.java b/server/zanata-model-test/src/main/java/org/zanata/RestTest.java index b99bd18516..6904d1c6a2 100644 --- a/server/zanata-model-test/src/main/java/org/zanata/RestTest.java +++ b/server/zanata-model-test/src/main/java/org/zanata/RestTest.java @@ -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; diff --git a/server/zanata-model-test/src/main/java/org/zanata/provider/DBUnitProvider.java b/server/zanata-model-test/src/main/java/org/zanata/provider/DBUnitProvider.java index 8c6cdc901b..eda0055548 100644 --- a/server/zanata-model-test/src/main/java/org/zanata/provider/DBUnitProvider.java +++ b/server/zanata-model-test/src/main/java/org/zanata/provider/DBUnitProvider.java @@ -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; @@ -46,7 +47,10 @@ * @author Carlos Munoz camunoz@redhat.com */ -public abstract class DBUnitProvider { +public class DBUnitProvider { + private static final H2DataTypeFactory H2_DATA_TYPE_FACTORY = + new H2DataTypeFactory(); + private final Callable connectionSupplier; protected String binaryDir; protected boolean replaceNull = true; protected List beforeTestOperations = @@ -56,6 +60,10 @@ public abstract class DBUnitProvider { private boolean prepared = false; + public DBUnitProvider(Callable connectionSupplier) { + this.connectionSupplier = connectionSupplier; + } + public void setBinaryDir(String binaryDir) { if (binaryDir == null) return; @@ -110,7 +118,7 @@ private void clearCache() { */ } - protected void executeOperations(List list) { + public void executeOperations(List list) { IDatabaseConnection con = getConnection(); try { editConfig(con.getConfig()); @@ -132,6 +140,7 @@ protected void executeOperations(List list) { } } + // TODO combine both classes called DataSetOperation into one! public static class DataSetOperation { String dataSetLocation; @@ -254,21 +263,22 @@ public String toString() { } /** - * Override this method to provide your own DBUnit - * IDatabaseConnection instance. - *

- * * @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 */ @@ -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 */ @@ -310,8 +320,9 @@ protected void enableReferentialIntegrity(Connection conn) { * A DBUnit DatabaseConfig 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); } /** diff --git a/server/zanata-war/src/test/java/org/zanata/ArquillianTest.java b/server/zanata-war/src/test/java/org/zanata/ArquillianTest.java index 829650b9af..906d65d800 100644 --- a/server/zanata-war/src/test/java/org/zanata/ArquillianTest.java +++ b/server/zanata-war/src/test/java/org/zanata/ArquillianTest.java @@ -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.