@@ -1774,6 +1774,72 @@ def test_new_forward_only_model_concurrent_versions(init_and_plan_context: t.Cal
17741774 assert df .to_dict () == {"ds" : {0 : "2023-01-07" }, "b" : {0 : None }}
17751775
17761776
1777+ @freeze_time ("2023-01-08 15:00:00" )
1778+ def test_new_forward_only_model_same_dev_environment (init_and_plan_context : t .Callable ):
1779+ context , plan = init_and_plan_context ("examples/sushi" )
1780+ context .apply (plan )
1781+
1782+ new_model_expr = d .parse (
1783+ """
1784+ MODEL (
1785+ name memory.sushi.new_model,
1786+ kind INCREMENTAL_BY_TIME_RANGE (
1787+ time_column ds,
1788+ forward_only TRUE,
1789+ on_destructive_change 'allow',
1790+ ),
1791+ );
1792+
1793+ SELECT '2023-01-07' AS ds, 1 AS a;
1794+ """
1795+ )
1796+ new_model = load_sql_based_model (new_model_expr )
1797+
1798+ # Add the first version of the model and apply it to dev.
1799+ context .upsert_model (new_model )
1800+ snapshot_a = context .get_snapshot (new_model .name )
1801+ plan_a = context .plan ("dev" , no_prompts = True )
1802+ snapshot_a = plan_a .snapshots [snapshot_a .snapshot_id ]
1803+
1804+ assert snapshot_a .snapshot_id in plan_a .context_diff .new_snapshots
1805+ assert snapshot_a .snapshot_id in plan_a .context_diff .added
1806+ assert snapshot_a .change_category == SnapshotChangeCategory .BREAKING
1807+
1808+ context .apply (plan_a )
1809+
1810+ df = context .fetchdf ("SELECT * FROM memory.sushi__dev.new_model" )
1811+ assert df .to_dict () == {"ds" : {0 : "2023-01-07" }, "a" : {0 : 1 }}
1812+
1813+ new_model_alt_expr = d .parse (
1814+ """
1815+ MODEL (
1816+ name memory.sushi.new_model,
1817+ kind INCREMENTAL_BY_TIME_RANGE (
1818+ time_column ds,
1819+ forward_only TRUE,
1820+ on_destructive_change 'allow',
1821+ ),
1822+ );
1823+
1824+ SELECT '2023-01-07' AS ds, 1 AS b;
1825+ """
1826+ )
1827+ new_model_alt = load_sql_based_model (new_model_alt_expr )
1828+
1829+ # Add the second version of the model and apply it to the same environment.
1830+ context .upsert_model (new_model_alt )
1831+ snapshot_b = context .get_snapshot (new_model_alt .name )
1832+
1833+ context .invalidate_environment ("dev" , sync = True )
1834+ plan_b = context .plan ("dev" , no_prompts = True )
1835+ snapshot_b = plan_b .snapshots [snapshot_b .snapshot_id ]
1836+
1837+ context .apply (plan_b )
1838+
1839+ df = context .fetchdf ("SELECT * FROM memory.sushi__dev.new_model" ).replace ({np .nan : None })
1840+ assert df .to_dict () == {"ds" : {0 : "2023-01-07" }, "b" : {0 : 1 }}
1841+
1842+
17771843def test_plan_twice_with_star_macro_yields_no_diff (tmp_path : Path ):
17781844 init_example_project (tmp_path , dialect = "duckdb" )
17791845
@@ -2561,7 +2627,7 @@ def get_default_catalog_and_non_tables(
25612627 ) = get_default_catalog_and_non_tables (metadata , context .default_catalog )
25622628 assert len (prod_views ) == 13
25632629 assert len (dev_views ) == 0
2564- assert len (user_default_tables ) == 13
2630+ assert len (user_default_tables ) == 16
25652631 assert state_metadata .schemas == ["sqlmesh" ]
25662632 assert {x .sql () for x in state_metadata .qualified_tables }.issuperset (
25672633 {
@@ -2580,7 +2646,7 @@ def get_default_catalog_and_non_tables(
25802646 ) = get_default_catalog_and_non_tables (metadata , context .default_catalog )
25812647 assert len (prod_views ) == 13
25822648 assert len (dev_views ) == 13
2583- assert len (user_default_tables ) == 13
2649+ assert len (user_default_tables ) == 16
25842650 assert len (non_default_tables ) == 0
25852651 assert state_metadata .schemas == ["sqlmesh" ]
25862652 assert {x .sql () for x in state_metadata .qualified_tables }.issuperset (
@@ -2600,7 +2666,7 @@ def get_default_catalog_and_non_tables(
26002666 ) = get_default_catalog_and_non_tables (metadata , context .default_catalog )
26012667 assert len (prod_views ) == 13
26022668 assert len (dev_views ) == 26
2603- assert len (user_default_tables ) == 13
2669+ assert len (user_default_tables ) == 16
26042670 assert len (non_default_tables ) == 0
26052671 assert state_metadata .schemas == ["sqlmesh" ]
26062672 assert {x .sql () for x in state_metadata .qualified_tables }.issuperset (
@@ -2621,7 +2687,7 @@ def get_default_catalog_and_non_tables(
26212687 ) = get_default_catalog_and_non_tables (metadata , context .default_catalog )
26222688 assert len (prod_views ) == 13
26232689 assert len (dev_views ) == 13
2624- assert len (user_default_tables ) == 13
2690+ assert len (user_default_tables ) == 16
26252691 assert len (non_default_tables ) == 0
26262692 assert state_metadata .schemas == ["sqlmesh" ]
26272693 assert {x .sql () for x in state_metadata .qualified_tables }.issuperset (
0 commit comments