|
17 | 17 |
|
18 | 18 | import sqlmesh.core.constants |
19 | 19 | from sqlmesh.cli.project_init import init_example_project |
| 20 | +from sqlmesh.core.audit import StandaloneAudit |
20 | 21 | from sqlmesh.core.console import TerminalConsole |
21 | 22 | from sqlmesh.core import dialect as d, constants as c |
22 | 23 | from sqlmesh.core.config import ( |
@@ -276,6 +277,78 @@ def test_render_seed_model(sushi_context, assert_exp_eq): |
276 | 277 | ) |
277 | 278 |
|
278 | 279 |
|
| 280 | +@pytest.mark.slow |
| 281 | +def test_load_only_hydrates_remote_snapshots_missing_locally(sushi_context: Context) -> None: |
| 282 | + prod = sushi_context.state_reader.get_environment("prod") |
| 283 | + assert prod is not None |
| 284 | + sushi_context._projects = {"local_project"} |
| 285 | + |
| 286 | + local_node_names = {*sushi_context.models, *sushi_context.standalone_audits} |
| 287 | + expected_remote_names = { |
| 288 | + snapshot_info.name |
| 289 | + for snapshot_info in prod.snapshots |
| 290 | + if snapshot_info.name not in local_node_names |
| 291 | + } |
| 292 | + assert len(expected_remote_names) < len(prod.snapshots) |
| 293 | + |
| 294 | + with patch.object( |
| 295 | + sushi_context.state_reader, |
| 296 | + "get_snapshots", |
| 297 | + wraps=sushi_context.state_reader.get_snapshots, |
| 298 | + ) as get_snapshots_mock: |
| 299 | + sushi_context.load(update_schemas=False) |
| 300 | + |
| 301 | + load_snapshot_names = { |
| 302 | + snapshot_info.name |
| 303 | + for call_args in get_snapshots_mock.call_args_list |
| 304 | + for snapshot_info in call_args.args[0] |
| 305 | + } |
| 306 | + assert load_snapshot_names == expected_remote_names |
| 307 | + |
| 308 | + |
| 309 | +@pytest.mark.slow |
| 310 | +def test_load_hydrates_opposite_type_snapshot_name_collision( |
| 311 | + sushi_context: Context, make_snapshot: t.Callable |
| 312 | +) -> None: |
| 313 | + prod = sushi_context.state_reader.get_environment("prod") |
| 314 | + assert prod is not None |
| 315 | + sushi_context._projects = {"local_project"} |
| 316 | + |
| 317 | + local_model = next(iter(sushi_context.models.values())) |
| 318 | + remote_audit_snapshot = make_snapshot( |
| 319 | + StandaloneAudit( |
| 320 | + name=local_model.fqn, |
| 321 | + query=parse_one("SELECT NULL LIMIT 0"), |
| 322 | + project="remote_project", |
| 323 | + ) |
| 324 | + ) |
| 325 | + remote_audit_snapshot.categorize_as(SnapshotChangeCategory.BREAKING) |
| 326 | + prod_with_collision = prod.copy( |
| 327 | + update={"snapshots_": [*prod.snapshots, remote_audit_snapshot.table_info]} |
| 328 | + ) |
| 329 | + |
| 330 | + with ( |
| 331 | + patch.object( |
| 332 | + sushi_context.state_reader, |
| 333 | + "get_environment", |
| 334 | + return_value=prod_with_collision, |
| 335 | + ), |
| 336 | + patch.object( |
| 337 | + sushi_context.state_reader, |
| 338 | + "get_snapshots", |
| 339 | + wraps=sushi_context.state_reader.get_snapshots, |
| 340 | + ) as get_snapshots_mock, |
| 341 | + ): |
| 342 | + sushi_context.load(update_schemas=False) |
| 343 | + |
| 344 | + requested_snapshot_names = { |
| 345 | + snapshot_info.name |
| 346 | + for call_args in get_snapshots_mock.call_args_list |
| 347 | + for snapshot_info in call_args.args[0] |
| 348 | + } |
| 349 | + assert remote_audit_snapshot.name in requested_snapshot_names |
| 350 | + |
| 351 | + |
279 | 352 | @pytest.mark.slow |
280 | 353 | def test_diff(sushi_context: Context, mocker: MockerFixture): |
281 | 354 | mock_console = mocker.Mock() |
|
0 commit comments