2727from airbyte_cdk .sources .declarative .validators .validate_adheres_to_schema import (
2828 ValidateAdheresToSchema ,
2929)
30+ from airbyte_cdk .sources .declarative .manifest_declarative_source import (
31+ ManifestDeclarativeSource ,
32+ )
3033
3134logger = logging .getLogger (__name__ )
3235
3538
3639RECHECK_EXCLUSION_LIST = False
3740
38- USE_GIT_SPARSE_CHECKOUT = False
41+ USE_GIT_SPARSE_CHECKOUT = True
3942
4043CONNECTOR_REGISTRY_URL = "https://connectors.airbyte.com/files/registries/v0/oss_registry.json"
4144MANIFEST_URL_TEMPLATE = (
@@ -61,6 +64,18 @@ def download_failures() -> List[Tuple[str, str]]:
6164 return []
6265
6366
67+ @pytest .fixture (scope = "session" )
68+ def cdk_validation_failures () -> List [Tuple [str , str , str ]]:
69+ """Thread-safe list for tracking CDK validation failures."""
70+ return []
71+
72+
73+ @pytest .fixture (scope = "session" )
74+ def spec_execution_failures () -> List [Tuple [str , str , str ]]:
75+ """Thread-safe list for tracking SPEC execution failures."""
76+ return []
77+
78+
6479@pytest .fixture (scope = "session" )
6580def schema_validator () -> ValidateAdheresToSchema :
6681 """Cached schema validator to avoid repeated loading."""
@@ -265,6 +280,8 @@ def test_manifest_validates_against_schema(
265280 validation_successes : List [Tuple [str , str ]],
266281 validation_failures : List [Tuple [str , str , str ]],
267282 download_failures : List [Tuple [str , str ]],
283+ cdk_validation_failures : List [Tuple [str , str , str ]],
284+ spec_execution_failures : List [Tuple [str , str , str ]],
268285) -> None :
269286 """
270287 Test that manifest.yaml files from the registry validate against the CDK schema.
@@ -310,8 +327,29 @@ def test_manifest_validates_against_schema(
310327 )
311328
312329 schema_validator .validate (preprocessed_manifest )
330+ logger .info (f"✓ { connector_name } (CDK { cdk_version } ) - JSON schema validation passed" )
331+
332+ try :
333+ manifest_source = ManifestDeclarativeSource (source_config = preprocessed_manifest )
334+ logger .info (f"✓ { connector_name } (CDK { cdk_version } ) - CDK validation passed" )
335+ except Exception as e :
336+ error_msg = f"CDK validation failed: { e } "
337+ cdk_validation_failures .append ((connector_name , cdk_version , error_msg ))
338+ logger .warning (f"⚠ { connector_name } (CDK { cdk_version } ) - CDK validation failed: { e } " )
339+
340+ try :
341+ manifest_source = ManifestDeclarativeSource (source_config = preprocessed_manifest )
342+ spec_result = manifest_source .spec (logger )
343+ if spec_result is None :
344+ raise ValueError ("SPEC command returned None" )
345+ logger .info (f"✓ { connector_name } (CDK { cdk_version } ) - SPEC execution passed" )
346+ except Exception as e :
347+ error_msg = f"SPEC execution failed: { e } "
348+ spec_execution_failures .append ((connector_name , cdk_version , error_msg ))
349+ logger .warning (f"⚠ { connector_name } (CDK { cdk_version } ) - SPEC execution failed: { e } " )
350+
313351 validation_successes .append ((connector_name , cdk_version ))
314- logger .info (f"✓ { connector_name } (CDK { cdk_version } ) - validation passed " )
352+ logger .info (f"✓ { connector_name } (CDK { cdk_version } ) - comprehensive validation completed " )
315353
316354 if RECHECK_EXCLUSION_LIST and expected_to_fail :
317355 pytest .fail (
@@ -391,6 +429,8 @@ def log_test_results(
391429 validation_successes : List [Tuple [str , str ]],
392430 validation_failures : List [Tuple [str , str , str ]],
393431 download_failures : List [Tuple [str , str ]],
432+ cdk_validation_failures : List [Tuple [str , str , str ]],
433+ spec_execution_failures : List [Tuple [str , str , str ]],
394434) -> None :
395435 """Log comprehensive test results for analysis."""
396436 print ("\n " + "=" * 80 )
@@ -409,9 +449,19 @@ def log_test_results(
409449 for connector_name , error in download_failures :
410450 print (f" - { connector_name } : { error } " )
411451
452+ print (f"\n ⚠ CDK VALIDATION FAILURES ({ len (cdk_validation_failures )} ):" )
453+ for connector_name , cdk_version , error in cdk_validation_failures :
454+ print (f" - { connector_name } (CDK { cdk_version } ): { error } " )
455+
456+ print (f"\n ⚠ SPEC EXECUTION FAILURES ({ len (spec_execution_failures )} ):" )
457+ for connector_name , cdk_version , error in spec_execution_failures :
458+ print (f" - { connector_name } (CDK { cdk_version } ): { error } " )
459+
412460 print ("\n " + "=" * 80 )
413461 print (
414- f"TOTAL: { len (validation_successes )} passed, { len (validation_failures )} failed, { len (download_failures )} download errors"
462+ f"TOTAL: { len (validation_successes )} passed, { len (validation_failures )} failed, "
463+ f"{ len (download_failures )} download errors, { len (cdk_validation_failures )} CDK validation failures, "
464+ f"{ len (spec_execution_failures )} SPEC execution failures"
415465 )
416466 print ("=" * 80 )
417467
@@ -421,4 +471,6 @@ def pytest_sessionfinish(session: Any, exitstatus: Any) -> None:
421471 validation_successes = getattr (session , "_validation_successes" , [])
422472 validation_failures = getattr (session , "_validation_failures" , [])
423473 download_failures = getattr (session , "_download_failures" , [])
424- log_test_results (validation_successes , validation_failures , download_failures )
474+ cdk_validation_failures = getattr (session , "_cdk_validation_failures" , [])
475+ spec_execution_failures = getattr (session , "_spec_execution_failures" , [])
476+ log_test_results (validation_successes , validation_failures , download_failures , cdk_validation_failures , spec_execution_failures )
0 commit comments