Author: tomdz
Date: Thu Sep 22 08:45:20 2005
New Revision: 290968

URL: http://svn.apache.org/viewcvs?rev=290968&view=rev
Log:
Added junit test helper that compares the contents of one database with another 
one

Added:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/util/DatabaseTestHelper.java

Added: 
db/ddlutils/trunk/src/java/org/apache/ddlutils/util/DatabaseTestHelper.java
URL: 
http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/util/DatabaseTestHelper.java?rev=290968&view=auto
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/util/DatabaseTestHelper.java 
(added)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/util/DatabaseTestHelper.java 
Thu Sep 22 08:45:20 2005
@@ -0,0 +1,193 @@
+package org.apache.ddlutils.util;

+

+import java.util.Collection;

+import java.util.Iterator;

+import org.apache.commons.beanutils.DynaBean;

+import org.apache.commons.logging.Log;

+import org.apache.commons.logging.LogFactory;

+import org.apache.ddlutils.Platform;

+import org.apache.ddlutils.PlatformInfo;

+import org.apache.ddlutils.model.Column;

+import org.apache.ddlutils.model.Database;

+import org.apache.ddlutils.model.Table;

+import junit.framework.Assert;

+import junit.framework.AssertionFailedError;

+

+/**

+ * Class that provides utility stuff for cpmaring data in databases.

+ *

+ * @author <a href="mailto:[EMAIL PROTECTED]">Thomas Dudziak</a>

+ * @version $Revision: 264616 $

+ */

+public class DatabaseTestHelper extends Assert

+{

+    /** The log for this class */

+    private final Log _log = LogFactory.getLog(DatabaseTestHelper.class);

+

+    /**

+     * Asserts that the data in the tables described by the given model is the 
same in the

+     * database accessed by the second platform as is in the database accessed 
by the first platform.

+     * Note that it is not tested whether the second database has more 
data.<br/>

+     * All differences will be printed via logging in DEBUG level. 

+     * 

+     * @param model            The database model to check

+     * @param origDbPlatform   The first platform

+     * @param testedDbPlatform The second platform

+     */

+    public void assertHasSameData(Database model, Platform origDbPlatform, 
Platform testedDbPlatform)

+    {

+        assertHasSameData(null, model, origDbPlatform, testedDbPlatform);

+    }

+

+    /**

+     * Asserts that the data in the tables described by the given model is the 
same in the

+     * database accessed by the second platform as is in the database accessed 
by the first platform.

+     * Note that it is not tested whether the second database has more 
data.<br/>

+     * All differences will be printed via logging in DEBUG level.

+     * 

+     * @param failureMsg        The failure message to issue if the data is 
not the same

+     * @param model             The database model to check

+     * @param origDbPlatform    The first platform

+     * @param testedDbPlatform  The second platform

+     */

+    public void assertHasSameData(String failureMsg, Database model, Platform 
origDbPlatform, Platform testedDbPlatform)

+    {

+        boolean hasError = false;

+

+        for (int idx = 0; idx < model.getTableCount(); idx++)

+        {

+            Table    table  = model.getTable(idx);

+            Column[] pkCols = table.getPrimaryKeyColumns();

+

+            for (Iterator it = origDbPlatform.query(model, 
buildQueryString(origDbPlatform.getPlatformInfo(), table, null, null), new 
Table[] { table }); it.hasNext();)

+            {

+                DynaBean   obj    = (DynaBean)it.next();

+                Collection result = testedDbPlatform.fetch(model, 
buildQueryString(origDbPlatform.getPlatformInfo(), table, pkCols, obj), new 
Table[] { table });

+

+                if (result.isEmpty())

+                {

+                    if (_log.isDebugEnabled())

+                    {

+                        hasError = true;

+                        _log.debug("Row "+obj.toString()+" is not present in 
second database");

+                    }

+                    else

+                    {

+                        throw new AssertionFailedError(failureMsg);

+                    }

+                }

+                else if (result.size() > 1)

+                {

+                    if (_log.isDebugEnabled())

+                    {

+                        hasError = true;

+

+                        StringBuffer debugMsg = new StringBuffer();

+

+                        debugMsg.append("Row ");

+                        debugMsg.append(obj.toString());

+                        debugMsg.append(" is present more than once in the 
second database:\n");

+                        for (Iterator resultIt = result.iterator(); 
resultIt.hasNext();)

+                        {

+                            debugMsg.append("  ");

+                            debugMsg.append(resultIt.next().toString());

+                        }

+                        _log.debug(debugMsg.toString());

+                    }

+                    else

+                    {

+                        throw new AssertionFailedError(failureMsg);

+                    }

+                }

+                else

+                {

+                    DynaBean otherObj = (DynaBean)result.iterator().next();

+

+                    if (!obj.equals(otherObj))

+                    {

+                        if (_log.isDebugEnabled())

+                        {

+                            hasError = true;

+    

+                            _log.debug("Row "+obj.toString()+" is different in 
the second database: "+otherObj.toString());

+                        }

+                        else

+                        {

+                            throw new AssertionFailedError(failureMsg);

+                        }

+                    }

+                }

+            }

+        }

+        if (hasError)

+        {

+            throw new AssertionFailedError(failureMsg);

+        }

+    }

+

+    /**

+     * Helper method for build a SELECT statement.

+     * 

+     * @param targetPlatformInfo The platform info for the queried database

+     * @param table              The queried table

+     * @param whereCols          The optional columns that make up the WHERE 
clause

+     * @param whereValues        The optional column value that make up the 
WHERE clause

+     * @return The query string

+     */

+    private String buildQueryString(PlatformInfo targetPlatformInfo, Table 
table, Column[] whereCols, DynaBean whereValues)

+    {

+        StringBuffer result = new StringBuffer();

+

+        result.append("SELECT * FROM ");

+        if (targetPlatformInfo.isUseDelimitedIdentifiers())

+        {

+            result.append(targetPlatformInfo.getDelimiterToken());

+        }

+        result.append(table.getName());

+        if (targetPlatformInfo.isUseDelimitedIdentifiers())

+        {

+            result.append(targetPlatformInfo.getDelimiterToken());

+        }

+        if ((whereCols != null) && (whereCols.length > 0))

+        {

+            result.append(" WHERE ");

+            for (int idx = 0; idx < whereCols.length; idx++)

+            {

+                Object value = (whereValues == null ? null : 
whereValues.get(whereCols[idx].getName()));

+

+                if (idx > 0)

+                {

+                    result.append(" AND ");

+                }

+                if (targetPlatformInfo.isUseDelimitedIdentifiers())

+                {

+                    result.append(targetPlatformInfo.getDelimiterToken());

+                }

+                result.append(whereCols[idx].getName());

+                if (targetPlatformInfo.isUseDelimitedIdentifiers())

+                {

+                    result.append(targetPlatformInfo.getDelimiterToken());

+                }

+                result.append(" = ");

+                if (value == null)

+                {

+                    result.append("NULL");

+                }

+                else

+                {

+                    if (!whereCols[idx].isOfNumericType())

+                    {

+                        result.append(targetPlatformInfo.getValueQuoteToken());

+                    }

+                    result.append(value.toString());

+                    if (!whereCols[idx].isOfNumericType())

+                    {

+                        result.append(targetPlatformInfo.getValueQuoteToken());

+                    }

+                }

+            }

+        }

+

+        return result.toString();

+    }

+}



Reply via email to