mirror of
https://github.com/ansible/awx.git
synced 2026-05-17 14:27:42 -02:30
update tests for new call pattern for capabilities prefetch
This commit is contained in:
@@ -676,9 +676,9 @@ class UnifiedJobTemplateSerializer(BaseSerializer):
|
|||||||
if self.parent:
|
if self.parent:
|
||||||
serializer.parent = self.parent
|
serializer.parent = self.parent
|
||||||
serializer.polymorphic_base = self
|
serializer.polymorphic_base = self
|
||||||
# Exclude certain models from capabilities prefetch
|
# capabilities prefetch is only valid for these models
|
||||||
if isinstance(obj, (Project, InventorySource, SystemJobTemplate)):
|
if not isinstance(obj, (JobTemplate, WorkflowJobTemplate)):
|
||||||
obj.capabilities_prefetch = None
|
serializer.capabilities_prefetch = None
|
||||||
return serializer.to_representation(obj)
|
return serializer.to_representation(obj)
|
||||||
else:
|
else:
|
||||||
return super(UnifiedJobTemplateSerializer, self).to_representation(obj)
|
return super(UnifiedJobTemplateSerializer, self).to_representation(obj)
|
||||||
@@ -761,6 +761,11 @@ class UnifiedJobSerializer(BaseSerializer):
|
|||||||
serializer_class = WorkflowJobSerializer
|
serializer_class = WorkflowJobSerializer
|
||||||
if serializer_class:
|
if serializer_class:
|
||||||
serializer = serializer_class(instance=obj, context=self.context)
|
serializer = serializer_class(instance=obj, context=self.context)
|
||||||
|
# preserve links for list view
|
||||||
|
if self.parent:
|
||||||
|
serializer.parent = self.parent
|
||||||
|
serializer.polymorphic_base = self
|
||||||
|
# TODO: restrict models for capabilities prefetch, when it is added
|
||||||
ret = serializer.to_representation(obj)
|
ret = serializer.to_representation(obj)
|
||||||
else:
|
else:
|
||||||
ret = super(UnifiedJobSerializer, self).to_representation(obj)
|
ret = super(UnifiedJobSerializer, self).to_representation(obj)
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ from django.test.client import RequestFactory
|
|||||||
|
|
||||||
from awx.main.models import Role, Group, UnifiedJobTemplate, JobTemplate
|
from awx.main.models import Role, Group, UnifiedJobTemplate, JobTemplate
|
||||||
from awx.main.access import access_registry
|
from awx.main.access import access_registry
|
||||||
from awx.main.utils import cache_list_capabilities
|
from awx.main.utils import prefetch_page_capabilities
|
||||||
from awx.api.serializers import JobTemplateSerializer
|
from awx.api.serializers import JobTemplateSerializer, UnifiedJobTemplateSerializer
|
||||||
|
|
||||||
# This file covers special-cases of displays of user_capabilities
|
# This file covers special-cases of displays of user_capabilities
|
||||||
# general functionality should be covered fully by unit tests, see:
|
# general functionality should be covered fully by unit tests, see:
|
||||||
@@ -253,35 +253,52 @@ def test_user_roles_unattach_functional(organization, alice, bob, get):
|
|||||||
def test_prefetch_jt_capabilities(job_template, rando):
|
def test_prefetch_jt_capabilities(job_template, rando):
|
||||||
job_template.execute_role.members.add(rando)
|
job_template.execute_role.members.add(rando)
|
||||||
qs = JobTemplate.objects.all()
|
qs = JobTemplate.objects.all()
|
||||||
cache_list_capabilities(qs, ['admin', 'execute'], JobTemplate, rando)
|
mapping = prefetch_page_capabilities(JobTemplate, qs, ['admin', 'execute'], rando)
|
||||||
assert qs[0].capabilities_cache == {'edit': False, 'start': True}
|
assert mapping[job_template.id] == {'edit': False, 'start': True}
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_prefetch_ujt_job_template_capabilities(alice, bob, job_template):
|
def test_prefetch_ujt_job_template_capabilities(alice, bob, job_template):
|
||||||
job_template.execute_role.members.add(alice)
|
job_template.execute_role.members.add(alice)
|
||||||
qs = UnifiedJobTemplate.objects.all()
|
qs = UnifiedJobTemplate.objects.all()
|
||||||
cache_list_capabilities(qs, ['admin', 'execute'], UnifiedJobTemplate, alice)
|
mapping = prefetch_page_capabilities(UnifiedJobTemplate, qs, ['admin', 'execute'], alice)
|
||||||
assert qs[0].capabilities_cache == {'edit': False, 'start': True}
|
assert mapping[job_template.id] == {'edit': False, 'start': True}
|
||||||
qs = UnifiedJobTemplate.objects.all()
|
qs = UnifiedJobTemplate.objects.all()
|
||||||
cache_list_capabilities(qs, ['admin', 'execute'], UnifiedJobTemplate, bob)
|
mapping = prefetch_page_capabilities(UnifiedJobTemplate, qs, ['admin', 'execute'], bob)
|
||||||
assert qs[0].capabilities_cache == {'edit': False, 'start': False}
|
assert mapping[job_template.id] == {'edit': False, 'start': False}
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_prefetch_ujt_project_capabilities(alice, project):
|
def test_prefetch_ujt_project_capabilities(alice, project, job_template, mocker):
|
||||||
project.update_role.members.add(alice)
|
project.update_role.members.add(alice)
|
||||||
qs = UnifiedJobTemplate.objects.all()
|
qs = UnifiedJobTemplate.objects.all()
|
||||||
cache_list_capabilities(qs, ['admin', 'execute'], UnifiedJobTemplate, alice)
|
|
||||||
assert qs[0].capabilities_cache == {}
|
class MockObj:
|
||||||
|
pass
|
||||||
|
|
||||||
|
view = MockObj()
|
||||||
|
view.request = MockObj()
|
||||||
|
view.request.user = alice
|
||||||
|
view.request.method = 'GET'
|
||||||
|
view.kwargs = {}
|
||||||
|
|
||||||
|
list_serializer = UnifiedJobTemplateSerializer(qs, many=True, context={'view': view})
|
||||||
|
|
||||||
|
# Project form of UJT serializer does not fill in or reference the prefetch dict
|
||||||
|
list_serializer.child.to_representation(project)
|
||||||
|
assert 'capability_map' not in list_serializer.child.context
|
||||||
|
|
||||||
|
# Models for which the prefetch is valid for do
|
||||||
|
list_serializer.child.to_representation(job_template)
|
||||||
|
assert set(list_serializer.child.context['capability_map'][job_template.id].keys()) == set(('copy', 'edit', 'start'))
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_prefetch_group_capabilities(group, rando):
|
def test_prefetch_group_capabilities(group, rando):
|
||||||
group.inventory.adhoc_role.members.add(rando)
|
group.inventory.adhoc_role.members.add(rando)
|
||||||
qs = Group.objects.all()
|
qs = Group.objects.all()
|
||||||
cache_list_capabilities(qs, ['inventory.admin', 'inventory.adhoc'], Group, rando)
|
mapping = prefetch_page_capabilities(Group, qs, ['inventory.admin', 'inventory.adhoc'], rando)
|
||||||
assert qs[0].capabilities_cache == {'edit': False, 'adhoc': True}
|
assert mapping[group.id] == {'edit': False, 'adhoc': True}
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
@@ -291,18 +308,18 @@ def test_prefetch_jt_copy_capability(job_template, project, inventory, rando):
|
|||||||
job_template.save()
|
job_template.save()
|
||||||
|
|
||||||
qs = JobTemplate.objects.all()
|
qs = JobTemplate.objects.all()
|
||||||
cache_list_capabilities(qs, [{'copy': [
|
mapping = prefetch_page_capabilities(JobTemplate, qs, [{'copy': [
|
||||||
'project.use', 'inventory.use',
|
'project.use', 'inventory.use',
|
||||||
]}], JobTemplate, rando)
|
]}], rando)
|
||||||
assert qs[0].capabilities_cache == {'copy': False}
|
assert mapping[job_template.id] == {'copy': False}
|
||||||
|
|
||||||
project.use_role.members.add(rando)
|
project.use_role.members.add(rando)
|
||||||
inventory.use_role.members.add(rando)
|
inventory.use_role.members.add(rando)
|
||||||
|
|
||||||
cache_list_capabilities(qs, [{'copy': [
|
mapping = prefetch_page_capabilities(JobTemplate, qs, [{'copy': [
|
||||||
'project.use', 'inventory.use',
|
'project.use', 'inventory.use',
|
||||||
]}], JobTemplate, rando)
|
]}], rando)
|
||||||
assert qs[0].capabilities_cache == {'copy': True}
|
assert mapping[job_template.id] == {'copy': True}
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
|
|||||||
Reference in New Issue
Block a user