11"""
22Main script to run all SEA connector tests.
33
4- This script imports and runs all the individual test modules and displays
4+ This script runs all the individual test modules and displays
55a summary of test results with visual indicators.
66"""
77import os
88import sys
99import logging
10- import importlib . util
11- from typing import Dict , Callable , List , Tuple
10+ import subprocess
11+ from typing import List , Tuple
1212
13- # Configure logging
14- logging .basicConfig (level = logging .INFO )
13+ logging .basicConfig (level = logging .DEBUG )
1514logger = logging .getLogger (__name__ )
1615
17- # Define test modules and their main test functions
1816TEST_MODULES = [
1917 "test_sea_session" ,
2018 "test_sea_sync_query" ,
2321]
2422
2523
26- def load_test_function (module_name : str ) -> Callable :
27- """Load a test function from a module ."""
24+ def run_test_module (module_name : str ) -> bool :
25+ """Run a test module and return success status ."""
2826 module_path = os .path .join (
2927 os .path .dirname (os .path .abspath (__file__ )), "tests" , f"{ module_name } .py"
3028 )
3129
32- spec = importlib .util .spec_from_file_location (module_name , module_path )
33- module = importlib .util .module_from_spec (spec )
34- spec .loader .exec_module (module )
30+ # Simply run the module as a script - each module handles its own test execution
31+ result = subprocess .run (
32+ [sys .executable , module_path ], capture_output = True , text = True
33+ )
3534
36- # Get the main test function (assuming it starts with "test_")
37- for name in dir (module ):
38- if name .startswith ("test_" ) and callable (getattr (module , name )):
39- # For sync and async query modules, we want the main function that runs both tests
40- if name == f"test_sea_{ module_name .replace ('test_sea_' , '' )} _exec" :
41- return getattr (module , name )
35+ # Log the output from the test module
36+ if result .stdout :
37+ for line in result .stdout .strip ().split ("\n " ):
38+ logger .info (line )
4239
43- # Fallback to the first test function found
44- for name in dir (module ):
45- if name .startswith ("test_" ) and callable (getattr (module , name )):
46- return getattr (module , name )
40+ if result .stderr :
41+ for line in result .stderr .strip ().split ("\n " ):
42+ logger .error (line )
4743
48- raise ValueError ( f"No test function found in module { module_name } " )
44+ return result . returncode == 0
4945
5046
5147def run_tests () -> List [Tuple [str , bool ]]:
@@ -54,12 +50,11 @@ def run_tests() -> List[Tuple[str, bool]]:
5450
5551 for module_name in TEST_MODULES :
5652 try :
57- test_func = load_test_function (module_name )
5853 logger .info (f"\n { '=' * 50 } " )
5954 logger .info (f"Running test: { module_name } " )
6055 logger .info (f"{ '-' * 50 } " )
6156
62- success = test_func ( )
57+ success = run_test_module ( module_name )
6358 results .append ((module_name , success ))
6459
6560 status = "✅ PASSED" if success else "❌ FAILED"
@@ -92,29 +87,48 @@ def print_summary(results: List[Tuple[str, bool]]) -> None:
9287 logger .info (f"Total: { total } | Passed: { passed } | Failed: { total - passed } " )
9388 logger .info (f"{ '=' * 50 } " )
9489
95-
96- if __name__ == "__main__" :
97- # Check if required environment variables are set
98- required_vars = [
99- "DATABRICKS_SERVER_HOSTNAME" ,
100- "DATABRICKS_HTTP_PATH" ,
101- "DATABRICKS_TOKEN" ,
102- ]
103- missing_vars = [var for var in required_vars if not os .environ .get (var )]
104-
105- if missing_vars :
106- logger .error (
107- f"Missing required environment variables: { ', ' .join (missing_vars )} "
90+ server_hostname = os .environ .get ("DATABRICKS_SERVER_HOSTNAME" )
91+ http_path = os .environ .get ("DATABRICKS_HTTP_PATH" )
92+ access_token = os .environ .get ("DATABRICKS_TOKEN" )
93+ catalog = os .environ .get ("DATABRICKS_CATALOG" )
94+
95+ if not all ([server_hostname , http_path , access_token ]):
96+ logger .error ("Missing required environment variables." )
97+ logger .error ("Please set DATABRICKS_SERVER_HOSTNAME, DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN." )
98+ sys .exit (1 )
99+
100+ logger .info (f"Connecting to { server_hostname } " )
101+ logger .info (f"HTTP Path: { http_path } " )
102+ if catalog :
103+ logger .info (f"Using catalog: { catalog } " )
104+
105+ try :
106+ logger .info ("Creating connection with SEA backend..." )
107+ connection = Connection (
108+ server_hostname = server_hostname ,
109+ http_path = http_path ,
110+ access_token = access_token ,
111+ catalog = catalog ,
112+ schema = "default" ,
113+ use_sea = True ,
114+ user_agent_entry = "SEA-Test-Client" # add custom user agent
108115 )
109- logger .error ("Please set these variables before running the tests." )
116+
117+ logger .info (f"Successfully opened SEA session with ID: { connection .get_session_id_hex ()} " )
118+ logger .info (f"backend type: { type (connection .session .backend )} " )
119+
120+ # Close the connection
121+ logger .info ("Closing the SEA session..." )
122+ connection .close ()
123+ logger .info ("Successfully closed SEA session" )
124+
125+ except Exception as e :
126+ logger .error (f"Error testing SEA session: { str (e )} " )
127+ import traceback
128+ logger .error (traceback .format_exc ())
110129 sys .exit (1 )
130+
131+ logger .info ("SEA session test completed successfully" )
111132
112- # Run all tests
113- results = run_tests ()
114-
115- # Print summary
116- print_summary (results )
117-
118- # Exit with appropriate status code
119- all_passed = all (success for _ , success in results )
120- sys .exit (0 if all_passed else 1 )
133+ if __name__ == "__main__" :
134+ test_sea_session ()
0 commit comments