tests.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import pickle
  2. from django import forms
  3. from django.db import models
  4. from django.test import SimpleTestCase, TestCase
  5. from .models import (
  6. Foo, RenamedField, VerboseNameField, Whiz, WhizIter, WhizIterEmpty,
  7. )
  8. class BasicFieldTests(TestCase):
  9. def test_show_hidden_initial(self):
  10. """
  11. Fields with choices respect show_hidden_initial as a kwarg to
  12. formfield().
  13. """
  14. choices = [(0, 0), (1, 1)]
  15. model_field = models.Field(choices=choices)
  16. form_field = model_field.formfield(show_hidden_initial=True)
  17. self.assertTrue(form_field.show_hidden_initial)
  18. form_field = model_field.formfield(show_hidden_initial=False)
  19. self.assertFalse(form_field.show_hidden_initial)
  20. def test_field_repr(self):
  21. """
  22. __repr__() of a field displays its name.
  23. """
  24. f = Foo._meta.get_field('a')
  25. self.assertEqual(repr(f), '<django.db.models.fields.CharField: a>')
  26. f = models.fields.CharField()
  27. self.assertEqual(repr(f), '<django.db.models.fields.CharField>')
  28. def test_field_name(self):
  29. """
  30. A defined field name (name="fieldname") is used instead of the model
  31. model's attribute name (modelname).
  32. """
  33. instance = RenamedField()
  34. self.assertTrue(hasattr(instance, 'get_fieldname_display'))
  35. self.assertFalse(hasattr(instance, 'get_modelname_display'))
  36. def test_field_verbose_name(self):
  37. m = VerboseNameField
  38. for i in range(1, 23):
  39. self.assertEqual(m._meta.get_field('field%d' % i).verbose_name, 'verbose field%d' % i)
  40. self.assertEqual(m._meta.get_field('id').verbose_name, 'verbose pk')
  41. def test_choices_form_class(self):
  42. """Can supply a custom choices form class to Field.formfield()"""
  43. choices = [('a', 'a')]
  44. field = models.CharField(choices=choices)
  45. klass = forms.TypedMultipleChoiceField
  46. self.assertIsInstance(field.formfield(choices_form_class=klass), klass)
  47. def test_formfield_disabled(self):
  48. """Field.formfield() sets disabled for fields with choices."""
  49. field = models.CharField(choices=[('a', 'b')])
  50. form_field = field.formfield(disabled=True)
  51. self.assertIs(form_field.disabled, True)
  52. def test_field_str(self):
  53. f = models.Field()
  54. self.assertEqual(str(f), '<django.db.models.fields.Field>')
  55. f = Foo._meta.get_field('a')
  56. self.assertEqual(str(f), 'model_fields.Foo.a')
  57. def test_field_ordering(self):
  58. """Fields are ordered based on their creation."""
  59. f1 = models.Field()
  60. f2 = models.Field(auto_created=True)
  61. f3 = models.Field()
  62. self.assertLess(f2, f1)
  63. self.assertGreater(f3, f1)
  64. self.assertIsNotNone(f1)
  65. self.assertNotIn(f2, (None, 1, ''))
  66. def test_field_instance_is_picklable(self):
  67. """Field instances can be pickled."""
  68. field = models.Field(max_length=100, default='a string')
  69. # Must be picklable with this cached property populated (#28188).
  70. field._get_default
  71. pickle.dumps(field)
  72. class ChoicesTests(SimpleTestCase):
  73. def test_choices_and_field_display(self):
  74. """
  75. get_choices() interacts with get_FIELD_display() to return the expected
  76. values.
  77. """
  78. self.assertEqual(Whiz(c=1).get_c_display(), 'First') # A nested value
  79. self.assertEqual(Whiz(c=0).get_c_display(), 'Other') # A top level value
  80. self.assertEqual(Whiz(c=9).get_c_display(), 9) # Invalid value
  81. self.assertIsNone(Whiz(c=None).get_c_display()) # Blank value
  82. self.assertEqual(Whiz(c='').get_c_display(), '') # Empty value
  83. def test_iterator_choices(self):
  84. """
  85. get_choices() works with Iterators.
  86. """
  87. self.assertEqual(WhizIter(c=1).c, 1) # A nested value
  88. self.assertEqual(WhizIter(c=9).c, 9) # Invalid value
  89. self.assertIsNone(WhizIter(c=None).c) # Blank value
  90. self.assertEqual(WhizIter(c='').c, '') # Empty value
  91. def test_empty_iterator_choices(self):
  92. """
  93. get_choices() works with empty iterators.
  94. """
  95. self.assertEqual(WhizIterEmpty(c="a").c, "a") # A nested value
  96. self.assertEqual(WhizIterEmpty(c="b").c, "b") # Invalid value
  97. self.assertIsNone(WhizIterEmpty(c=None).c) # Blank value
  98. self.assertEqual(WhizIterEmpty(c='').c, '') # Empty value