update tests for new call pattern for capabilities prefetch

This commit is contained in:
AlanCoding 2018-02-23 10:44:15 -05:00
parent ce9234df0f
commit 7b78a2ebcc
No known key found for this signature in database
GPG Key ID: FD2C3C012A72926B
2 changed files with 44 additions and 22 deletions

View File

@ -676,9 +676,9 @@ class UnifiedJobTemplateSerializer(BaseSerializer):
if self.parent:
serializer.parent = self.parent
serializer.polymorphic_base = self
# Exclude certain models from capabilities prefetch
if isinstance(obj, (Project, InventorySource, SystemJobTemplate)):
obj.capabilities_prefetch = None
# capabilities prefetch is only valid for these models
if not isinstance(obj, (JobTemplate, WorkflowJobTemplate)):
serializer.capabilities_prefetch = None
return serializer.to_representation(obj)
else:
return super(UnifiedJobTemplateSerializer, self).to_representation(obj)
@ -761,6 +761,11 @@ class UnifiedJobSerializer(BaseSerializer):
serializer_class = WorkflowJobSerializer
if serializer_class:
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)
else:
ret = super(UnifiedJobSerializer, self).to_representation(obj)

View File

@ -5,8 +5,8 @@ from django.test.client import RequestFactory
from awx.main.models import Role, Group, UnifiedJobTemplate, JobTemplate
from awx.main.access import access_registry
from awx.main.utils import cache_list_capabilities
from awx.api.serializers import JobTemplateSerializer
from awx.main.utils import prefetch_page_capabilities
from awx.api.serializers import JobTemplateSerializer, UnifiedJobTemplateSerializer
# This file covers special-cases of displays of user_capabilities
# 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):
job_template.execute_role.members.add(rando)
qs = JobTemplate.objects.all()
cache_list_capabilities(qs, ['admin', 'execute'], JobTemplate, rando)
assert qs[0].capabilities_cache == {'edit': False, 'start': True}
mapping = prefetch_page_capabilities(JobTemplate, qs, ['admin', 'execute'], rando)
assert mapping[job_template.id] == {'edit': False, 'start': True}
@pytest.mark.django_db
def test_prefetch_ujt_job_template_capabilities(alice, bob, job_template):
job_template.execute_role.members.add(alice)
qs = UnifiedJobTemplate.objects.all()
cache_list_capabilities(qs, ['admin', 'execute'], UnifiedJobTemplate, alice)
assert qs[0].capabilities_cache == {'edit': False, 'start': True}
mapping = prefetch_page_capabilities(UnifiedJobTemplate, qs, ['admin', 'execute'], alice)
assert mapping[job_template.id] == {'edit': False, 'start': True}
qs = UnifiedJobTemplate.objects.all()
cache_list_capabilities(qs, ['admin', 'execute'], UnifiedJobTemplate, bob)
assert qs[0].capabilities_cache == {'edit': False, 'start': False}
mapping = prefetch_page_capabilities(UnifiedJobTemplate, qs, ['admin', 'execute'], bob)
assert mapping[job_template.id] == {'edit': False, 'start': False}
@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)
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
def test_prefetch_group_capabilities(group, rando):
group.inventory.adhoc_role.members.add(rando)
qs = Group.objects.all()
cache_list_capabilities(qs, ['inventory.admin', 'inventory.adhoc'], Group, rando)
assert qs[0].capabilities_cache == {'edit': False, 'adhoc': True}
mapping = prefetch_page_capabilities(Group, qs, ['inventory.admin', 'inventory.adhoc'], rando)
assert mapping[group.id] == {'edit': False, 'adhoc': True}
@pytest.mark.django_db
@ -291,18 +308,18 @@ def test_prefetch_jt_copy_capability(job_template, project, inventory, rando):
job_template.save()
qs = JobTemplate.objects.all()
cache_list_capabilities(qs, [{'copy': [
mapping = prefetch_page_capabilities(JobTemplate, qs, [{'copy': [
'project.use', 'inventory.use',
]}], JobTemplate, rando)
assert qs[0].capabilities_cache == {'copy': False}
]}], rando)
assert mapping[job_template.id] == {'copy': False}
project.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',
]}], JobTemplate, rando)
assert qs[0].capabilities_cache == {'copy': True}
]}], rando)
assert mapping[job_template.id] == {'copy': True}
@pytest.mark.django_db