Skip to content

Commit d6a1d91

Browse files
committed
Add public API tests and logging for test debugging
1 parent 3b72a3e commit d6a1d91

File tree

4 files changed

+67
-8
lines changed

4 files changed

+67
-8
lines changed

ansible_base/rbac/models/content_type.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import inspect
2+
import logging
23
from collections import defaultdict
34
from typing import Any, Dict, Optional, Sequence, Tuple, Type, Union
45

@@ -10,6 +11,8 @@
1011

1112
from ..remote import RemoteObject, get_local_resource_prefix, get_resource_prefix
1213

14+
logger = logging.getLogger(__name__)
15+
1316

1417
class DABContentTypeManager(django_models.Manager["DABContentType"]):
1518
"""Manager storing DABContentType objects in a local cache like original ContentType.
@@ -73,12 +76,12 @@ def get_for_model(
7376
try:
7477
ct = self.get(service=service, app_label=opts.app_label, model=opts.model_name)
7578
except self.model.DoesNotExist:
79+
logger.warning(f'Could not find content type for {(service, opts.app_label, opts.model_name)}, so creating new')
7680
ct, _ = self.get_or_create(
7781
service=service,
7882
app_label=opts.app_label,
7983
model=opts.model_name,
80-
api_slug=f'{service}.{opts.model_name}',
81-
pk_field_type=model._meta.pk.db_type(connection),
84+
defaults=dict(api_slug=f'{service}.{opts.model_name}', pk_field_type=model._meta.pk.db_type(connection)),
8285
)
8386
self._add_to_cache(self.db, ct)
8487
return ct
@@ -138,6 +141,7 @@ def get_for_models(
138141
pk_field_type = opts_models[0]._meta.pk.db_type(connection)
139142
else:
140143
pk_field_type = 'integer'
144+
logger.warning(f'Could not find content type for {(service_create, app_label, model_name)}, so creating new, out of:\n{needed_models.keys()}')
141145
ct = self.create(
142146
service=service_create, app_label=app_label, model=model_name, api_slug=f'{service_create}.{model_name}', pk_field_type=pk_field_type
143147
)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import pytest
2+
3+
from ansible_base.rbac.models import DABContentType, DABPermission, RoleDefinition
4+
5+
6+
@pytest.fixture
7+
def foo_type():
8+
"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')
10+
11+
12+
@pytest.fixture
13+
def foo_permission(foo_type):
14+
return DABPermission.objects.create(codename='foo_foo', content_type=foo_type)
15+
16+
17+
@pytest.fixture
18+
def foo_rd(foo_type, foo_permission):
19+
return RoleDefinition.objects.create_from_permissions(
20+
name='Foo fooers for the foos in foo service', permissions=[foo_permission.api_slug], content_type=foo_type
21+
)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import pytest
2+
from django.test.utils import override_settings
3+
4+
from ansible_base.lib.utils.response import get_relative_url
5+
from ansible_base.rbac.models import RoleDefinition
6+
7+
8+
@pytest.mark.django_db
9+
def test_role_definition_list_remote_and_local(admin_api_client, inv_rd, foo_rd):
10+
url = get_relative_url('roledefinition-list')
11+
response = admin_api_client.get(url)
12+
assert response.status_code == 200
13+
assert response.data['next'] is None # sanity, will mess up test if there are more pages
14+
rd_by_name = {rd['name']: rd for rd in response.data['results']}
15+
assert inv_rd.name in rd_by_name
16+
assert foo_rd.name in rd_by_name
17+
# Assertion coppied from API test test_get_role_definition
18+
assert set(rd_by_name[inv_rd.name]['permissions']) == set(['aap.change_inventory', 'aap.view_inventory'])
19+
assert rd_by_name[foo_rd.name]['permissions'] == ['foo.foo_foo']
20+
21+
22+
@pytest.mark.django_db
23+
@pytest.mark.skip
24+
def test_create_remote_role_definition(admin_api_client, foo_type, foo_permission):
25+
"""
26+
Test creation of a custom, remote role definition.
27+
"""
28+
url = get_relative_url("roledefinition-list")
29+
data = dict(name='foo-foo-foo-custom', description='bar', permissions=[foo_permission.api_slug], content_type=foo_type.api_slug)
30+
response = admin_api_client.post(url, data=data, format="json")
31+
assert response.status_code == 201, response.data
32+
assert response.data['name'] == 'foo-foo-foo-custom'
33+
assert response.data['permissions'] == ['foo.foo_foo']

test_app/tests/rbac/remote/test_remote_models.py renamed to test_app/tests/rbac/remote/test_remote_assignment.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55

66

77
@pytest.mark.django_db
8-
def test_give_remote_permission(rando):
9-
foo_type = DABContentType.objects.create(service='foo', model='foo', app_label='foo')
10-
assert foo_type.service == 'foo'
11-
DABPermission.objects.create(codename='foo_foo', content_type=foo_type)
12-
rd = RoleDefinition.objects.create_from_permissions(name='Foo fooers for the foos in foo service', permissions=['foo.foo_foo'], content_type=foo_type)
8+
def test_give_remote_permission(rando, foo_type, foo_permission, foo_rd):
9+
assert foo_type.service == 'foo' # a place, a domain, a server, known as foo
10+
assert foo_type.api_slug == 'foo.foo' # there lives a foo in foo
11+
12+
assert foo_permission.api_slug == 'foo.foo_foo' # expression of the ability that one may foo a foo
13+
1314
a_foo = RemoteObject(content_type=foo_type, object_id=42)
14-
assignment = rd.give_permission(rando, a_foo)
15+
assignment = foo_rd.give_permission(rando, a_foo)
1516

1617
assignment = RoleUserAssignment.objects.get(pk=assignment.pk)
1718
assert isinstance(assignment.content_object, RemoteObject)

0 commit comments

Comments
 (0)