enforce consistently setting view search_fields

This commit is contained in:
AlanCoding
2018-05-14 10:12:49 -04:00
parent 0f98ed5046
commit ec7f1c2540
2 changed files with 101 additions and 0 deletions

View File

@@ -3,6 +3,10 @@ import mock
# Django REST Framework
from rest_framework import exceptions
from rest_framework.generics import ListAPIView
# Django
from django.core.urlresolvers import RegexURLResolver, RegexURLPattern
# AWX
from awx.main.views import ApiErrorView
@@ -52,3 +56,44 @@ def test_disable_post_on_v1_inventory_source_list(version, supports_post):
inv_source_list.request = mock.MagicMock()
with mock.patch('awx.api.views.get_request_version', return_value=version):
assert ('POST' in inv_source_list.allowed_methods) == supports_post
def test_views_have_search_fields():
from awx.api.urls import urlpatterns as api_patterns
patterns = set([])
url_views = set([])
# Add recursive URL patterns
unprocessed = set(api_patterns)
while unprocessed:
to_process = unprocessed.copy()
unprocessed = set([])
for pattern in to_process:
if hasattr(pattern, 'lookup_str') and not pattern.lookup_str.startswith('awx.api'):
continue
patterns.add(pattern)
if isinstance(pattern, RegexURLResolver):
for sub_pattern in pattern.url_patterns:
if sub_pattern not in patterns:
unprocessed.add(sub_pattern)
# Get view classes
for pattern in patterns:
if isinstance(pattern, RegexURLPattern) and hasattr(pattern.callback, 'view_class'):
cls = pattern.callback.view_class
if issubclass(cls, ListAPIView):
url_views.add(pattern.callback.view_class)
# Gather any views that don't have search fields defined
views_missing_search = []
for View in url_views:
view = View()
if not hasattr(view, 'search_fields') or len(view.search_fields) == 0:
views_missing_search.append(view)
if views_missing_search:
raise Exception('{} views do not have search fields defined:\n{}'.format(
len(views_missing_search),
'\n'.join([
v.__class__.__name__ + ' (model: {})'.format(getattr(v, 'model', type(None)).__name__)
for v in views_missing_search
]))
)