1717package io .cdap .plugin .db .batch .source ;
1818
1919import io .cdap .cdap .api .data .schema .Schema ;
20- import io .cdap .cdap .etl .api .validation .InvalidConfigPropertyException ;
20+ import io .cdap .cdap .etl .api .validation .CauseAttributes ;
21+ import io .cdap .cdap .etl .api .validation .ValidationFailure ;
22+ import io .cdap .cdap .etl .mock .validation .MockFailureCollector ;
2123import org .junit .Assert ;
2224import org .junit .Test ;
2325
26+ import java .util .List ;
27+ import java .util .stream .Collectors ;
28+ import javax .annotation .Nonnull ;
29+
2430/**
2531 * Test class for source schema validation.
2632 */
2733public class AbstractDBSourceTest {
34+ private static final String MOCK_STAGE = "mockStage" ;
2835 private static final Schema SCHEMA = Schema .recordOf (
2936 "schema" ,
3037 Schema .Field .of ("id" , Schema .nullableOf (Schema .of (Schema .Type .INT ))),
@@ -39,7 +46,9 @@ public class AbstractDBSourceTest {
3946
4047 @ Test
4148 public void testValidateSourceSchemaCorrectSchema () {
42- AbstractDBSource .DBSourceConfig .validateSchema (SCHEMA , SCHEMA );
49+ MockFailureCollector collector = new MockFailureCollector (MOCK_STAGE );
50+ AbstractDBSource .DBSourceConfig .validateSchema (SCHEMA , SCHEMA , collector );
51+ Assert .assertEquals (0 , collector .getValidationFailures ().size ());
4352 }
4453
4554 @ Test
@@ -55,12 +64,9 @@ public void testValidateSourceSchemaMismatchFields() {
5564 Schema .Field .of ("double_column" , Schema .nullableOf (Schema .of (Schema .Type .DOUBLE )))
5665 );
5766
58- try {
59- AbstractDBSource .DBSourceConfig .validateSchema (actualSchema , SCHEMA );
60- Assert .fail (String .format ("Expected to throw %s" , InvalidConfigPropertyException .class .getName ()));
61- } catch (InvalidConfigPropertyException e ) {
62- Assert .assertEquals (AbstractDBSource .DBSourceConfig .SCHEMA , e .getProperty ());
63- }
67+ MockFailureCollector collector = new MockFailureCollector (MOCK_STAGE );
68+ AbstractDBSource .DBSourceConfig .validateSchema (actualSchema , SCHEMA , collector );
69+ assertPropertyValidationFailed (collector , "boolean_column" );
6470 }
6571
6672 @ Test
@@ -77,12 +83,26 @@ public void testValidateSourceSchemaInvalidFieldType() {
7783 Schema .Field .of ("boolean_column" , Schema .nullableOf (Schema .of (Schema .Type .INT )))
7884 );
7985
80- try {
81- AbstractDBSource .DBSourceConfig .validateSchema (actualSchema , SCHEMA );
82- Assert .fail (String .format ("Expected to throw %s" , IllegalArgumentException .class .getName ()));
83- } catch (IllegalArgumentException e ) {
84- String errorMessage = "Schema field 'boolean_column' has type 'BOOLEAN' but found 'INT' in input record" ;
85- Assert .assertEquals (errorMessage , e .getMessage ());
86- }
86+ MockFailureCollector collector = new MockFailureCollector (MOCK_STAGE );
87+ AbstractDBSource .DBSourceConfig .validateSchema (actualSchema , SCHEMA , collector );
88+ assertPropertyValidationFailed (collector , "boolean_column" );
89+ }
90+
91+ private static void assertPropertyValidationFailed (MockFailureCollector failureCollector , String paramName ) {
92+ List <ValidationFailure > failureList = failureCollector .getValidationFailures ();
93+ Assert .assertEquals (1 , failureList .size ());
94+ ValidationFailure failure = failureList .get (0 );
95+ List <ValidationFailure .Cause > causeList = getCauses (failure , CauseAttributes .OUTPUT_SCHEMA_FIELD );
96+ Assert .assertEquals (1 , causeList .size ());
97+ ValidationFailure .Cause cause = causeList .get (0 );
98+ Assert .assertEquals (paramName , cause .getAttribute (CauseAttributes .OUTPUT_SCHEMA_FIELD ));
99+ }
100+
101+ @ Nonnull
102+ private static List <ValidationFailure .Cause > getCauses (ValidationFailure failure , String stacktrace ) {
103+ return failure .getCauses ()
104+ .stream ()
105+ .filter (cause -> cause .getAttribute (stacktrace ) != null )
106+ .collect (Collectors .toList ());
87107 }
88108}
0 commit comments