Skip to content

Commit 2ac5969

Browse files
committed
improve tests
1 parent 1d7c7de commit 2ac5969

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed

tests/core/engine_adapter/test_base.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from sqlmesh.core.dialect import normalize_model_name
1515
from sqlmesh.core.engine_adapter import EngineAdapter, EngineAdapterWithIndexSupport
1616
from sqlmesh.core.engine_adapter.mixins import InsertOverwriteWithMergeMixin
17-
from sqlmesh.core.engine_adapter.shared import InsertOverwriteStrategy
17+
from sqlmesh.core.engine_adapter.shared import InsertOverwriteStrategy, DataObject
1818
from sqlmesh.core.schema_diff import SchemaDiffer, TableAlterOperation
1919
from sqlmesh.utils import columns_to_types_to_struct
2020
from sqlmesh.utils.date import to_ds
@@ -43,6 +43,23 @@ def test_create_view(make_mocked_engine_adapter: t.Callable):
4343
]
4444

4545

46+
def test_create_view_existing_data_object_type_mismatch(
47+
make_mocked_engine_adapter: t.Callable, mocker: MockerFixture
48+
):
49+
adapter = make_mocked_engine_adapter(EngineAdapter)
50+
mocker.patch.object(
51+
adapter,
52+
"_get_data_objects",
53+
return_value=[DataObject(schema="", name="test_view", type="table")],
54+
)
55+
adapter.create_view("test_view", parse_one("SELECT a FROM tbl"))
56+
57+
assert to_sql_calls(adapter) == [
58+
'DROP TABLE IF EXISTS "test_view"',
59+
'CREATE OR REPLACE VIEW "test_view" AS SELECT "a" FROM "tbl"',
60+
]
61+
62+
4663
def test_create_view_pandas(make_mocked_engine_adapter: t.Callable):
4764
adapter = make_mocked_engine_adapter(EngineAdapter)
4865
adapter.create_view("test_view", pd.DataFrame({"a": [1, 2, 3]}), replace=False)
@@ -2713,6 +2730,27 @@ def test_replace_query(make_mocked_engine_adapter: t.Callable, mocker: MockerFix
27132730
]
27142731

27152732

2733+
def test_replace_query_data_object_type_mismatch(
2734+
make_mocked_engine_adapter: t.Callable, mocker: MockerFixture
2735+
):
2736+
adapter = make_mocked_engine_adapter(EngineAdapter)
2737+
mocker.patch.object(
2738+
adapter,
2739+
"_get_data_objects",
2740+
return_value=[DataObject(schema="", name="test_table", type="view")],
2741+
)
2742+
2743+
adapter.replace_query(
2744+
"test_table", parse_one("SELECT a FROM tbl"), {"a": exp.DataType.build("INT")}
2745+
)
2746+
2747+
# TODO: Shouldn't we enforce that `a` is casted to an int?
2748+
assert to_sql_calls(adapter) == [
2749+
'DROP VIEW IF EXISTS "test_table"',
2750+
'CREATE OR REPLACE TABLE "test_table" AS SELECT CAST("a" AS INT) AS "a" FROM (SELECT "a" FROM "tbl") AS "_subquery"',
2751+
]
2752+
2753+
27162754
def test_replace_query_pandas(make_mocked_engine_adapter: t.Callable):
27172755
adapter = make_mocked_engine_adapter(EngineAdapter)
27182756
adapter.DEFAULT_BATCH_SIZE = 1

tests/core/test_integration.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2488,6 +2488,16 @@ def test_virtual_environment_mode_dev_only(init_and_plan_context: t.Callable):
24882488
intervals=[(to_timestamp("2023-01-07"), to_timestamp("2023-01-08"))],
24892489
),
24902490
]
2491+
assert plan_dev.context_diff.snapshots[context.get_snapshot(model.name).snapshot_id].intervals
2492+
assert plan_dev.context_diff.snapshots[
2493+
context.get_snapshot("sushi.top_waiters").snapshot_id
2494+
].intervals
2495+
assert plan_dev.context_diff.snapshots[
2496+
context.get_snapshot(model.name).snapshot_id
2497+
].dev_intervals
2498+
assert plan_dev.context_diff.snapshots[
2499+
context.get_snapshot("sushi.top_waiters").snapshot_id
2500+
].dev_intervals
24912501
context.apply(plan_dev)
24922502

24932503
# Make sure the waiter_revenue_by_day model is a table in prod and a view in dev
@@ -2539,6 +2549,9 @@ def test_virtual_environment_mode_dev_only_model_kind_change(init_and_plan_conte
25392549
prod_plan = context.plan_builder("prod", skip_tests=True).build()
25402550
assert prod_plan.missing_intervals
25412551
assert prod_plan.requires_backfill
2552+
assert not prod_plan.context_diff.snapshots[
2553+
context.get_snapshot(model.name).snapshot_id
2554+
].intervals
25422555
context.apply(prod_plan)
25432556
data_objects = context.engine_adapter.get_data_objects("sushi", {"top_waiters"})
25442557
assert len(data_objects) == 1
@@ -2553,6 +2566,9 @@ def test_virtual_environment_mode_dev_only_model_kind_change(init_and_plan_conte
25532566
prod_plan = context.plan_builder("prod", skip_tests=True).build()
25542567
assert prod_plan.requires_backfill
25552568
assert prod_plan.missing_intervals
2569+
assert not prod_plan.context_diff.snapshots[
2570+
context.get_snapshot(model.name).snapshot_id
2571+
].intervals
25562572
context.apply(prod_plan)
25572573
data_objects = context.engine_adapter.get_data_objects("sushi", {"top_waiters"})
25582574
assert len(data_objects) == 1
@@ -2565,6 +2581,24 @@ def test_virtual_environment_mode_dev_only_model_kind_change(init_and_plan_conte
25652581
prod_plan = context.plan_builder("prod", skip_tests=True).build()
25662582
assert prod_plan.requires_backfill
25672583
assert prod_plan.missing_intervals
2584+
assert not prod_plan.context_diff.snapshots[
2585+
context.get_snapshot(model.name).snapshot_id
2586+
].intervals
2587+
context.apply(prod_plan)
2588+
data_objects = context.engine_adapter.get_data_objects("sushi", {"top_waiters"})
2589+
assert len(data_objects) == 1
2590+
assert data_objects[0].type == "table"
2591+
2592+
# Change back to full
2593+
model = context.get_model("sushi.top_waiters")
2594+
model = model.copy(update={"kind": FullKind()})
2595+
context.upsert_model(model)
2596+
prod_plan = context.plan_builder("prod", skip_tests=True).build()
2597+
assert prod_plan.requires_backfill
2598+
assert prod_plan.missing_intervals
2599+
assert not prod_plan.context_diff.snapshots[
2600+
context.get_snapshot(model.name).snapshot_id
2601+
].intervals
25682602
context.apply(prod_plan)
25692603
data_objects = context.engine_adapter.get_data_objects("sushi", {"top_waiters"})
25702604
assert len(data_objects) == 1

0 commit comments

Comments
 (0)