@@ -3185,6 +3185,7 @@ def test_grants_through_plan_apply(sushi_context, mocker):
3185
3185
from sqlmesh .core .model .meta import GrantsTargetLayer
3186
3186
3187
3187
model = sushi_context .get_model ("sushi.waiter_revenue_by_day" )
3188
+
3188
3189
mocker .patch .object (DuckDBEngineAdapter , "SUPPORTS_GRANTS" , True )
3189
3190
sync_grants_mock = mocker .patch .object (DuckDBEngineAdapter , "sync_grants_config" )
3190
3191
@@ -3206,18 +3207,20 @@ def test_grants_through_plan_apply(sushi_context, mocker):
3206
3207
3207
3208
sync_grants_mock .reset_mock ()
3208
3209
3210
+ new_grants = ({"select" : ["analyst" , "reporter" , "manager" ], "insert" : ["etl_user" ]},)
3209
3211
model_updated = model_with_grants .copy (
3210
3212
update = {
3211
3213
"query" : parse_one (model .query .sql () + " LIMIT 1000" ),
3212
- "grants" : { "select" : [ "analyst" , "reporter" , "manager" ], "insert" : [ "etl_user" ]} ,
3214
+ "grants" : new_grants ,
3213
3215
"stamp" : "update model and grants" ,
3214
3216
}
3215
3217
)
3216
3218
sushi_context .upsert_model (model_updated )
3217
3219
3218
3220
sushi_context .plan ("dev" , no_prompts = True , auto_apply = True )
3219
3221
3220
- assert sync_grants_mock .call_count == 2
3221
-
3222
- expected_grants = {"select" : ["analyst" , "reporter" , "manager" ], "insert" : ["etl_user" ]}
3223
- assert all (call [0 ][1 ] == expected_grants for call in sync_grants_mock .call_args_list )
3222
+ # Applies grants 3 times:
3223
+ # 2 x physical (duplicated): create, promote (will diff but won't apply since it's the same grants)
3224
+ # 1 x virtual
3225
+ assert sync_grants_mock .call_count == 3
3226
+ assert all (call [0 ][1 ] == new_grants for call in sync_grants_mock .call_args_list )
0 commit comments