jstrachan    2002/10/28 10:40:19

  Added:       sql/src/test/org/apache/commons/sql/io
                        TestHsqlDbJdbcModelReader.java
                        AbstractTestJdbcModelReader.java
  Log:
  Added Eric's unit test cases for the JdbcModelReader (which I've ported from the old 
MetadataReader class).
  
  I've an Axion test case as well, which I'll commit once it works :-)
  
  Revision  Changes    Path
  1.1                  
jakarta-commons-sandbox/sql/src/test/org/apache/commons/sql/io/TestHsqlDbJdbcModelReader.java
  
  Index: TestHsqlDbJdbcModelReader.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/CompilableTag.java,v
 1.5 2002/05/17 15:18:12 jstrachan Exp $
   * $Revision: 1.5 $
   * $Date: 2002/05/17 15:18:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * $Id: CompilableTag.java,v 1.5 2002/05/17 15:18:12 jstrachan Exp $
   */
  package org.apache.commons.sql.io;
  
  import javax.sql.DataSource;
  
  import junit.framework.Test;
  import junit.framework.TestCase;
  import junit.framework.TestSuite;
  import junit.textui.TestRunner;
  
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  
  import org.apache.commons.sql.model.Table;
  
  /**
   * JdbcModelReader test harness for the HsqlDb database
   *
   * @author <a href="mailto:dep4b@;yahoo.com">Eric Pugh</a>
   * @version $Revision: 1.3 $
   */
  public class TestHsqlDbJdbcModelReader extends AbstractTestJdbcModelReader {
  
      /** The Log to which logging calls will be made. */
      private static final Log log =
          LogFactory.getLog(TestHsqlDbJdbcModelReader.class);
  
      public static void main(String[] args) {
          TestRunner.run(suite());
      }
  
      /**
       * A unit test suite for JUnit
       */
      public static Test suite() {
          return new TestSuite(TestHsqlDbJdbcModelReader.class);
      }
  
      public void doImportForeignKeys(Table srcTable, Table testTable) {
          // HsqlDb doesn't support importing forign keys
          assertTrue(
              "No FK imported from HSQLDB",
              testTable.getForeignKeys().size() == 0);
  
      }
  
      public void doImportPrimaryKeyColumns(Table srcTable, Table testTable) {
          // HsqlDb does support importing primary keys
          assertTrue(
              "Table OK's match",
              testTable.getPrimaryKeyColumns().size()
                  == srcTable.getPrimaryKeyColumns().size());
      }
  
      /**
       * Constructor for the TestHsqlDbJdbcModelReader object
       *
       * @param testName
       */
      public TestHsqlDbJdbcModelReader(String testName) {
          super(testName);
      }
  
      protected String getDatabaseType() {
          return "hsqldb";
      }
  
      protected DataSource createDataSource() throws Exception {
          return createDataSource(
              "org.hsqldb.jdbcDriver",
              "jdbc:hsqldb:target/hsqldb",
              "sa",
              "");
      }
  }
  
  
  
  1.1                  
