@@ -2855,6 +2855,35 @@ def test_prod_restatement_plan_missing_model_in_dev(
28552855 )
28562856
28572857
2858+ @time_machine .travel ("2023-01-08 15:00:00 UTC" )
2859+ def test_plan_snapshot_table_exists_for_promoted_snapshot (init_and_plan_context : t .Callable ):
2860+ context , plan = init_and_plan_context ("examples/sushi" )
2861+ context .apply (plan )
2862+
2863+ model = context .get_model ("sushi.waiter_revenue_by_day" )
2864+ context .upsert_model (add_projection_to_model (t .cast (SqlModel , model )))
2865+
2866+ context .plan ("dev" , auto_apply = True , no_prompts = True , skip_tests = True )
2867+
2868+ # Drop the views and make sure SQLMesh recreates them later
2869+ top_waiters_snapshot = context .get_snapshot ("sushi.top_waiters" , raise_if_missing = True )
2870+ context .engine_adapter .drop_view (top_waiters_snapshot .table_name ())
2871+ context .engine_adapter .drop_view (top_waiters_snapshot .table_name (False ))
2872+
2873+ # Make the environment unfinalized to force recreation of all views in the virtual layer
2874+ context .state_sync .state_sync .engine_adapter .execute (
2875+ "UPDATE sqlmesh._environments SET finalized_ts = NULL WHERE name = 'dev'"
2876+ )
2877+
2878+ model = context .get_model ("sushi.customers" )
2879+ context .upsert_model (add_projection_to_model (t .cast (SqlModel , model )))
2880+
2881+ context .plan (
2882+ "dev" , select_models = ["sushi.customers" ], auto_apply = True , no_prompts = True , skip_tests = True
2883+ )
2884+ assert context .engine_adapter .table_exists (top_waiters_snapshot .table_name ())
2885+
2886+
28582887@time_machine .travel ("2023-01-08 15:00:00 UTC" )
28592888def test_plan_against_expired_environment (init_and_plan_context : t .Callable ):
28602889 context , plan = init_and_plan_context ("examples/sushi" )
0 commit comments