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 }