"""Tests for the resource module""" from django.db import models from django.test import TestCase from django.utils.translation import ugettext_lazy from djangorestframework.serializer import Serializer import datetime import decimal class TestObjectToData(TestCase): """ Tests for the Serializer class. """ def setUp(self): self.serializer = Serializer() self.serialize = self.serializer.serialize def test_decimal(self): """Decimals need to be converted to a string representation.""" self.assertEquals(self.serialize(decimal.Decimal('1.5')), decimal.Decimal('1.5')) def test_function(self): """Functions with no arguments should be called.""" def foo(): return 1 self.assertEquals(self.serialize(foo), 1) def test_method(self): """Methods with only a ``self`` argument should be called.""" class Foo(object): def foo(self): return 1 self.assertEquals(self.serialize(Foo().foo), 1) def test_datetime(self): """datetime objects are left as-is.""" now = datetime.datetime.now() self.assertEquals(self.serialize(now), now) def test_dict_method_name_collision(self): """dict with key that collides with dict method name""" self.assertEquals(self.serialize({'items': 'foo'}), {'items': u'foo'}) self.assertEquals(self.serialize({'keys': 'foo'}), {'keys': u'foo'}) self.assertEquals(self.serialize({'values': 'foo'}), {'values': u'foo'}) def test_ugettext_lazy(self): self.assertEquals(self.serialize(ugettext_lazy('foobar')), u'foobar') class TestFieldNesting(TestCase): """ Test nesting the fields in the Serializer class """ def setUp(self): self.serializer = Serializer() self.serialize = self.serializer.serialize class M1(models.Model): field1 = models.CharField(max_length=256) field2 = models.CharField(max_length=256) class M2(models.Model): field = models.OneToOneField(M1) class M3(models.Model): field = models.ForeignKey(M1) self.m1 = M1(field1='foo', field2='bar') self.m2 = M2(field=self.m1) self.m3 = M3(field=self.m1) def test_tuple_nesting(self): """ Test tuple nesting on `fields` attr """ class SerializerM2(Serializer): fields = (('field', ('field1',)),) class SerializerM3(Serializer): fields = (('field', ('field2',)),) self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) def test_serializer_class_nesting(self): """ Test related model serialization """ class NestedM2(Serializer): fields = ('field1', ) class NestedM3(Serializer): fields = ('field2', ) class SerializerM2(Serializer): fields = [('field', NestedM2)] class SerializerM3(Serializer): fields = [('field', NestedM3)] self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) def test_serializer_no_fields(self): """ Test related serializer works when the fields attr isn't present. Fix for #178. """ class NestedM2(Serializer): fields = ('field1', ) class NestedM3(Serializer): fields = ('field2', ) class SerializerM2(Serializer): include = [('field', NestedM2)] exclude = ('id', ) class SerializerM3(Serializer): fields = [('field', NestedM3)] self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) def test_serializer_classname_nesting(self): """ Test related model serialization """ class SerializerM2(Serializer): fields = [('field', 'NestedM2')] class SerializerM3(Serializer): fields = [('field', 'NestedM3')] class NestedM2(Serializer): fields = ('field1', ) class NestedM3(Serializer): fields = ('field2', ) self.assertEqual(SerializerM2().serialize(self.m2), {'field': {'field1': u'foo'}}) self.assertEqual(SerializerM3().serialize(self.m3), {'field': {'field2': u'bar'}}) def test_serializer_overridden_hook_method(self): """ Test serializing a model instance which overrides a class method on the serializer. Checks for correct behaviour in odd edge case. """ class SerializerM2(Serializer): fields = ('overridden', ) def overridden(self): return False self.m2.overridden = True self.assertEqual(SerializerM2().serialize_model(self.m2), {'overridden': True})