test_forms.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from django.test import TestCase
  2. from core.models import ObjectType
  3. from dcim.forms import SiteForm
  4. from dcim.models import Site
  5. from extras.choices import CustomFieldTypeChoices
  6. from extras.forms import SavedFilterForm
  7. from extras.models import CustomField, CustomFieldChoiceSet
  8. class CustomFieldModelFormTest(TestCase):
  9. @classmethod
  10. def setUpTestData(cls):
  11. object_type = ObjectType.objects.get_for_model(Site)
  12. choice_set = CustomFieldChoiceSet.objects.create(
  13. name='Choice Set 1',
  14. extra_choices=(('a', 'A'), ('b', 'B'), ('c', 'C'))
  15. )
  16. cf_text = CustomField.objects.create(name='text', type=CustomFieldTypeChoices.TYPE_TEXT)
  17. cf_text.object_types.set([object_type])
  18. cf_longtext = CustomField.objects.create(name='longtext', type=CustomFieldTypeChoices.TYPE_LONGTEXT)
  19. cf_longtext.object_types.set([object_type])
  20. cf_integer = CustomField.objects.create(name='integer', type=CustomFieldTypeChoices.TYPE_INTEGER)
  21. cf_integer.object_types.set([object_type])
  22. cf_integer = CustomField.objects.create(name='decimal', type=CustomFieldTypeChoices.TYPE_DECIMAL)
  23. cf_integer.object_types.set([object_type])
  24. cf_boolean = CustomField.objects.create(name='boolean', type=CustomFieldTypeChoices.TYPE_BOOLEAN)
  25. cf_boolean.object_types.set([object_type])
  26. cf_date = CustomField.objects.create(name='date', type=CustomFieldTypeChoices.TYPE_DATE)
  27. cf_date.object_types.set([object_type])
  28. cf_datetime = CustomField.objects.create(name='datetime', type=CustomFieldTypeChoices.TYPE_DATETIME)
  29. cf_datetime.object_types.set([object_type])
  30. cf_url = CustomField.objects.create(name='url', type=CustomFieldTypeChoices.TYPE_URL)
  31. cf_url.object_types.set([object_type])
  32. cf_json = CustomField.objects.create(name='json', type=CustomFieldTypeChoices.TYPE_JSON)
  33. cf_json.object_types.set([object_type])
  34. cf_select = CustomField.objects.create(
  35. name='select',
  36. type=CustomFieldTypeChoices.TYPE_SELECT,
  37. choice_set=choice_set
  38. )
  39. cf_select.object_types.set([object_type])
  40. cf_multiselect = CustomField.objects.create(
  41. name='multiselect',
  42. type=CustomFieldTypeChoices.TYPE_MULTISELECT,
  43. choice_set=choice_set
  44. )
  45. cf_multiselect.object_types.set([object_type])
  46. cf_object = CustomField.objects.create(
  47. name='object',
  48. type=CustomFieldTypeChoices.TYPE_OBJECT,
  49. object_type=ObjectType.objects.get_for_model(Site)
  50. )
  51. cf_object.object_types.set([object_type])
  52. cf_multiobject = CustomField.objects.create(
  53. name='multiobject',
  54. type=CustomFieldTypeChoices.TYPE_MULTIOBJECT,
  55. object_type=ObjectType.objects.get_for_model(Site)
  56. )
  57. cf_multiobject.object_types.set([object_type])
  58. def test_empty_values(self):
  59. """
  60. Test that empty custom field values are stored as null
  61. """
  62. form = SiteForm({
  63. 'name': 'Site 1',
  64. 'slug': 'site-1',
  65. 'status': 'active',
  66. })
  67. self.assertTrue(form.is_valid())
  68. instance = form.save()
  69. for field_type, _ in CustomFieldTypeChoices.CHOICES:
  70. self.assertIn(field_type, instance.custom_field_data)
  71. self.assertIsNone(instance.custom_field_data[field_type])
  72. class SavedFilterFormTest(TestCase):
  73. def test_basic_submit(self):
  74. """
  75. Test form submission and validation
  76. """
  77. form = SavedFilterForm({
  78. 'name': 'test-sf',
  79. 'slug': 'test-sf',
  80. 'object_types': [ObjectType.objects.get_for_model(Site).pk],
  81. 'weight': 100,
  82. 'parameters': {
  83. "status": [
  84. "active"
  85. ]
  86. }
  87. })
  88. self.assertTrue(form.is_valid())
  89. form.save()