|
3 | 3 | import pytest |
4 | 4 |
|
5 | 5 | from ansible_base.lib.utils.response import get_relative_url |
6 | | -from ansible_base.rbac.models import DABContentType, DABPermission |
| 6 | +from ansible_base.rbac.models import DABContentType, DABPermission, RoleDefinition |
| 7 | +from test_app.models import Team, User |
7 | 8 |
|
8 | 9 |
|
9 | 10 | @pytest.mark.django_db |
@@ -196,6 +197,44 @@ def test_unassign_endpoint_for_team(team, org_inv_rd, inventory, admin_api_clien |
196 | 197 | assert not rando.has_obj_perm(inventory, 'change') |
197 | 198 |
|
198 | 199 |
|
| 200 | +@pytest.mark.django_db |
| 201 | +@pytest.mark.parametrize('actor_type', ['user', 'team']) |
| 202 | +def test_assign_and_unassign_system_role(inventory, admin_api_client, actor_type, organization, member_rd): |
| 203 | + if actor_type == 'user': |
| 204 | + actor = User.objects.create(username='user1') |
| 205 | + user = actor |
| 206 | + else: |
| 207 | + actor = Team.objects.create(name='random_team', organization=organization) |
| 208 | + user = User.objects.create(username='user1') |
| 209 | + member_rd.give_permission(user, actor) |
| 210 | + |
| 211 | + rd = RoleDefinition.objects.managed.sys_auditor |
| 212 | + assert 'view_inventory' in set(rd.permissions.values_list('codename', flat=True)) |
| 213 | + assert not user.has_obj_perm(inventory, 'view') |
| 214 | + |
| 215 | + url = get_relative_url(f'service{actor_type}assignment-assign') |
| 216 | + data = {"role_definition": rd.name, f"{actor_type}_ansible_id": str(actor.resource.ansible_id)} |
| 217 | + response = admin_api_client.post(url, data) |
| 218 | + assert response.status_code == 201, response.data |
| 219 | + if hasattr(actor, '_singleton_permissions'): |
| 220 | + delattr(actor, '_singleton_permissions') |
| 221 | + assert user.has_obj_perm(inventory, 'view') # gave system wide view permission |
| 222 | + |
| 223 | + # Second try, response code indicates global assignment already exists |
| 224 | + response = admin_api_client.post(url, data=data) |
| 225 | + assert response.status_code == 200, response.data |
| 226 | + |
| 227 | + unassign_url = get_relative_url(f'service{actor_type}assignment-unassign') |
| 228 | + response = admin_api_client.post(unassign_url, data) |
| 229 | + assert response.status_code == 204, response.data |
| 230 | + if hasattr(actor, '_singleton_permissions'): |
| 231 | + delattr(actor, '_singleton_permissions') |
| 232 | + assert not user.has_obj_perm(inventory, 'view') # permission removed |
| 233 | + |
| 234 | + response = admin_api_client.post(unassign_url, data) |
| 235 | + assert response.status_code == 200, response.data |
| 236 | + |
| 237 | + |
199 | 238 | @pytest.mark.django_db |
200 | 239 | def test_filter_assignment_list(admin_api_client, rando, inv_rd, view_inv_rd, org_inv_rd, inventory): |
201 | 240 | inv_rd.give_permission(rando, inventory) |
|
0 commit comments