diff --git a/example/tests/test_utils.py b/example/tests/test_utils.py new file mode 100644 index 00000000..0068fa70 --- /dev/null +++ b/example/tests/test_utils.py @@ -0,0 +1,90 @@ +import pytest + +from django.contrib.auth import get_user_model +from rest_framework import serializers +from rest_framework.response import Response +from rest_framework.views import APIView +from rest_framework_json_api import utils + +pytestmark = pytest.mark.django_db + +class Resource(APIView): + pass + +class ResourceSerializer(serializers.ModelSerializer): + class Meta(): + fields = ('username',) + model = get_user_model() + +def test_get_resource_name(): + view = Resource() + context = {'view': view} + assert 'resources' == utils.get_resource_name(context), 'derived from view' + + view.model = get_user_model() + assert 'users' == utils.get_resource_name(context), 'derived from view model' + + view.resource_name = 'custom' + assert 'custom' == utils.get_resource_name(context), 'manually set on view' + + view.response = Response(status=403) + assert 'errors' == utils.get_resource_name(context), 'handles 4xx error' + + view.response = Response(status=500) + assert 'errors' == utils.get_resource_name(context), 'handles 500 error' + + view = Resource() + context = {'view': view} + view.serializer_class = ResourceSerializer + assert 'users' == utils.get_resource_name(context), 'derived from serializer' + + view.serializer_class.Meta.resource_name = 'rcustom' + assert 'rcustom' == utils.get_resource_name(context), 'set on serializer' + +def test_format_keys(): + underscored = { + 'first_name': 'a', + 'last_name': 'b', + } + + output = {'firstName': 'a', 'lastName': 'b'} + assert utils.format_keys(underscored, 'camelize') == output + + output = {'first-name': 'a', 'last-name': 'b'} + assert utils.format_keys(underscored, 'dasherize') == output + + new_input = {'firstName': 'a', 'lastName': 'b'} + assert utils.format_keys(new_input, 'underscore') == underscored + + output = [{'first-name': 'a', 'last-name': 'b'}] + assert utils.format_keys([underscored], 'dasherize') == output + +def test_format_value(): + assert utils.format_value('first_name', 'camelize') == 'FirstName' + assert utils.format_value('first_name', 'dasherize') == 'first-name' + assert utils.format_value('first-name', 'underscore') == 'first_name' + +def test_format_relation_name(): + assert utils.format_relation_name('first_name', 'camelize') == 'FirstNames' + +def test_build_json_resource_obj(): + resource = { + 'pk': 1, + 'username': 'Alice', + } + + serializer = ResourceSerializer(data={'username': 'Alice'}) + serializer.is_valid() + resource_instance = serializer.save() + + output = { + 'type': 'user', + 'id': '1', + 'attributes': { + 'username': 'Alice' + }, + } + + assert utils.build_json_resource_obj( + serializer.fields, resource, resource_instance, 'user') == output + diff --git a/rest_framework_json_api/utils.py b/rest_framework_json_api/utils.py index 2cf7379d..9c4c70ef 100644 --- a/rest_framework_json_api/utils.py +++ b/rest_framework_json_api/utils.py @@ -118,7 +118,8 @@ def format_keys(obj, format_type=None): def format_value(value, format_type=None): - format_type = getattr(settings, 'JSON_API_FORMAT_KEYS', False) + if format_type is None: + format_type = getattr(settings, 'JSON_API_FORMAT_KEYS', False) if format_type == 'dasherize': value = inflection.dasherize(value) elif format_type == 'camelize': @@ -129,16 +130,11 @@ def format_value(value, format_type=None): def format_relation_name(value, format_type=None): - format_type = getattr(settings, 'JSON_API_FORMAT_RELATION_KEYS', False) - - value = inflection.underscore(value) + if format_type is None: + format_type = getattr(settings, 'JSON_API_FORMAT_RELATION_KEYS', False) - if format_type == 'dasherize': - value = inflection.dasherize(value) - elif format_type == 'camelize': - value = inflection.camelize(value) - elif format_type == 'underscore': - value = inflection.underscore(value) + # format_type will never be None here so we can use format_value + value = format_value(value, format_type) return inflection.pluralize(value)