sqlmesh.core.test
1from __future__ import annotations 2 3import pathlib 4import typing as t 5import unittest 6 7from sqlmesh.core.engine_adapter import EngineAdapter 8from sqlmesh.core.model import Model 9from sqlmesh.core.test.definition import ModelTest as ModelTest, generate_test as generate_test 10from sqlmesh.core.test.discovery import ( 11 ModelTestMetadata as ModelTestMetadata, 12 filter_tests_by_patterns as filter_tests_by_patterns, 13 get_all_model_tests as get_all_model_tests, 14 load_model_test_file as load_model_test_file, 15) 16from sqlmesh.core.test.result import ModelTextTestResult as ModelTextTestResult 17from sqlmesh.utils import UniqueKeyDict 18 19if t.TYPE_CHECKING: 20 from sqlmesh.core.config.loader import C 21 22 23def run_tests( 24 model_test_metadata: list[ModelTestMetadata], 25 models: UniqueKeyDict[str, Model], 26 config: C, 27 gateway: t.Optional[str] = None, 28 dialect: str | None = None, 29 verbosity: int = 1, 30 preserve_fixtures: bool = False, 31 stream: t.TextIO | None = None, 32 default_catalog: str | None = None, 33 default_catalog_dialect: str = "", 34) -> ModelTextTestResult: 35 """Create a test suite of ModelTest objects and run it. 36 37 Args: 38 model_test_metadata: A list of ModelTestMetadata named tuples. 39 models: All models to use for expansion and mapping of physical locations. 40 verbosity: The verbosity level. 41 preserve_fixtures: Preserve the fixture tables in the testing database, useful for debugging. 42 """ 43 testing_adapter_by_gateway: t.Dict[str, EngineAdapter] = {} 44 default_gateway = gateway or config.default_gateway 45 46 try: 47 tests = [] 48 for metadata in model_test_metadata: 49 body = metadata.body 50 gateway = body.get("gateway") or default_gateway 51 testing_engine_adapter = testing_adapter_by_gateway.get(gateway) 52 if not testing_engine_adapter: 53 testing_engine_adapter = config.get_test_connection( 54 gateway, 55 default_catalog, 56 default_catalog_dialect, 57 ).create_engine_adapter(register_comments_override=False) 58 testing_adapter_by_gateway[gateway] = testing_engine_adapter 59 60 tests.append( 61 ModelTest.create_test( 62 body=body, 63 test_name=metadata.test_name, 64 models=models, 65 engine_adapter=testing_engine_adapter, 66 dialect=dialect, 67 path=metadata.path, 68 default_catalog=default_catalog, 69 preserve_fixtures=preserve_fixtures, 70 ) 71 ) 72 73 result = t.cast( 74 ModelTextTestResult, 75 unittest.TextTestRunner( 76 stream=stream, verbosity=verbosity, resultclass=ModelTextTestResult 77 ).run(unittest.TestSuite(tests)), 78 ) 79 finally: 80 for testing_engine_adapter in testing_adapter_by_gateway.values(): 81 testing_engine_adapter.close() 82 83 return result 84 85 86def run_model_tests( 87 tests: list[str], 88 models: UniqueKeyDict[str, Model], 89 config: C, 90 gateway: t.Optional[str] = None, 91 dialect: str | None = None, 92 verbosity: int = 1, 93 patterns: list[str] | None = None, 94 preserve_fixtures: bool = False, 95 stream: t.TextIO | None = None, 96 default_catalog: t.Optional[str] = None, 97 default_catalog_dialect: str = "", 98) -> ModelTextTestResult: 99 """Load and run tests. 100 101 Args: 102 tests: A list of tests to run, e.g. [tests/test_orders.yaml::test_single_order] 103 models: All models to use for expansion and mapping of physical locations. 104 verbosity: The verbosity level. 105 patterns: A list of patterns to match against. 106 preserve_fixtures: Preserve the fixture tables in the testing database, useful for debugging. 107 """ 108 loaded_tests = [] 109 for test in tests: 110 filename, test_name = test.split("::", maxsplit=1) if "::" in test else (test, "") 111 path = pathlib.Path(filename) 112 113 if test_name: 114 loaded_tests.append(load_model_test_file(path)[test_name]) 115 else: 116 loaded_tests.extend(load_model_test_file(path).values()) 117 118 if patterns: 119 loaded_tests = filter_tests_by_patterns(loaded_tests, patterns) 120 121 return run_tests( 122 loaded_tests, 123 models, 124 config, 125 gateway=gateway, 126 dialect=dialect, 127 verbosity=verbosity, 128 preserve_fixtures=preserve_fixtures, 129 stream=stream, 130 default_catalog=default_catalog, 131 default_catalog_dialect=default_catalog_dialect, 132 )
def
run_tests( model_test_metadata: 'list[ModelTestMetadata]', models: sqlmesh.utils.UniqueKeyDict[str, typing.Union[sqlmesh.core.model.definition.SqlModel, sqlmesh.core.model.definition.SeedModel, sqlmesh.core.model.definition.PythonModel, sqlmesh.core.model.definition.ExternalModel]], config: ~C, gateway: Union[str, NoneType] = None, dialect: 'str | None' = None, verbosity: int = 1, preserve_fixtures: bool = False, stream: 't.TextIO | None' = None, default_catalog: 'str | None' = None, default_catalog_dialect: str = '') -> sqlmesh.core.test.result.ModelTextTestResult:
24def run_tests( 25 model_test_metadata: list[ModelTestMetadata], 26 models: UniqueKeyDict[str, Model], 27 config: C, 28 gateway: t.Optional[str] = None, 29 dialect: str | None = None, 30 verbosity: int = 1, 31 preserve_fixtures: bool = False, 32 stream: t.TextIO | None = None, 33 default_catalog: str | None = None, 34 default_catalog_dialect: str = "", 35) -> ModelTextTestResult: 36 """Create a test suite of ModelTest objects and run it. 37 38 Args: 39 model_test_metadata: A list of ModelTestMetadata named tuples. 40 models: All models to use for expansion and mapping of physical locations. 41 verbosity: The verbosity level. 42 preserve_fixtures: Preserve the fixture tables in the testing database, useful for debugging. 43 """ 44 testing_adapter_by_gateway: t.Dict[str, EngineAdapter] = {} 45 default_gateway = gateway or config.default_gateway 46 47 try: 48 tests = [] 49 for metadata in model_test_metadata: 50 body = metadata.body 51 gateway = body.get("gateway") or default_gateway 52 testing_engine_adapter = testing_adapter_by_gateway.get(gateway) 53 if not testing_engine_adapter: 54 testing_engine_adapter = config.get_test_connection( 55 gateway, 56 default_catalog, 57 default_catalog_dialect, 58 ).create_engine_adapter(register_comments_override=False) 59 testing_adapter_by_gateway[gateway] = testing_engine_adapter 60 61 tests.append( 62 ModelTest.create_test( 63 body=body, 64 test_name=metadata.test_name, 65 models=models, 66 engine_adapter=testing_engine_adapter, 67 dialect=dialect, 68 path=metadata.path, 69 default_catalog=default_catalog, 70 preserve_fixtures=preserve_fixtures, 71 ) 72 ) 73 74 result = t.cast( 75 ModelTextTestResult, 76 unittest.TextTestRunner( 77 stream=stream, verbosity=verbosity, resultclass=ModelTextTestResult 78 ).run(unittest.TestSuite(tests)), 79 ) 80 finally: 81 for testing_engine_adapter in testing_adapter_by_gateway.values(): 82 testing_engine_adapter.close() 83 84 return result
Create a test suite of ModelTest objects and run it.
Arguments:
- model_test_metadata: A list of ModelTestMetadata named tuples.
- models: All models to use for expansion and mapping of physical locations.
- verbosity: The verbosity level.
- preserve_fixtures: Preserve the fixture tables in the testing database, useful for debugging.
def
run_model_tests( tests: 'list[str]', models: sqlmesh.utils.UniqueKeyDict[str, typing.Union[sqlmesh.core.model.definition.SqlModel, sqlmesh.core.model.definition.SeedModel, sqlmesh.core.model.definition.PythonModel, sqlmesh.core.model.definition.ExternalModel]], config: ~C, gateway: Union[str, NoneType] = None, dialect: 'str | None' = None, verbosity: int = 1, patterns: 'list[str] | None' = None, preserve_fixtures: bool = False, stream: 't.TextIO | None' = None, default_catalog: Union[str, NoneType] = None, default_catalog_dialect: str = '') -> sqlmesh.core.test.result.ModelTextTestResult:
87def run_model_tests( 88 tests: list[str], 89 models: UniqueKeyDict[str, Model], 90 config: C, 91 gateway: t.Optional[str] = None, 92 dialect: str | None = None, 93 verbosity: int = 1, 94 patterns: list[str] | None = None, 95 preserve_fixtures: bool = False, 96 stream: t.TextIO | None = None, 97 default_catalog: t.Optional[str] = None, 98 default_catalog_dialect: str = "", 99) -> ModelTextTestResult: 100 """Load and run tests. 101 102 Args: 103 tests: A list of tests to run, e.g. [tests/test_orders.yaml::test_single_order] 104 models: All models to use for expansion and mapping of physical locations. 105 verbosity: The verbosity level. 106 patterns: A list of patterns to match against. 107 preserve_fixtures: Preserve the fixture tables in the testing database, useful for debugging. 108 """ 109 loaded_tests = [] 110 for test in tests: 111 filename, test_name = test.split("::", maxsplit=1) if "::" in test else (test, "") 112 path = pathlib.Path(filename) 113 114 if test_name: 115 loaded_tests.append(load_model_test_file(path)[test_name]) 116 else: 117 loaded_tests.extend(load_model_test_file(path).values()) 118 119 if patterns: 120 loaded_tests = filter_tests_by_patterns(loaded_tests, patterns) 121 122 return run_tests( 123 loaded_tests, 124 models, 125 config, 126 gateway=gateway, 127 dialect=dialect, 128 verbosity=verbosity, 129 preserve_fixtures=preserve_fixtures, 130 stream=stream, 131 default_catalog=default_catalog, 132 default_catalog_dialect=default_catalog_dialect, 133 )
Load and run tests.
Arguments:
- tests: A list of tests to run, e.g. [tests/test_orders.yaml::test_single_order]
- models: All models to use for expansion and mapping of physical locations.
- verbosity: The verbosity level.
- patterns: A list of patterns to match against.
- preserve_fixtures: Preserve the fixture tables in the testing database, useful for debugging.