|
1 | 1 | import pytest |
| 2 | +from dbt.tests.adapter.incremental.test_incremental_predicates import ( |
| 3 | + BaseIncrementalPredicates, |
| 4 | + models__delete_insert_incremental_predicates_sql, |
| 5 | + seeds__expected_delete_insert_incremental_predicates_csv, |
| 6 | +) |
2 | 7 | from dbt.tests.adapter.incremental.test_incremental_unique_id import ( |
3 | 8 | BaseIncrementalUniqueKey, |
4 | 9 | models__duplicated_unary_unique_key_list_sql, |
|
124 | 129 |
|
125 | 130 | """ |
126 | 131 |
|
| 132 | +models__delete_insert_composite_keys_sql = """ |
| 133 | +{{ |
| 134 | + config( |
| 135 | + materialized='incremental', |
| 136 | + incremental_strategy='delete+insert', |
| 137 | + unique_key=['id', 'col'] |
| 138 | + ) |
| 139 | +}} |
| 140 | +select 1 as id, 1 as col |
| 141 | +union all |
| 142 | +select 1 as id, 3 as col |
| 143 | +union all |
| 144 | +select 3 as id, 1 as col |
| 145 | +union all |
| 146 | +select 3 as id, 3 as col |
| 147 | +
|
| 148 | +{% if is_incremental() %} |
| 149 | +
|
| 150 | +except |
| 151 | +(select 1 as id, 1 as col |
| 152 | +union all |
| 153 | +select 3 as id, 3 as col) |
| 154 | +
|
| 155 | +{% endif %} |
| 156 | +""" |
| 157 | + |
| 158 | +seeds__expected_delete_insert_composite_keys_csv = """id,col |
| 159 | +1,1 |
| 160 | +1,3 |
| 161 | +3,1 |
| 162 | +3,3 |
| 163 | +""" |
| 164 | + |
127 | 165 |
|
128 | 166 | class TrinoIncrementalUniqueKey(BaseIncrementalUniqueKey): |
129 | 167 | @pytest.fixture(scope="class") |
@@ -204,3 +242,34 @@ def test_temporary_table_location(self, project): |
204 | 242 | f'create table "{project.database}"."{project.test_schema}"."model__dbt_tmp"' in logs |
205 | 243 | ) |
206 | 244 | assert "location = 's3a://datalake/model__dbt_tmp'" in logs |
| 245 | + |
| 246 | + |
| 247 | +@pytest.mark.iceberg |
| 248 | +class TestIcebergCompositeUniqueKeys(BaseIncrementalPredicates): |
| 249 | + @pytest.fixture(scope="class") |
| 250 | + def seeds(self): |
| 251 | + return { |
| 252 | + "expected_delete_insert_incremental_predicates.csv": seeds__expected_delete_insert_incremental_predicates_csv, |
| 253 | + "expected_delete_insert_composite_keys.csv": seeds__expected_delete_insert_composite_keys_csv, |
| 254 | + } |
| 255 | + |
| 256 | + @pytest.fixture(scope="class") |
| 257 | + def models(self): |
| 258 | + return { |
| 259 | + "delete_insert_incremental_predicates.sql": models__delete_insert_incremental_predicates_sql, |
| 260 | + "delete_insert_composite_keys.sql": models__delete_insert_composite_keys_sql, |
| 261 | + } |
| 262 | + |
| 263 | + def test__incremental_predicates_composite_keys(self, project): |
| 264 | + """seed should match model after two incremental runs""" |
| 265 | + |
| 266 | + expected_fields = self.get_expected_fields( |
| 267 | + relation="expected_delete_insert_composite_keys", seed_rows=4 |
| 268 | + ) |
| 269 | + test_case_fields = self.get_test_fields( |
| 270 | + project, |
| 271 | + seed="expected_delete_insert_composite_keys", |
| 272 | + incremental_model="delete_insert_composite_keys", |
| 273 | + update_sql_file=None, |
| 274 | + ) |
| 275 | + self.check_scenario_correctness(expected_fields, test_case_fields, project) |
0 commit comments