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