Skip to content

Commit 6fe0e45

Browse files
committed
add tests for the snapshot definition
1 parent fbfd81a commit 6fe0e45

1 file changed

Lines changed: 159 additions & 0 deletions

File tree

tests/core/test_snapshot.py

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
table_name,
6565
TableNamingConvention,
6666
)
67+
from sqlmesh.core.config.common import VirtualEnvironmentMode
6768
from sqlmesh.utils import AttributeDict
6869
from sqlmesh.utils.date import DatetimeRanges, to_date, to_datetime, to_timestamp
6970
from sqlmesh.utils.errors import SQLMeshError, SignalEvalError
@@ -3341,3 +3342,161 @@ def test_partitioned_by_roundtrip(make_snapshot: t.Callable):
33413342

33423343
assert isinstance(deserialized.node, SqlModel)
33433344
assert deserialized.node.partitioned_by == snapshot.node.partitioned_by
3345+
3346+
3347+
def test_merge_intervals_virtual_environment_mode_full(make_snapshot):
3348+
model = SqlModel(
3349+
name="test_model",
3350+
kind=IncrementalByTimeRangeKind(time_column="ds"),
3351+
query=parse_one("SELECT 1, ds FROM parent_tbl"),
3352+
)
3353+
3354+
# Create source snapshot with intervals
3355+
source_snapshot = make_snapshot(model, virtual_environment_mode=VirtualEnvironmentMode.FULL)
3356+
source_snapshot.add_interval("2020-01-01", "2020-01-03")
3357+
source_snapshot.add_interval("2020-01-05", "2020-01-07")
3358+
3359+
# Create target snapshot with different fingerprint and virtual_environment_mode FULL
3360+
target_snapshot = make_snapshot(model, virtual_environment_mode=VirtualEnvironmentMode.FULL)
3361+
target_snapshot.fingerprint = SnapshotFingerprint(
3362+
data_hash="different", metadata_hash="different", parent_data_hash="different"
3363+
)
3364+
target_snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
3365+
3366+
# When virtual_environment_mode is FULL, intervals should be merged
3367+
target_snapshot.merge_intervals(source_snapshot)
3368+
3369+
assert target_snapshot.intervals == [
3370+
(to_timestamp("2020-01-01"), to_timestamp("2020-01-04")),
3371+
(to_timestamp("2020-01-05"), to_timestamp("2020-01-08")),
3372+
]
3373+
3374+
3375+
def test_merge_intervals_virtual_environment_mode_dev_only_paused_breaking(make_snapshot):
3376+
model = SqlModel(
3377+
name="test_model",
3378+
kind=IncrementalByTimeRangeKind(time_column="ds"),
3379+
query=parse_one("SELECT 1, ds FROM parent_tbl"),
3380+
)
3381+
3382+
# Create source snapshot with intervals
3383+
source_snapshot = make_snapshot(model, virtual_environment_mode=VirtualEnvironmentMode.DEV_ONLY)
3384+
source_snapshot.add_interval("2020-01-01", "2020-01-03")
3385+
source_snapshot.add_interval("2020-01-05", "2020-01-07")
3386+
3387+
# Create target snapshot with different fingerprint and virtual_environment_mode DEV_ONLY
3388+
target_snapshot = make_snapshot(model, virtual_environment_mode=VirtualEnvironmentMode.DEV_ONLY)
3389+
target_snapshot.fingerprint = SnapshotFingerprint(
3390+
data_hash="different", metadata_hash="different", parent_data_hash="different"
3391+
)
3392+
target_snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
3393+
3394+
# Ensure snapshot is paused (unpaused_ts is None)
3395+
target_snapshot.unpaused_ts = None
3396+
3397+
# When virtual_environment_mode is DEV_ONLY and snapshot is paused and breaking, intervals should NOT be merged
3398+
target_snapshot.merge_intervals(source_snapshot)
3399+
3400+
assert target_snapshot.intervals == []
3401+
3402+
3403+
def test_merge_intervals_virtual_environment_mode_dev_only_unpaused(make_snapshot):
3404+
model = SqlModel(
3405+
name="test_model",
3406+
kind=IncrementalByTimeRangeKind(time_column="ds"),
3407+
query=parse_one("SELECT 1, ds FROM parent_tbl"),
3408+
)
3409+
3410+
# Create source snapshot with intervals
3411+
source_snapshot = make_snapshot(model, virtual_environment_mode=VirtualEnvironmentMode.DEV_ONLY)
3412+
source_snapshot.add_interval("2020-01-01", "2020-01-03")
3413+
source_snapshot.add_interval("2020-01-05", "2020-01-07")
3414+
3415+
# Create target snapshot with different fingerprint and virtual_environment_mode DEV_ONLY
3416+
target_snapshot = make_snapshot(model, virtual_environment_mode=VirtualEnvironmentMode.DEV_ONLY)
3417+
target_snapshot.fingerprint = SnapshotFingerprint(
3418+
data_hash="different", metadata_hash="different", parent_data_hash="different"
3419+
)
3420+
target_snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
3421+
3422+
# Ensure snapshot is unpaused
3423+
target_snapshot.unpaused_ts = to_timestamp("2020-01-01")
3424+
3425+
# When snapshot is unpaused, intervals should be merged regardless of virtual_environment_mode
3426+
target_snapshot.merge_intervals(source_snapshot)
3427+
3428+
assert target_snapshot.intervals == [
3429+
(to_timestamp("2020-01-01"), to_timestamp("2020-01-04")),
3430+
(to_timestamp("2020-01-05"), to_timestamp("2020-01-08")),
3431+
]
3432+
3433+
3434+
def test_merge_intervals_virtual_environment_mode_dev_only_no_rebuild(make_snapshot):
3435+
model = SqlModel(
3436+
name="test_model",
3437+
kind=IncrementalByTimeRangeKind(time_column="ds"),
3438+
query=parse_one("SELECT 1, ds FROM parent_tbl"),
3439+
)
3440+
3441+
# Create source snapshot with intervals
3442+
source_snapshot = make_snapshot(model, virtual_environment_mode=VirtualEnvironmentMode.DEV_ONLY)
3443+
source_snapshot.add_interval("2020-01-01", "2020-01-03")
3444+
source_snapshot.add_interval("2020-01-05", "2020-01-07")
3445+
3446+
# Create target snapshot with different fingerprint and virtual_environment_mode DEV_ONLY
3447+
target_snapshot = make_snapshot(model, virtual_environment_mode=VirtualEnvironmentMode.DEV_ONLY)
3448+
target_snapshot.fingerprint = SnapshotFingerprint(
3449+
data_hash="different", metadata_hash="different", parent_data_hash="different"
3450+
)
3451+
target_snapshot.categorize_as(
3452+
SnapshotChangeCategory.FORWARD_ONLY
3453+
) # This is a no-rebuild category
3454+
3455+
# Ensure snapshot is paused
3456+
target_snapshot.unpaused_ts = None
3457+
3458+
# When change category is no-rebuild, intervals should be merged regardless of virtual_environment_mode
3459+
target_snapshot.merge_intervals(source_snapshot)
3460+
3461+
assert target_snapshot.intervals == [
3462+
(to_timestamp("2020-01-01"), to_timestamp("2020-01-04")),
3463+
(to_timestamp("2020-01-05"), to_timestamp("2020-01-08")),
3464+
]
3465+
3466+
3467+
@pytest.mark.parametrize(
3468+
"virtual_env_mode,is_deployable,expected_uses_name_as_is",
3469+
[
3470+
(VirtualEnvironmentMode.DEV_ONLY, True, True),
3471+
(VirtualEnvironmentMode.DEV_ONLY, False, False),
3472+
(VirtualEnvironmentMode.FULL, True, False),
3473+
(VirtualEnvironmentMode.FULL, False, False),
3474+
],
3475+
)
3476+
def test_table_name_virtual_environment_mode(
3477+
make_snapshot,
3478+
virtual_env_mode: VirtualEnvironmentMode,
3479+
is_deployable: bool,
3480+
expected_uses_name_as_is: bool,
3481+
):
3482+
model = SqlModel(
3483+
name="my_schema.my_model",
3484+
kind=IncrementalByTimeRangeKind(time_column="ds"),
3485+
query=parse_one("SELECT 1, ds"),
3486+
)
3487+
3488+
snapshot = make_snapshot(model, virtual_environment_mode=virtual_env_mode)
3489+
snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
3490+
3491+
table_name_result = snapshot.table_name(is_deployable=is_deployable)
3492+
3493+
if expected_uses_name_as_is:
3494+
assert table_name_result == '"my_schema"."my_model"'
3495+
else:
3496+
# Should contain the versioned table name with schema prefix
3497+
assert "sqlmesh__my_schema" in table_name_result
3498+
assert "my_schema__my_model" in table_name_result
3499+
if is_deployable:
3500+
assert table_name_result.endswith(snapshot.version)
3501+
else:
3502+
assert table_name_result.endswith(f"{snapshot.dev_version}__dev")

0 commit comments

Comments
 (0)