From 7b78a2ebcc095e492f83a8ba1aa5721be8c83290 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Fri, 23 Feb 2018 10:44:15 -0500 Subject: [PATCH] update tests for new call pattern for capabilities prefetch --- awx/api/serializers.py | 11 +++- .../functional/api/test_rbac_displays.py | 55 ++++++++++++------- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 230435b00c..cd27473735 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -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) diff --git a/awx/main/tests/functional/api/test_rbac_displays.py b/awx/main/tests/functional/api/test_rbac_displays.py index fd03710ec9..c0931b50da 100644 --- a/awx/main/tests/functional/api/test_rbac_displays.py +++ b/awx/main/tests/functional/api/test_rbac_displays.py @@ -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