55from  requests .exceptions  import  HTTPError 
66
77from  ansible_base .authentication .models  import  AuthenticatorUser 
8+ from  ansible_base .rbac  import  permission_registry 
9+ from  ansible_base .rbac .models  import  RoleDefinition 
810from  ansible_base .resource_registry .models  import  Resource , service_id 
911from  ansible_base .resource_registry .resource_server  import  get_resource_server_config 
1012from  ansible_base .resource_registry .rest_client  import  ResourceAPIClient , ResourceRequestBody 
13+ from  test_app .models  import  Inventory 
1114
1215
1316@pytest .fixture  
@@ -182,7 +185,7 @@ def test_get_resource_404(resource_client):
182185
183186
184187@pytest .mark .django_db  
185- def  test_additional_data (resource_client , django_user_model , github_authenticator ):
188+ def  test_additional_data_read (resource_client , django_user_model , github_authenticator ):
186189    user  =  django_user_model .objects .create (username = "lisan_al_gaib" )
187190
188191    AuthenticatorUser .objects .create (provider = github_authenticator , user = user , uid = "different_uid" )
@@ -200,6 +203,30 @@ def test_additional_data(resource_client, django_user_model, github_authenticato
200203    assert  additional ["social_auth" ][0 ]["sso_server" ] ==  "https://github.com/login/oauth/authorize" 
201204
202205
206+ @pytest .mark .django_db  
207+ @pytest .mark .parametrize ('partial' , [True , False ]) 
208+ def  test_additional_data_write (resource_client , partial ):
209+     "Will remove a permission from a role definition using the additional_data field." 
210+     rd  =  RoleDefinition .objects .create_from_permissions (
211+         permissions = ['aap.change_inventory' , 'aap.view_inventory' ],
212+         name = 'change-inv-for-now' ,
213+         content_type = permission_registry .content_type_model .objects .get_for_model (Inventory ),
214+     )
215+     ansible_id  =  str (rd .resource .ansible_id )
216+ 
217+     # Need this to make a coherent PUT 
218+     resp  =  resource_client .get_resource (ansible_id )
219+     assert  resp .status_code  ==  200 
220+     ref  =  resp .json ()
221+ 
222+     data  =  ResourceRequestBody (additional_data = {'permissions' : ['aap.view_inventory' , 'fooland.action_unicorns' ]}, resource_data = ref ['resource_data' ])
223+     resp  =  resource_client .update_resource (ansible_id , data , partial = partial )
224+     assert  resp .status_code  ==  200 , resp .__dict__ 
225+ 
226+     # Removed the change permission 
227+     assert  {perm .api_slug  for  perm  in  rd .permissions .all ()} ==  {'aap.view_inventory' }
228+ 
229+ 
203230@pytest .mark .django_db  
204231def  test_validate_local_user (resource_client , admin_user , member_rd ):
205232    resp  =  resource_client .validate_local_user (username = admin_user .username , password = "password" )
0 commit comments