docker.images/ansible.awx/awx-17.1.0/awx/main/tests/unit/test_views.py

94 lines
3.0 KiB
Python

import pytest
from unittest import mock
# Django REST Framework
from rest_framework import exceptions
from rest_framework.generics import ListAPIView
# AWX
from awx.main.views import ApiErrorView
from awx.api.views import JobList
from awx.api.generics import ListCreateAPIView, SubListAttachDetachAPIView
HTTP_METHOD_NAMES = [
'get',
'post',
'put',
'patch',
'delete',
'head',
'options',
'trace',
]
@pytest.fixture
def api_view_obj_fixture():
return ApiErrorView()
@pytest.mark.parametrize('method_name', HTTP_METHOD_NAMES)
def test_exception_view_allow_http_methods(method_name):
assert hasattr(ApiErrorView, method_name)
@pytest.mark.parametrize('method_name', HTTP_METHOD_NAMES)
def test_exception_view_raises_exception(api_view_obj_fixture, method_name):
request_mock = mock.MagicMock()
with pytest.raises(exceptions.APIException):
getattr(api_view_obj_fixture, method_name)(request_mock)
def test_disable_post_on_v2_jobs_list():
job_list = JobList()
job_list.request = mock.MagicMock()
assert ('POST' in job_list.allowed_methods) is False
def test_views_have_search_fields(all_views):
# Gather any views that don't have search fields defined
views_missing_search = []
for View in all_views:
if not issubclass(View, ListAPIView):
continue
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
]))
)
def test_global_creation_always_possible(all_views):
"""To not make life very difficult for clients, this test
asserts that all creatable resources can be created by
POSTing to the global resource list
"""
views_by_model = {}
for View in all_views:
if not getattr(View, 'deprecated', False) and issubclass(View, ListAPIView) and hasattr(View, 'model'):
views_by_model.setdefault(View.model, []).append(View)
for model, views in views_by_model.items():
creatable = False
global_view = None
creatable_view = None
for View in views:
if '{}ListView'.format(model.__name__) == View.__name__:
global_view = View
if issubclass(View, ListCreateAPIView) and not issubclass(View, SubListAttachDetachAPIView):
creatable = True
creatable_view = View
if not creatable or not global_view:
continue
assert 'POST' in global_view().allowed_methods, (
'Resource {} should be creatable in global list view {}. '
'Can be created now in {}'.format(model, global_view, creatable_view)
)