|
6 | 6 | from pathlib import Path |
7 | 7 | from unittest.mock import patch |
8 | 8 |
|
| 9 | +from sqlmesh.dbt.adapter import ParsetimeAdapter, RuntimeAdapter |
9 | 10 | from sqlmesh.dbt.util import DBT_VERSION |
10 | 11 |
|
11 | 12 | import pytest |
|
43 | 44 | OnAdditiveChange, |
44 | 45 | ) |
45 | 46 | from sqlmesh.core.state_sync.db.snapshot import _snapshot_to_json |
46 | | -from sqlmesh.dbt.builtin import _relation_info_to_relation, Config |
| 47 | +from sqlmesh.dbt.builtin import _relation_info_to_relation, Config, create_builtin_globals |
47 | 48 | from sqlmesh.dbt.common import Dependencies |
48 | 49 | from sqlmesh.dbt.column import ( |
49 | 50 | ColumnConfig, |
|
64 | 65 | ) |
65 | 66 | from sqlmesh.dbt.test import TestConfig |
66 | 67 | from sqlmesh.utils.errors import ConfigError, MacroEvalError, SQLMeshError |
67 | | -from sqlmesh.utils.jinja import MacroReference |
| 68 | +from sqlmesh.utils.jinja import JinjaMacroRegistry, MacroReference |
68 | 69 |
|
69 | 70 | pytestmark = [pytest.mark.dbt, pytest.mark.slow] |
70 | 71 |
|
@@ -2352,3 +2353,47 @@ def test_dynamic_var_names_in_macro(sushi_test_project: Project): |
2352 | 2353 | ) |
2353 | 2354 | converted_model = model_config.to_sqlmesh(context) |
2354 | 2355 | assert "dynamic_test_var" in converted_model.jinja_macros.global_objs["vars"] # type: ignore |
| 2356 | + |
| 2357 | + |
| 2358 | +@pytest.mark.xdist_group("dbt_manifest") |
| 2359 | +def test_execute_variable_parse_vs_runtime(sushi_test_dbt_context: Context): |
| 2360 | + execute_model = sushi_test_dbt_context.get_model('"memory"."sushi"."execute_test_model"') |
| 2361 | + parse_time_query = execute_model.render_query() |
| 2362 | + if parse_time_query: |
| 2363 | + parse_sql = parse_time_query.sql() |
| 2364 | + # should contain parse-time placeholders |
| 2365 | + assert "parse_time_placeholder" in parse_sql or "parse_time_context" in parse_sql |
| 2366 | + |
| 2367 | + runtime_query = execute_model.render_query_or_raise( |
| 2368 | + engine_adapter=sushi_test_dbt_context.engine_adapter |
| 2369 | + ) |
| 2370 | + runtime_sql = runtime_query.sql() |
| 2371 | + # At runtime, the macro should have executed the query and returned the result |
| 2372 | + assert "1" in runtime_sql or "runtime_context" in runtime_sql |
| 2373 | + |
| 2374 | + |
| 2375 | +@pytest.mark.xdist_group("dbt_manifest") |
| 2376 | +def test_execute_globals(mocker: MockerFixture): |
| 2377 | + # No engine adapter shoulde create parse adapter |
| 2378 | + parse_time_globals = create_builtin_globals( |
| 2379 | + jinja_macros=JinjaMacroRegistry(), |
| 2380 | + jinja_globals={}, |
| 2381 | + engine_adapter=None, |
| 2382 | + ) |
| 2383 | + |
| 2384 | + assert parse_time_globals["execute"] is False |
| 2385 | + assert parse_time_globals["flags"].WHICH == "parse" |
| 2386 | + assert isinstance(parse_time_globals["adapter"], ParsetimeAdapter) |
| 2387 | + |
| 2388 | + mock_engine_adapter = mocker.Mock() |
| 2389 | + |
| 2390 | + # Runtime globals should have execute=True and RuntimeAdapter |
| 2391 | + runtime_globals = create_builtin_globals( |
| 2392 | + jinja_macros=JinjaMacroRegistry(), |
| 2393 | + jinja_globals={}, |
| 2394 | + engine_adapter=mock_engine_adapter, |
| 2395 | + ) |
| 2396 | + |
| 2397 | + assert runtime_globals["execute"] is True |
| 2398 | + assert runtime_globals["flags"].WHICH == "run" |
| 2399 | + assert isinstance(runtime_globals["adapter"], RuntimeAdapter) |
0 commit comments