Commit c1036c17 by Tom Christie

More test passing

parent f2852811
from rest_framework.fields import Field from rest_framework.fields import Field
from rest_framework.reverse import reverse
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import resolve, get_script_prefix from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch
from rest_framework.compat import urlparse from rest_framework.compat import urlparse
...@@ -100,11 +101,64 @@ class HyperlinkedIdentityField(RelatedField): ...@@ -100,11 +101,64 @@ class HyperlinkedIdentityField(RelatedField):
lookup_field = 'pk' lookup_field = 'pk'
def __init__(self, **kwargs): def __init__(self, **kwargs):
kwargs['read_only'] = True
self.view_name = kwargs.pop('view_name') self.view_name = kwargs.pop('view_name')
self.lookup_field = kwargs.pop('lookup_field', self.lookup_field) self.lookup_field = kwargs.pop('lookup_field', self.lookup_field)
self.lookup_url_kwarg = kwargs.pop('lookup_url_kwarg', self.lookup_field) self.lookup_url_kwarg = kwargs.pop('lookup_url_kwarg', self.lookup_field)
super(HyperlinkedIdentityField, self).__init__(**kwargs) super(HyperlinkedIdentityField, self).__init__(**kwargs)
def get_attribute(self, instance):
return instance
def to_primative(self, value):
request = self.context.get('request', None)
format = self.context.get('format', None)
assert request is not None, (
"`HyperlinkedIdentityField` requires the request in the serializer"
" context. Add `context={'request': request}` when instantiating "
"the serializer."
)
# By default use whatever format is given for the current context
# unless the target is a different type to the source.
#
# Eg. Consider a HyperlinkedIdentityField pointing from a json
# representation to an html property of that representation...
#
# '/snippets/1/' should link to '/snippets/1/highlight/'
# ...but...
# '/snippets/1/.json' should link to '/snippets/1/highlight/.html'
if format and self.format and self.format != format:
format = self.format
# Return the hyperlink, or error if incorrectly configured.
try:
return self.get_url(value, self.view_name, request, format)
except NoReverseMatch:
msg = (
'Could not resolve URL for hyperlinked relationship using '
'view name "%s". You may have failed to include the related '
'model in your API, or incorrectly configured the '
'`lookup_field` attribute on this field.'
)
raise Exception(msg % self.view_name)
def get_url(self, obj, view_name, request, format):
"""
Given an object, return the URL that hyperlinks to the object.
May raise a `NoReverseMatch` if the `view_name` and `lookup_field`
attributes are not configured to correctly match the URL conf.
"""
# Unsaved objects will not yet have a valid URL.
if obj.pk is None:
return None
lookup_value = getattr(obj, self.lookup_field)
kwargs = {self.lookup_url_kwarg: lookup_value}
return reverse(view_name, kwargs=kwargs, request=request, format=format)
class SlugRelatedField(RelatedField): class SlugRelatedField(RelatedField):
def __init__(self, **kwargs): def __init__(self, **kwargs):
......
This source diff could not be displayed because it is too large. You can view the blob instead.
from django.test import TestCase # from django.test import TestCase
from rest_framework import serializers # from rest_framework import serializers
class EmptySerializerTestCase(TestCase): # class EmptySerializerTestCase(TestCase):
def test_empty_serializer(self): # def test_empty_serializer(self):
class FooBarSerializer(serializers.Serializer): # class FooBarSerializer(serializers.Serializer):
foo = serializers.IntegerField() # foo = serializers.IntegerField()
bar = serializers.SerializerMethodField('get_bar') # bar = serializers.SerializerMethodField('get_bar')
def get_bar(self, obj): # def get_bar(self, obj):
return 'bar' # return 'bar'
serializer = FooBarSerializer() # serializer = FooBarSerializer()
self.assertEquals(serializer.data, {'foo': 0}) # self.assertEquals(serializer.data, {'foo': 0})
from django.test import TestCase # from django.test import TestCase
from rest_framework import serializers # from rest_framework import serializers
from tests.accounts.serializers import AccountSerializer # from tests.accounts.serializers import AccountSerializer
class ImportingModelSerializerTests(TestCase): # class ImportingModelSerializerTests(TestCase):
""" # """
In some situations like, GH #1225, it is possible, especially in # In some situations like, GH #1225, it is possible, especially in
testing, to import a serializer who's related models have not yet # testing, to import a serializer who's related models have not yet
been resolved by Django. `AccountSerializer` is an example of such # been resolved by Django. `AccountSerializer` is an example of such
a serializer (imported at the top of this file). # a serializer (imported at the top of this file).
""" # """
def test_import_model_serializer(self): # def test_import_model_serializer(self):
""" # """
The serializer at the top of this file should have been # The serializer at the top of this file should have been
imported successfully, and we should be able to instantiate it. # imported successfully, and we should be able to instantiate it.
""" # """
self.assertIsInstance(AccountSerializer(), serializers.ModelSerializer) # self.assertIsInstance(AccountSerializer(), serializers.ModelSerializer)
from django.test import TestCase # from django.test import TestCase
from django.utils import six # from django.utils import six
from rest_framework.serializers import _resolve_model # from rest_framework.serializers import _resolve_model
from tests.models import BasicModel # from tests.models import BasicModel
class ResolveModelTests(TestCase): # class ResolveModelTests(TestCase):
""" # """
`_resolve_model` should return a Django model class given the # `_resolve_model` should return a Django model class given the
provided argument is a Django model class itself, or a properly # provided argument is a Django model class itself, or a properly
formatted string representation of one. # formatted string representation of one.
""" # """
def test_resolve_django_model(self): # def test_resolve_django_model(self):
resolved_model = _resolve_model(BasicModel) # resolved_model = _resolve_model(BasicModel)
self.assertEqual(resolved_model, BasicModel) # self.assertEqual(resolved_model, BasicModel)
def test_resolve_string_representation(self): # def test_resolve_string_representation(self):
resolved_model = _resolve_model('tests.BasicModel') # resolved_model = _resolve_model('tests.BasicModel')
self.assertEqual(resolved_model, BasicModel) # self.assertEqual(resolved_model, BasicModel)
def test_resolve_unicode_representation(self): # def test_resolve_unicode_representation(self):
resolved_model = _resolve_model(six.text_type('tests.BasicModel')) # resolved_model = _resolve_model(six.text_type('tests.BasicModel'))
self.assertEqual(resolved_model, BasicModel) # self.assertEqual(resolved_model, BasicModel)
def test_resolve_non_django_model(self): # def test_resolve_non_django_model(self):
with self.assertRaises(ValueError): # with self.assertRaises(ValueError):
_resolve_model(TestCase) # _resolve_model(TestCase)
def test_resolve_improper_string_representation(self): # def test_resolve_improper_string_representation(self):
with self.assertRaises(ValueError): # with self.assertRaises(ValueError):
_resolve_model('BasicModel') # _resolve_model('BasicModel')
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment