1from django.contrib.contenttypes.models import ContentType 2from django.test import TestCase 3 4from dcim.forms import SiteForm 5from dcim.models import Site 6from extras.choices import CustomFieldTypeChoices 7from extras.models import CustomField 8 9 10class CustomFieldModelFormTest(TestCase): 11 12 @classmethod 13 def setUpTestData(cls): 14 obj_type = ContentType.objects.get_for_model(Site) 15 CHOICES = ('A', 'B', 'C') 16 17 cf_text = CustomField.objects.create(name='text', type=CustomFieldTypeChoices.TYPE_TEXT) 18 cf_text.content_types.set([obj_type]) 19 20 cf_integer = CustomField.objects.create(name='integer', type=CustomFieldTypeChoices.TYPE_INTEGER) 21 cf_integer.content_types.set([obj_type]) 22 23 cf_boolean = CustomField.objects.create(name='boolean', type=CustomFieldTypeChoices.TYPE_BOOLEAN) 24 cf_boolean.content_types.set([obj_type]) 25 26 cf_date = CustomField.objects.create(name='date', type=CustomFieldTypeChoices.TYPE_DATE) 27 cf_date.content_types.set([obj_type]) 28 29 cf_url = CustomField.objects.create(name='url', type=CustomFieldTypeChoices.TYPE_URL) 30 cf_url.content_types.set([obj_type]) 31 32 cf_select = CustomField.objects.create(name='select', type=CustomFieldTypeChoices.TYPE_SELECT, choices=CHOICES) 33 cf_select.content_types.set([obj_type]) 34 35 cf_multiselect = CustomField.objects.create(name='multiselect', type=CustomFieldTypeChoices.TYPE_MULTISELECT, 36 choices=CHOICES) 37 cf_multiselect.content_types.set([obj_type]) 38 39 def test_empty_values(self): 40 """ 41 Test that empty custom field values are stored as null 42 """ 43 form = SiteForm({ 44 'name': 'Site 1', 45 'slug': 'site-1', 46 'status': 'active', 47 }) 48 self.assertTrue(form.is_valid()) 49 instance = form.save() 50 51 for field_type, _ in CustomFieldTypeChoices.CHOICES: 52 self.assertIn(field_type, instance.custom_field_data) 53 self.assertIsNone(instance.custom_field_data[field_type]) 54