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