/tests/modeltests/field_subclassing/tests.py

https://code.google.com/p/mango-py/ · Python · 81 lines · 53 code · 18 blank · 10 comment · 0 complexity · e3f259383f93ab3793ee6cc023e8c8e9 MD5 · raw file

  1. from django.core import serializers
  2. from django.test import TestCase
  3. from fields import Small
  4. from models import DataModel, MyModel, OtherModel
  5. class CustomField(TestCase):
  6. def test_defer(self):
  7. d = DataModel.objects.create(data=[1, 2, 3])
  8. self.assertTrue(isinstance(d.data, list))
  9. d = DataModel.objects.get(pk=d.pk)
  10. self.assertTrue(isinstance(d.data, list))
  11. self.assertEqual(d.data, [1, 2, 3])
  12. d = DataModel.objects.defer("data").get(pk=d.pk)
  13. d.save()
  14. d = DataModel.objects.get(pk=d.pk)
  15. self.assertTrue(isinstance(d.data, list))
  16. self.assertEqual(d.data, [1, 2, 3])
  17. def test_custom_field(self):
  18. # Creating a model with custom fields is done as per normal.
  19. s = Small(1, 2)
  20. self.assertEqual(str(s), "12")
  21. m = MyModel.objects.create(name="m", data=s)
  22. # Custom fields still have normal field's attributes.
  23. self.assertEqual(m._meta.get_field("data").verbose_name, "small field")
  24. # The m.data attribute has been initialised correctly. It's a Small
  25. # object.
  26. self.assertEqual((m.data.first, m.data.second), (1, 2))
  27. # The data loads back from the database correctly and 'data' has the
  28. # right type.
  29. m1 = MyModel.objects.get(pk=m.pk)
  30. self.assertTrue(isinstance(m1.data, Small))
  31. self.assertEqual(str(m1.data), "12")
  32. # We can do normal filtering on the custom field (and will get an error
  33. # when we use a lookup type that does not make sense).
  34. s1 = Small(1, 3)
  35. s2 = Small("a", "b")
  36. self.assertQuerysetEqual(
  37. MyModel.objects.filter(data__in=[s, s1, s2]), [
  38. "m",
  39. ],
  40. lambda m: m.name,
  41. )
  42. self.assertRaises(TypeError, lambda: MyModel.objects.filter(data__lt=s))
  43. # Serialization works, too.
  44. stream = serializers.serialize("json", MyModel.objects.all())
  45. self.assertEqual(stream, '[{"pk": %d, "model": "field_subclassing.mymodel", "fields": {"data": "12", "name": "m"}}]' % m1.pk)
  46. obj = list(serializers.deserialize("json", stream))[0]
  47. self.assertEqual(obj.object, m)
  48. # Test retrieving custom field data
  49. m.delete()
  50. m1 = MyModel.objects.create(name="1", data=Small(1, 2))
  51. m2 = MyModel.objects.create(name="2", data=Small(2, 3))
  52. self.assertQuerysetEqual(
  53. MyModel.objects.all(), [
  54. "12",
  55. "23",
  56. ],
  57. lambda m: str(m.data)
  58. )
  59. def test_field_subclassing(self):
  60. o = OtherModel.objects.create(data=Small("a", "b"))
  61. o = OtherModel.objects.get()
  62. self.assertEqual(o.data.first, "a")
  63. self.assertEqual(o.data.second, "b")