1 package net.sourceforge.addam.ddlgen.generic; 2 3 import com.mockrunner.mock.jdbc.MockDatabaseMetaData; 4 import com.mockrunner.mock.jdbc.MockResultSet; 5 import junit.framework.Assert; 6 import junit.framework.TestCase; 7 import net.sourceforge.addam.ddlgen.generic.TableColumn; 8 import net.sourceforge.addam.ddlgen.generic.TableGenerator; 9 import net.sourceforge.addam.ddlgen.generic.TableIndex; 10 11 import org.apache.velocity.VelocityContext; 12 13 import java.sql.SQLException; 14 import java.util.List; 15 16 /** 17 * User: mkrishna 18 * Date: Nov 11, 2004 19 */ 20 public class TableGeneratorUTEST extends TestCase { 21 private final Object[] columnDetails1 = new Object[]{"TABLE_CAT1 ", "TABLE_SCHEM1 ", "TABLE_NAME1 ", "COLUMN_NAME1 ", "DATA_TYPE1 ", "TYPE_NAME1 ", "COLUMN_SIZE1 ", "BUFFER_LENGTH1 ", "DECIMAL_DIGITS", "NUM_PREC_RADIX", "NULLABLE1 ", "REMARKS1 ", null, "SQL_DATA_TYPE1 ", "SQL_DATETIME_SUB1 ", "CHAR_OCTET_LENGTH1 ", "ORDINAL_POSITION1 ", "NO", "SCOPE_CATLOG1 ", "SCOPE_SCHEMA1 ", "SCOPE_TABLE1 ", "SOURCE_DATA_TYPE1 "};; 22 private final Object[] columnDetails2 = new Object[]{"TABLE_CAT2 ", "TABLE_SCHEM2 ", "TABLE_NAME2 ", "COLUMN_NAME2 ", "DATA_TYPE2 ", "TYPE_NAME2 ", "COLUMN_SIZE2 ", "BUFFER_LENGTH2 ", "DECIMAL_DIGITS", "NUM_PREC_RADIX", "NULLABLE2 ", "REMARKS2 ", "COLUMN_DEF2 ", "SQL_DATA_TYPE2 ", "SQL_DATETIME_SUB2 ", "CHAR_OCTET_LENGTH2 ", "ORDINAL_POSITION2 ", "IS_NULLABLE2 ", "SCOPE_CATLOG2 ", "SCOPE_SCHEMA2 ", "SCOPE_TABLE2 ", "SOURCE_DATA_TYPE2 "}; 23 24 public void testTableDDLGeneratorConstructsColumnObjectsProperly() throws Exception { 25 MockResultSet resultset = new MockResultSet("getColumns"); 26 resultset.addRow(columnDetails1); 27 resultset.addRow(columnDetails2); 28 MockDatabaseMetaData dbmd = new MockDatabaseMetaData(); 29 dbmd.setColumns(resultset); 30 dbmd.setIndexInfo(new MockResultSet("")); 31 dbmd.setPrimaryKeys(new MockResultSet("")); 32 try { 33 net.sourceforge.addam.ddlgen.generic.TableGenerator generator = new net.sourceforge.addam.ddlgen.generic.TableGenerator(); 34 VelocityContext context = generator.getContext(null, null, "testtable", null, dbmd); 35 List columns = (List)context.get("columns"); 36 List defaultValueColumns = (List)context.get("defaultValueColumns"); 37 List nonNullableColumns = (List)context.get("nonNullableColumns"); 38 39 Assert.assertEquals(2, columns.size()); 40 Assert.assertEquals(1, defaultValueColumns.size()); 41 Assert.assertEquals(1, nonNullableColumns.size()); 42 Assert.assertEquals("COLUMN_DEF2 ", ((TableColumn)defaultValueColumns.get(0)).getDefaultValue()); 43 assertEquals("COLUMN_NAME2 ", ((TableColumn)defaultValueColumns.get(0)).getName()); 44 assertEquals("COLUMN_NAME1 ", ((TableColumn)nonNullableColumns.get(0)).getName()); 45 } catch (SQLException e) { 46 fail("Creation of Table ddl did not succeed"); 47 } 48 } 49 50 public void testTableDDLGeneratorConstructsIndexInfoProperly() throws Exception { 51 MockResultSet resultset = new MockResultSet("getColumns"); 52 resultset.addRow(columnDetails1); 53 MockDatabaseMetaData dbmd = new MockDatabaseMetaData(); 54 dbmd.setColumns(resultset); 55 56 MockResultSet mockResultSetForIndexInfo = new MockResultSet("getIndexInfo"); 57 Object[] indexInfo1 = new Object[]{"TABLE_CAT1 ", "TABLE_SCHEM1 ", "TABLE_NAME1 ", "NON_UNIQUE1 ", "INDEX_QUALIFIER1 ", "INDEX_NAME1 ", "TYPE1 ", "ORDINAL_POSITION1 ", "COLUMN_NAME1 ", "ASC_OR_DESC1 ", "CARDINALITY1 ", "PAGES1 ", "FILTER_CONDITION1 "}; 58 Object[] indexInfo2 = new Object[]{"TABLE_CAT2 ", "TABLE_SCHEM2 ", "TABLE_NAME2 ", "NON_UNIQUE2 ", "INDEX_QUALIFIER2 ", "INDEX_NAME2 ", "TYPE2 ", "ORDINAL_POSITION2 ", "COLUMN_NAME2 ", "ASC_OR_DESC2 ", "CARDINALITY2 ", "PAGES2 ", "FILTER_CONDITION2 "}; 59 Object[] indexInfo3 = new Object[]{"TABLE_CAT2 ", "TABLE_SCHEM2 ", "TABLE_NAME2 ", "NON_UNIQUE2 ", "INDEX_QUALIFIER2 ", "INDEX_NAME2 ", "TYPE2 ", "ORDINAL_POSITION2 ", "COLUMN_NAME3 ", "ASC_OR_DESC2 ", "CARDINALITY2 ", "PAGES2 ", "FILTER_CONDITION2 "}; 60 Object[] indexInfo4 = new Object[]{"TABLE_CAT3 ", "TABLE_SCHEM3 ", "TABLE_NAME3 ", "NON_UNIQUE3 ", "INDEX_QUALIFIER3 ", "PK_NAME2 ", "TYPE3 ", "ORDINAL_POSITION3 ", "COLUMN_NAME4 ", "ASC_OR_DESC3 ", "CARDINALITY3 ", "PAGES3 ", "FILTER_CONDITION3 "}; 61 Object[] indexInfo5 = new Object[]{"TABLE_CAT3 ", "TABLE_SCHEM3 ", "TABLE_NAME3 ", "NON_UNIQUE3 ", "INDEX_QUALIFIER3 ", "PK_NAME2 ", "TYPE3 ", "ORDINAL_POSITION3 ", "COLUMN_NAME5 ", "ASC_OR_DESC3 ", "CARDINALITY3 ", "PAGES3 ", "FILTER_CONDITION3 "}; 62 63 mockResultSetForIndexInfo.addRow(indexInfo1); 64 mockResultSetForIndexInfo.addRow(indexInfo2); 65 mockResultSetForIndexInfo.addRow(indexInfo3); 66 mockResultSetForIndexInfo.addRow(indexInfo4); 67 mockResultSetForIndexInfo.addRow(indexInfo5); 68 69 MockResultSet mockResultSetForPrimaryKeyInfo = new MockResultSet("getIndexInfo"); 70 Object[] primaryKeyInfo3 = new Object[]{"TABLE_CAT2 ", "TABLE_SCHEM2 ", "TABLE_NAME2 ", "COLUMN_NAME3 ", "KEY_SEQ2 ", "PK_NAME2 "}; 71 Object[] primaryKeyInfo2 = new Object[]{"TABLE_CAT2 ", "TABLE_SCHEM2 ", "TABLE_NAME2 ", "COLUMN_NAME2 ", "KEY_SEQ2 ", "PK_NAME2 "}; 72 mockResultSetForPrimaryKeyInfo.addRow(primaryKeyInfo3); 73 mockResultSetForPrimaryKeyInfo.addRow(primaryKeyInfo2); 74 75 dbmd.setIndexInfo(mockResultSetForIndexInfo); 76 dbmd.setPrimaryKeys(mockResultSetForPrimaryKeyInfo); 77 try { 78 net.sourceforge.addam.ddlgen.generic.TableGenerator generator = new net.sourceforge.addam.ddlgen.generic.TableGenerator(); 79 VelocityContext context = generator.getContext(null, null, "testtable", null, dbmd); 80 List columnIndexes = (List)context.get("columnIndexes"); 81 82 Assert.assertEquals(2, columnIndexes.size()); 83 assertIndexContainsColumnData("INDEX_NAME1 ", "COLUMN_NAME1 ", columnIndexes, null); 84 assertIndexContainsColumnData("INDEX_NAME2 ", "COLUMN_NAME2 ", columnIndexes, "COLUMN_NAME3 "); 85 } catch (SQLException e) { 86 fail("Creation of Table ddl did not succeed"); 87 } 88 } 89 90 public void testTableDDLGeneratorConstructsPrimaryKeyInfoProperly() throws Exception { 91 MockResultSet resultset = new MockResultSet("getColumns"); 92 resultset.addRow(columnDetails1); 93 MockDatabaseMetaData dbmd = new MockDatabaseMetaData(); 94 dbmd.setColumns(resultset); 95 96 MockResultSet mockResultSetForPrimaryKeyInfo = new MockResultSet("getIndexInfo"); 97 Object[] primaryKeyInfo1 = new Object[]{"TABLE_CAT1 ", "TABLE_SCHEM1 ", "TABLE_NAME1 ", "COLUMN_NAME1 ", "KEY_SEQ1 ", "PK_NAME1 "}; 98 Object[] primaryKeyInfo2 = new Object[]{"TABLE_CAT2 ", "TABLE_SCHEM2 ", "TABLE_NAME2 ", "COLUMN_NAME2 ", "KEY_SEQ2 ", "PK_NAME2 "}; 99 Object[] primaryKeyInfo3 = new Object[]{"TABLE_CAT2 ", "TABLE_SCHEM2 ", "TABLE_NAME2 ", "COLUMN_NAME3 ", "KEY_SEQ2 ", "PK_NAME2 "}; 100 mockResultSetForPrimaryKeyInfo.addRow(primaryKeyInfo1); 101 mockResultSetForPrimaryKeyInfo.addRow(primaryKeyInfo2); 102 mockResultSetForPrimaryKeyInfo.addRow(primaryKeyInfo3); 103 104 dbmd.setIndexInfo(new MockResultSet("")); 105 dbmd.setPrimaryKeys(mockResultSetForPrimaryKeyInfo); 106 try { 107 TableGenerator generator = new net.sourceforge.addam.ddlgen.generic.TableGenerator(); 108 VelocityContext context = generator.getContext(null, null, "testtable", null, dbmd); 109 List primaryKeys = (List)context.get("primaryKeys"); 110 111 Assert.assertEquals(2, primaryKeys.size()); 112 assertPrimaryKeyContainsColumnData("PK_NAME1 ", "COLUMN_NAME1 ", primaryKeys, null); 113 assertPrimaryKeyContainsColumnData("PK_NAME2 ", "COLUMN_NAME2 ", primaryKeys, "COLUMN_NAME3 "); 114 } catch (SQLException e) { 115 fail("Creation of Table ddl did not succeed"); 116 } 117 118 } 119 120 private void assertIndexContainsColumnData(String indexName, String columnName, List columnList, String extraColumn) { 121 boolean contains = false; 122 for (int i = 0; i < columnList.size(); i++) { 123 TableIndex index = (TableIndex) columnList.get(i); 124 if (indexName.equals(index.getIndexName()) && columnName.equals(index.getFirstColumnName())) { 125 contains = true; 126 if (extraColumn != null) { 127 contains = index.getColumns().contains(extraColumn); 128 } 129 break; 130 } 131 } 132 assertTrue(contains); 133 } 134 135 private void assertPrimaryKeyContainsColumnData(String primaryKeyName, String columnName, List columnList, String extraColumn) { 136 boolean contains = false; 137 for (int i = 0; i < columnList.size(); i++) { 138 net.sourceforge.addam.ddlgen.generic.TablePrimaryKey primaryKey = (net.sourceforge.addam.ddlgen.generic.TablePrimaryKey) columnList.get(i); 139 if (primaryKeyName.equals(primaryKey.getPrimaryKeyName()) && columnName.equals(primaryKey.getFirstColumnName())) { 140 contains = true; 141 if (extraColumn != null) { 142 contains = primaryKey.getColumns().contains(extraColumn); 143 } 144 break; 145 } 146 } 147 assertTrue(contains); 148 } 149 }