|
8 | 8 | from tests.core.test_table_diff import create_test_console |
9 | 9 | import time_machine |
10 | 10 | from pytest_mock.plugin import MockerFixture |
11 | | -from sqlglot import parse_one |
| 11 | +from sqlglot import parse_one, exp |
12 | 12 |
|
| 13 | +from sqlmesh.core import dialect as d |
13 | 14 | from sqlmesh.core.context import Context |
14 | 15 | from sqlmesh.core.context_diff import ContextDiff |
15 | 16 | from sqlmesh.core.environment import EnvironmentNamingInfo, EnvironmentStatements |
16 | 17 | from sqlmesh.core.model import ( |
17 | 18 | ExternalModel, |
18 | 19 | FullKind, |
19 | 20 | IncrementalByTimeRangeKind, |
| 21 | + IncrementalUnmanagedKind, |
20 | 22 | SeedKind, |
21 | 23 | SeedModel, |
22 | 24 | SqlModel, |
@@ -1723,6 +1725,60 @@ def test_forward_only_models_model_kind_changed(make_snapshot, mocker: MockerFix |
1723 | 1725 | assert updated_snapshot.change_category == SnapshotChangeCategory.BREAKING |
1724 | 1726 |
|
1725 | 1727 |
|
| 1728 | +@pytest.mark.parametrize( |
| 1729 | + "partitioned_by, expected_change_category", |
| 1730 | + [ |
| 1731 | + ([], SnapshotChangeCategory.BREAKING), |
| 1732 | + ([d.parse_one("ds")], SnapshotChangeCategory.FORWARD_ONLY), |
| 1733 | + ], |
| 1734 | +) |
| 1735 | +def test_forward_only_models_model_kind_changed_to_incremental_by_time_range( |
| 1736 | + make_snapshot, |
| 1737 | + partitioned_by: t.List[exp.Expression], |
| 1738 | + expected_change_category: SnapshotChangeCategory, |
| 1739 | +): |
| 1740 | + snapshot = make_snapshot( |
| 1741 | + SqlModel( |
| 1742 | + name="a", |
| 1743 | + query=parse_one("select 1, ds"), |
| 1744 | + kind=IncrementalUnmanagedKind(), |
| 1745 | + partitioned_by=partitioned_by, |
| 1746 | + ) |
| 1747 | + ) |
| 1748 | + snapshot.categorize_as(SnapshotChangeCategory.BREAKING) |
| 1749 | + updated_snapshot = make_snapshot( |
| 1750 | + SqlModel( |
| 1751 | + name="a", |
| 1752 | + query=parse_one("select 3, ds"), |
| 1753 | + kind=IncrementalByTimeRangeKind(time_column="ds", forward_only=True), |
| 1754 | + ) |
| 1755 | + ) |
| 1756 | + updated_snapshot.previous_versions = snapshot.all_versions |
| 1757 | + |
| 1758 | + context_diff = ContextDiff( |
| 1759 | + environment="test_environment", |
| 1760 | + is_new_environment=True, |
| 1761 | + is_unfinalized_environment=False, |
| 1762 | + normalize_environment_name=True, |
| 1763 | + create_from="prod", |
| 1764 | + create_from_env_exists=True, |
| 1765 | + added=set(), |
| 1766 | + removed_snapshots={}, |
| 1767 | + modified_snapshots={updated_snapshot.name: (updated_snapshot, snapshot)}, |
| 1768 | + snapshots={updated_snapshot.snapshot_id: updated_snapshot}, |
| 1769 | + new_snapshots={updated_snapshot.snapshot_id: updated_snapshot}, |
| 1770 | + previous_plan_id=None, |
| 1771 | + previously_promoted_snapshot_ids=set(), |
| 1772 | + previous_finalized_snapshots=None, |
| 1773 | + previous_gateway_managed_virtual_layer=False, |
| 1774 | + gateway_managed_virtual_layer=False, |
| 1775 | + environment_statements=[], |
| 1776 | + ) |
| 1777 | + |
| 1778 | + PlanBuilder(context_diff, is_dev=True).build() |
| 1779 | + assert updated_snapshot.change_category == expected_change_category |
| 1780 | + |
| 1781 | + |
1726 | 1782 | def test_indirectly_modified_forward_only_model(make_snapshot, mocker: MockerFixture): |
1727 | 1783 | snapshot_a = make_snapshot(SqlModel(name="a", query=parse_one("select 1 as a, ds"))) |
1728 | 1784 | snapshot_a.categorize_as(SnapshotChangeCategory.BREAKING) |
|
0 commit comments