jakarta-commons-sandbox/sql/src/test/org/apache/commons/sql/io/AbstractTestJdbcModelReader.java
  
  Index: AbstractTestJdbcModelReader.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/CompilableTag.java,v
 1.5 2002/05/17 15:18:12 jstrachan Exp $
   * $Revision: 1.5 $
   * $Date: 2002/05/17 15:18:12 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * $Id: CompilableTag.java,v 1.5 2002/05/17 15:18:12 jstrachan Exp $
   */
  package org.apache.commons.sql.io;
  
  import java.io.InputStream;
  import java.io.IOException;
  import java.io.FileInputStream;
  import java.io.FileWriter;
  import java.sql.Connection;
  import java.util.ArrayList;
  import java.util.Iterator;
  import java.util.List;
  
  import javax.sql.DataSource;
  
  import junit.framework.Test;
  import junit.framework.TestCase;
  import junit.framework.TestSuite;
  import junit.textui.TestRunner;
  
  import org.apache.commons.beanutils.DynaBean;
  import org.apache.commons.beanutils.DynaClass;
  
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  
  import org.apache.commons.sql.builder.*;
  
  import org.apache.commons.sql.io.DatabaseReader;
  import org.apache.commons.sql.model.*;
  import org.apache.commons.sql.util.DataSourceWrapper;
  import org.apache.commons.sql.util.DDLExecutor;
  
  /**
   * Abstract base class for testing the JdbcModelReader against a number of
   * different databases.  Based on AbstractTestDynaSql.  This requires that the
   * SqlBuilder code be functioning to dynamically create the database so we can test 
it!
   *
   * @author <a href="mailto:dep4b@;yahoo.com">Eric Pugh</a>
   * @version $Revision: 1.3 $
   */
  public abstract class AbstractTestJdbcModelReader extends TestCase {
      /** The Log to which logging calls will be made. */
      private static final Log log =
          LogFactory.getLog(AbstractTestJdbcModelReader.class);
  
      private String baseDir;
  
      /** the database model to create*/
      private Database database;
  
      /** the database model to test*/
      private Database testDatabase;
  
      /** the database to connect to */
      private DataSource dataSource;
  
      /** for building the Metadata to create the database */
      private SqlBuilder sqlBuilder;
  
      public static void main(String[] args) {
          TestRunner.run(suite());
      }
  
      /**
       * A unit test suite for JUnit
       */
      public static Test suite() {
          return new TestSuite(AbstractTestJdbcModelReader.class);
      }
  
      /**
       * Constructor for the AbstractTestJdbcModelReader object
       *
       * @param testName
       */
      public AbstractTestJdbcModelReader(String testName) {
          super(testName);
      }
  
      // Test cases
      //-------------------------------------------------------------------------
  
      /**
       * Parse the databases metadata.
       */
      public void testParseMetadata() throws Exception {
          // first load up the metadata for this database.
  
          Connection connection = getConnection();
          try {
  
              JdbcModelReader modelReader = new JdbcModelReader(connection);
      
              testDatabase = modelReader.getDatabase();
          }
          finally {
              try {
                  connection.close();
              }
              catch (Exception e) {
                  log.error("Caught exception closing connection: " + e, e);
              }
          }
  
          assertTrue(
              "Src Database contains a table 'author'",
              database.findTable("author") != null);
          assertTrue(
              "Test Database contains a table 'book'",
              testDatabase.findTable("book") != null);
  
          assertTrue(
              "Test Database contains correct number of tables",
              testDatabase.getTables().size() == database.getTables().size());
  
          for (Iterator i = testDatabase.getTables().iterator(); i.hasNext();) {
              Table testTable = (Table) i.next();
              Table srcTable = database.findTable(testTable.getName());
              assertTrue("srcTable was found", srcTable != null);
              assertTrue(
                  "srcTable matches testTable",
                  srcTable.getName().equalsIgnoreCase(testTable.getName()));
              assertTrue(
                  "Table columns match",
                  testTable.getColumns().size() == srcTable.getColumns().size());
              //todo: not imple
              //assertTrue( "Table indexes match", testTable.getIndexes().size() == 
srcTable.getIndexes().size() );
  
              doImportForeignKeys(srcTable, testTable);
              doImportPrimaryKeyColumns(srcTable, testTable);
  
          }
  
          Table bookTable = database.findTable("book");
          Column bookColumn = bookTable.findColumn("book_id");
          assertTrue("book_id column is required", bookColumn.isRequired());
          assertTrue("book_id column is auto inc", bookColumn.isAutoIncrement());
          assertTrue("book_id column is primary key", bookColumn.isPrimaryKey());
      }
  
      // Implementation methods
      //-------------------------------------------------------------------------
  
      public abstract void doImportForeignKeys(Table srcTable, Table testTable);
      public abstract void doImportPrimaryKeyColumns(
          Table srcTable,
          Table testTable);
  
      /**
       * The JUnit setup method
       */
      protected void setUp() throws Exception {
          super.setUp();
  
          baseDir = System.getProperty("basedir", ".");
          String uri = baseDir + "/src/test-input/datamodel.xml";
  
          DatabaseReader reader = new DatabaseReader();
          database = (Database) reader.parse(new FileInputStream(uri));
  
          assertTrue("Loaded a valid database", database != null);
  
          dataSource = createDataSource();
          sqlBuilder = createSqlBuilder();
  
          executeDDL();
  
      }
  
      /**
       * @return the database connection to be used for the tests
       */
      protected Connection getConnection() throws Exception {
          return dataSource.getConnection();
      }
      
      /**
       * @return the name of the database type to use to create the DDL
       */
      protected abstract String getDatabaseType();
  
      /**
       * Factory method to create a DataSource
       */
      protected abstract DataSource createDataSource() throws Exception;
  
      /**
       * Creates an SqlBuilder based on the name of the database
       */
      protected SqlBuilder createSqlBuilder() throws Exception {
          return SqlBuilderFactory.newSqlBuilder(getDatabaseType());
      }
  
      /**
       * Creates the database on the given data source with the given SQL builder
       */
      protected void executeDDL() throws Exception {
          DDLExecutor executor = new DDLExecutor(dataSource, sqlBuilder);
          executor.createDatabase(database, true);
      }
  
      /**
       * Creates a new DataSource for the given JDBC URI
       */
      protected DataSource createDataSource(String className, String connectURL)
          throws Exception {
          return createDataSource(className, connectURL, null, null);
      }
  
      /**
       * Creates a new DataSource for the given JDBC URI
       */
      protected DataSource createDataSource(
          String className,
          String connectURL,
          String userName,
          String password)
          throws Exception {
  
          DataSourceWrapper wrapper = new DataSourceWrapper();
          wrapper.setDriverClassName(className);
          wrapper.setJdbcURL(connectURL);
          wrapper.setUserName(userName);
          wrapper.setPassword(password);
          return wrapper;
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <mailto:commons-dev-unsubscribe@;jakarta.apache.org>
For additional commands, e-mail: <mailto:commons-dev-help@;jakarta.apache.org>

Reply via email to