Skip to content

Commit 3f4e164

Browse files
committed
Test org level roles for remote models
1 parent 6613bda commit 3f4e164

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

test_app/tests/rbac/remote/conftest.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import pytest
22

3-
from ansible_base.rbac.models import DABContentType, DABPermission, RoleDefinition
3+
from ansible_base.rbac import permission_registry
4+
from ansible_base.rbac.models import DABPermission, RoleDefinition
5+
from test_app.models import Organization
46

57

68
@pytest.fixture
79
def foo_type():
810
"Idea is that this is a remote type, in this case, the foo type"
9-
return DABContentType.objects.create(service='foo', model='foo', app_label='foo')
11+
org_ct = permission_registry.content_type_model.objects.get_for_model(Organization)
12+
return permission_registry.content_type_model.objects.create(service='foo', model='foo', app_label='foo', parent_content_type=org_ct)
1013

1114

1215
@pytest.fixture
@@ -23,7 +26,7 @@ def foo_rd(foo_type, foo_permission):
2326

2427
@pytest.fixture
2528
def foo_type_uuid():
26-
return DABContentType.objects.create(service='foo', model='foo_uuid', app_label='foo', pk_field_type='uuid')
29+
return permission_registry.content_type_model.objects.create(service='foo', model='foo_uuid', app_label='foo', pk_field_type='uuid')
2730

2831

2932
@pytest.fixture

test_app/tests/rbac/remote/test_public_api_compat.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import pytest
44

55
from ansible_base.lib.utils.response import get_relative_url
6+
from ansible_base.rbac import permission_registry
67
from ansible_base.rbac.remote import RemoteObject
8+
from test_app.models import Organization
79

810
# Role Definitions
911

@@ -35,7 +37,7 @@ def test_create_remote_role_definition_for_remote(admin_api_client, foo_type, fo
3537

3638

3739
@pytest.mark.django_db
38-
def test_create_remote_role_definition_global(admin_api_client, foo_type, foo_permission):
40+
def test_create_remote_role_definition_global(admin_api_client, foo_permission):
3941
"Test creation of a system-wide role definition for a remote model"
4042
url = get_relative_url("roledefinition-list")
4143
data = dict(name='foo-foo-foo-global', description='bar', permissions=[foo_permission.api_slug], content_type=None)
@@ -45,6 +47,18 @@ def test_create_remote_role_definition_global(admin_api_client, foo_type, foo_pe
4547
assert response.data['permissions'] == ['foo.foo_foo']
4648

4749

50+
@pytest.mark.django_db
51+
def test_create_remote_role_definition_organization(admin_api_client, foo_permission):
52+
"Test creation of an organization-wide role definition for a remote model"
53+
url = get_relative_url("roledefinition-list")
54+
org_ct = permission_registry.content_type_model.objects.get_for_model(Organization)
55+
data = dict(name='foo-foo-foo-org', description='bar', permissions=[foo_permission.api_slug, 'shared.view_organization'], content_type=org_ct.api_slug)
56+
response = admin_api_client.post(url, data=data, format="json")
57+
assert response.status_code == 201, response.data
58+
assert response.data['name'] == 'foo-foo-foo-org'
59+
assert set(response.data['permissions']) == {'foo.foo_foo', 'shared.view_organization'}
60+
61+
4862
# Role User Assignments
4963

5064

test_app/tests/rbac/test_validators.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
from rest_framework.exceptions import ValidationError
77

88
from ansible_base.lib.utils.response import get_relative_url
9-
from ansible_base.rbac.models import RoleDefinition
9+
from ansible_base.rbac.models import DABPermission, RoleDefinition
1010
from ansible_base.rbac.permission_registry import permission_registry
11+
from ansible_base.rbac.remote import RemoteObject
1112
from ansible_base.rbac.validators import LocalValidators, permissions_allowed_for_role
1213
from test_app.models import Credential, Inventory, Organization
1314

@@ -146,13 +147,23 @@ def test_no_change_permission_without_view(enabled):
146147
@pytest.mark.parametrize('cls', permission_registry.all_registered_models)
147148
def test_db_model_validators_match(cls):
148149
"This is a code transition test, making sure new DB-backed methods match model-backed methods"
150+
151+
# Load in some remote types and permissions to make test meaningful
152+
org_ct = permission_registry.content_type_model.objects.get_for_model(Organization)
153+
foo_ct = permission_registry.content_type_model.objects.create(service='foo', model='foo', app_label='foo', parent_content_type=org_ct)
154+
DABPermission.objects.create(codename='foo_foo', content_type=foo_ct)
155+
149156
db_perms = permissions_allowed_for_role(cls)
150157
model_perms = LocalValidators.permissions_allowed_for_role(cls)
151158

152159
# convert data structure into sets because this test does not care about ordering
153160
for perms_structure in (db_perms, model_perms):
154161
tmp_structure = deepcopy(perms_structure)
155162
for main_model, codenames_list in tmp_structure.items():
163+
if issubclass(main_model, RemoteObject):
164+
# obviously the model method will not track permissions valid for remote model
165+
perms_structure.pop(main_model)
166+
continue
156167
perms_structure[main_model] = set(codenames_list)
157168

158169
assert db_perms == model_perms

0 commit comments

Comments
 (0)