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 }