2525import org .mockito .Mock ;
2626import org .mockito .junit .MockitoJUnitRunner ;
2727
28+ import java .sql .Connection ;
29+ import java .sql .DatabaseMetaData ;
30+ import java .sql .ResultSet ;
2831import java .sql .ResultSetMetaData ;
2932import java .sql .SQLException ;
3033import java .sql .Types ;
3134
35+ import static org .mockito .ArgumentMatchers .any ;
3236import static org .mockito .ArgumentMatchers .eq ;
3337import static org .mockito .Mockito .when ;
3438
@@ -40,11 +44,126 @@ public class CommonSchemaReaderTest {
4044 @ Mock
4145 ResultSetMetaData metadata ;
4246
47+ @ Mock
48+ Connection mockConn ;
49+ @ Mock
50+ DatabaseMetaData mockDbMeta ;
51+ @ Mock
52+ ResultSet mockColumns ;
53+ @ Mock
54+ ResultSet mockTables ;
55+
56+
4357 @ Before
4458 public void before () {
4559 reader = new CommonSchemaReader ();
4660 }
4761
62+ /**
63+ * Test: getSchemaFields(Connection, String) with a simple table name.
64+ * This covers the case where the table exists, and two columns are present:
65+ * one NOT NULL integer, one nullable string.
66+ */
67+ @ Test
68+ public void testGetSchemaFieldsWithConnection () throws Exception {
69+ // Setup mocks for DatabaseMetaData and columns ResultSet
70+ when (mockConn .getMetaData ()).thenReturn (mockDbMeta );
71+ // Simulate resolveTableName: table exists with name "MYTABLE"
72+ when (mockDbMeta .getTables (any (), any (), any (), eq (new String []{"TABLE" }))).thenReturn (mockTables );
73+ when (mockTables .next ()).thenReturn (true , false );
74+ when (mockTables .getString ("TABLE_NAME" )).thenReturn ("MYTABLE" );
75+
76+ // Simulate columns: two columns, one nullable, one not
77+ when (mockDbMeta .getColumns (any (), any (), eq ("MYTABLE" ), any ())).thenReturn (mockColumns );
78+ when (mockColumns .next ()).thenReturn (true , true , false );
79+ // Column 1
80+ when (mockColumns .getString ("COLUMN_NAME" )).thenReturn ("id" , "name" );
81+ when (mockColumns .getString ("TYPE_NAME" )).thenReturn ("INTEGER" , "VARCHAR" );
82+ when (mockColumns .getInt ("DATA_TYPE" )).thenReturn (Types .INTEGER , Types .VARCHAR );
83+ when (mockColumns .getInt ("COLUMN_SIZE" )).thenReturn (10 , 255 );
84+ when (mockColumns .getInt ("DECIMAL_DIGITS" )).thenReturn (0 , 0 );
85+ when (mockColumns .getInt ("NULLABLE" )).thenReturn (DatabaseMetaData .columnNoNulls , DatabaseMetaData .columnNullable );
86+
87+ // NOTE: In a real test, you may need to mock DBUtils.getSchema if it is static.
88+ // For demonstration, we assume the mapping is correct.
89+
90+ // Run
91+ java .util .List <Schema .Field > fields = reader .getSchemaFields (mockConn , "MYTABLE" );
92+
93+ // Verify
94+ Assert .assertEquals (2 , fields .size ());
95+ Assert .assertEquals ("id" , fields .get (0 ).getName ());
96+ Assert .assertEquals (Schema .of (Schema .Type .INT ), fields .get (0 ).getSchema ());
97+ Assert .assertEquals ("name" , fields .get (1 ).getName ());
98+ Assert .assertTrue (fields .get (1 ).getSchema ().isNullable ());
99+ Assert .assertEquals (Schema .of (Schema .Type .STRING ), fields .get (1 ).getSchema ().getNonNullable ());
100+ }
101+
102+ /**
103+ * Test: getSchemaFields(Connection, String) with a schema-qualified table name.
104+ * This checks that "myschema.MYTABLE" is parsed and resolved correctly.
105+ */
106+ @ Test
107+ public void testGetSchemaFieldsWithSchemaQualifiedName () throws Exception {
108+ // Setup for schema-qualified table name "myschema.MYTABLE"
109+ when (mockConn .getMetaData ()).thenReturn (mockDbMeta );
110+ when (mockDbMeta .getTables (any (), eq ("myschema" ), any (), eq (new String []{"TABLE" }))).thenReturn (mockTables );
111+ when (mockTables .next ()).thenReturn (true , false );
112+ when (mockTables .getString ("TABLE_NAME" )).thenReturn ("MYTABLE" );
113+
114+ when (mockDbMeta .getColumns (any (), eq ("myschema" ), eq ("MYTABLE" ), any ())).thenReturn (mockColumns );
115+ when (mockColumns .next ()).thenReturn (true , false );
116+ when (mockColumns .getString ("COLUMN_NAME" )).thenReturn ("id" );
117+ when (mockColumns .getString ("TYPE_NAME" )).thenReturn ("INTEGER" );
118+ when (mockColumns .getInt ("DATA_TYPE" )).thenReturn (Types .INTEGER );
119+ when (mockColumns .getInt ("COLUMN_SIZE" )).thenReturn (10 );
120+ when (mockColumns .getInt ("DECIMAL_DIGITS" )).thenReturn (0 );
121+ when (mockColumns .getInt ("NULLABLE" )).thenReturn (DatabaseMetaData .columnNoNulls );
122+
123+ java .util .List <Schema .Field > fields = reader .getSchemaFields (mockConn , "myschema.MYTABLE" );
124+ Assert .assertEquals (1 , fields .size ());
125+ Assert .assertEquals ("id" , fields .get (0 ).getName ());
126+ Assert .assertEquals (Schema .of (Schema .Type .INT ), fields .get (0 ).getSchema ());
127+ }
128+
129+ /**
130+ * Test: Nullability logic is correct for columns.
131+ */
132+ @ Test
133+ public void testGetSchemaFieldsHandlesNullability () throws Exception {
134+ when (mockConn .getMetaData ()).thenReturn (mockDbMeta );
135+ when (mockDbMeta .getTables (any (), any (), any (), eq (new String []{"TABLE" }))).thenReturn (mockTables );
136+ when (mockTables .next ()).thenReturn (true , false );
137+ when (mockTables .getString ("TABLE_NAME" )).thenReturn ("MYTABLE" );
138+
139+ when (mockDbMeta .getColumns (any (), any (), eq ("MYTABLE" ), any ())).thenReturn (mockColumns );
140+ when (mockColumns .next ()).thenReturn (true , true , false );
141+ when (mockColumns .getString ("COLUMN_NAME" )).thenReturn ("col1" , "col2" );
142+ when (mockColumns .getString ("TYPE_NAME" )).thenReturn ("INTEGER" , "VARCHAR" );
143+ when (mockColumns .getInt ("DATA_TYPE" )).thenReturn (Types .INTEGER , Types .VARCHAR );
144+ when (mockColumns .getInt ("COLUMN_SIZE" )).thenReturn (10 , 255 );
145+ when (mockColumns .getInt ("DECIMAL_DIGITS" )).thenReturn (0 , 0 );
146+ when (mockColumns .getInt ("NULLABLE" )).thenReturn (DatabaseMetaData .columnNullable , DatabaseMetaData .columnNoNulls );
147+
148+ java .util .List <Schema .Field > fields = reader .getSchemaFields (mockConn , "MYTABLE" );
149+ Assert .assertTrue (fields .get (0 ).getSchema ().isNullable ());
150+ Assert .assertFalse (fields .get (1 ).getSchema ().isNullable ());
151+ }
152+
153+ /**
154+ * Test: Exception is thrown when table is not found.
155+ */
156+ @ Test (expected = SQLException .class )
157+ public void testGetSchemaFieldsThrowsWhenTableNotFound () throws Exception {
158+ when (mockConn .getMetaData ()).thenReturn (mockDbMeta );
159+ when (mockDbMeta .getTables (any (), any (), any (), eq (new String []{"TABLE" }))).thenReturn (mockTables );
160+ when (mockTables .next ()).thenReturn (false ); // Table not found
161+
162+ reader .getSchemaFields (mockConn , "NOTABLE" );
163+ }
164+
165+
166+
48167 @ Test
49168 public void testGetSchemaHandlesNull () throws SQLException {
50169 when (metadata .getColumnType (eq (1 ))).thenReturn (Types .NULL );
0 commit comments