-
Notifications
You must be signed in to change notification settings - Fork 194
Expand file tree
/
Copy pathtest_tblproperties.py
More file actions
129 lines (110 loc) · 5.59 KB
/
test_tblproperties.py
File metadata and controls
129 lines (110 loc) · 5.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
from unittest.mock import Mock
import pytest
from dbt.exceptions import DbtRuntimeError
from dbt.adapters.databricks import constants
from dbt.adapters.databricks.global_state import GlobalState
from dbt.adapters.databricks.relation_configs.tblproperties import (
TblPropertiesConfig,
TblPropertiesProcessor,
)
from tests.unit import fixtures
class TestTblPropertiesProcessor:
def test_from_results__none(self):
results = {"show_tblproperties": None}
spec = TblPropertiesProcessor.from_relation_results(results)
assert spec == TblPropertiesConfig(tblproperties={})
def test_from_results__single(self):
results = {"show_tblproperties": fixtures.gen_tblproperties([["prop", "f1"]])}
spec = TblPropertiesProcessor.from_relation_results(results)
assert spec == TblPropertiesConfig(tblproperties={"prop": "f1"})
def test_from_results__multiple(self):
results = {
"show_tblproperties": fixtures.gen_tblproperties([["prop", "1"], ["other", "other"]])
}
spec = TblPropertiesProcessor.from_relation_results(results)
assert spec == TblPropertiesConfig(tblproperties={"prop": "1", "other": "other"})
def test_from_model_node__without_tblproperties(self):
model = Mock()
model.config.extra = {}
spec = TblPropertiesProcessor.from_relation_config(model)
assert spec == TblPropertiesConfig(tblproperties={})
def test_from_model_node__with_tblproperties(self):
model = Mock()
model.config.extra = {
"tblproperties": {"prop": 1},
}
spec = TblPropertiesProcessor.from_relation_config(model)
assert spec == TblPropertiesConfig(tblproperties={"prop": "1"})
def test_from_model_node__with_empty_tblproperties(self):
model = Mock()
model.config.extra = {"tblproperties": {}}
spec = TblPropertiesProcessor.from_relation_config(model)
assert spec == TblPropertiesConfig(tblproperties={})
def test_from_model_node__with_incorrect_tblproperties(self):
model = Mock()
model.config.extra = {"tblproperties": True}
with pytest.raises(
DbtRuntimeError,
match="tblproperties must be a dictionary",
):
_ = TblPropertiesProcessor.from_relation_config(model)
def test_from_model_node__with_uniform_iceberg_adds_properties(self):
GlobalState.set_use_managed_iceberg(False)
model = Mock()
model.config.extra = {
"table_format": constants.ICEBERG_TABLE_FORMAT,
"tblproperties": {"custom_prop": "value"},
}
spec = TblPropertiesProcessor.from_relation_config(model)
# Should have both custom property AND UniForm properties
assert spec == TblPropertiesConfig(
tblproperties={
"custom_prop": "value",
"delta.enableIcebergCompatV2": "true",
"delta.universalFormat.enabledFormats": constants.ICEBERG_TABLE_FORMAT,
}
)
def test_from_model_node__with_managed_iceberg_no_uniform_properties(self):
GlobalState.set_use_managed_iceberg(True)
model = Mock()
model.config.extra = {
"table_format": constants.ICEBERG_TABLE_FORMAT,
"tblproperties": {"custom_prop": "value"},
}
spec = TblPropertiesProcessor.from_relation_config(model)
# Should only have the custom property, NOT the UniForm properties
assert spec == TblPropertiesConfig(tblproperties={"custom_prop": "value"})
def test_from_model_node__with_iceberg_no_flag_no_properties(self):
GlobalState.set_use_managed_iceberg(None)
model = Mock()
model.config.extra = {
"table_format": constants.ICEBERG_TABLE_FORMAT,
"tblproperties": {},
}
spec = TblPropertiesProcessor.from_relation_config(model)
# Should not have UniForm properties without explicit use_managed_iceberg=False
assert spec == TblPropertiesConfig(tblproperties={})
class TestTblPropertiesConfig:
def test_get_diff__empty_and_some_exist(self):
# tblproperties are "set only" - when config has no tblproperties and relation has tblproperties,
# we don't unset the existing tblproperties
config_properties = TblPropertiesConfig(tblproperties={})
relation_properties = TblPropertiesConfig(tblproperties={"prop": "1"})
diff = config_properties.get_diff(relation_properties)
assert diff is None # No changes needed since we don't unset tblproperties
def test_get_diff__some_new_and_empty_existing(self):
config_properties = TblPropertiesConfig(tblproperties={"prop": "1"})
relation_properties = TblPropertiesConfig(tblproperties={})
diff = config_properties.get_diff(relation_properties)
assert diff == TblPropertiesConfig(tblproperties={"prop": "1"})
def test_get_diff__mixed_case(self):
# tblproperties are "set only" - only the new/updated tblproperties are included
config_properties = TblPropertiesConfig(tblproperties={"prop": "1", "other": "other"})
relation_properties = TblPropertiesConfig(tblproperties={"prop": "2", "c": "value"})
diff = config_properties.get_diff(relation_properties)
assert diff == TblPropertiesConfig(tblproperties={"prop": "1", "other": "other"})
def test_get_diff__no_changes(self):
config_properties = TblPropertiesConfig(tblproperties={"prop": "1"})
relation_properties = TblPropertiesConfig(tblproperties={"prop": "1"})
diff = config_properties.get_diff(relation_properties)
assert diff is None