diff --git a/netbox/extras/tests/__init__.py b/netbox/extras/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/netbox/extras/tests/test_customfields.py b/netbox/extras/tests/test_customfields.py new file mode 100644 index 000000000..7812c8c97 --- /dev/null +++ b/netbox/extras/tests/test_customfields.py @@ -0,0 +1,96 @@ +from datetime import date + +from django.contrib.contenttypes.models import ContentType +from django.test import TestCase + +from dcim.models import Site + +from extras.models import ( + CustomField, CustomFieldValue, CustomFieldChoice, CF_TYPE_TEXT, CF_TYPE_INTEGER, CF_TYPE_BOOLEAN, CF_TYPE_DATE, + CF_TYPE_SELECT, +) + + +class RackTestCase(TestCase): + + def setUp(self): + + Site.objects.bulk_create([ + Site(name='Site A', slug='site-a'), + Site(name='Site B', slug='site-b'), + Site(name='Site C', slug='site-c'), + ]) + + def test_simple_fields(self): + + DATA = ( + {'field_type': CF_TYPE_TEXT, 'field_value': 'Foobar!', 'empty_value': ''}, + {'field_type': CF_TYPE_INTEGER, 'field_value': 0, 'empty_value': None}, + {'field_type': CF_TYPE_INTEGER, 'field_value': 42, 'empty_value': None}, + {'field_type': CF_TYPE_BOOLEAN, 'field_value': True, 'empty_value': None}, + {'field_type': CF_TYPE_BOOLEAN, 'field_value': False, 'empty_value': None}, + {'field_type': CF_TYPE_DATE, 'field_value': date(2016, 6, 23), 'empty_value': None}, + ) + + obj_type = ContentType.objects.get_for_model(Site) + + for data in DATA: + + # Create a custom field + cf = CustomField(type=data['field_type'], name='my_field', required=False) + cf.save() + cf.obj_type = [obj_type] + cf.save() + + # Assign a value to the first Site + site = Site.objects.first() + cfv = CustomFieldValue(field=cf, obj_type=obj_type, obj_id=site.id) + cfv.value = data['field_value'] + cfv.save() + + # Retrieve the stored value + cfv = CustomFieldValue.objects.filter(obj_type=obj_type, obj_id=site.pk).first() + self.assertEqual(cfv.value, data['field_value']) + + # Delete the stored value + cfv.value = data['empty_value'] + cfv.save() + self.assertEqual(CustomFieldValue.objects.filter(obj_type=obj_type, obj_id=site.pk).count(), 0) + + # Delete the custom field + cf.delete() + + def test_select_field(self): + + obj_type = ContentType.objects.get_for_model(Site) + + # Create a custom field + cf = CustomField(type=CF_TYPE_SELECT, name='my_field', required=False) + cf.save() + cf.obj_type = [obj_type] + cf.save() + + # Create some choices for the field + CustomFieldChoice.objects.bulk_create([ + CustomFieldChoice(field=cf, value='Option A'), + CustomFieldChoice(field=cf, value='Option B'), + CustomFieldChoice(field=cf, value='Option C'), + ]) + + # Assign a value to the first Site + site = Site.objects.first() + cfv = CustomFieldValue(field=cf, obj_type=obj_type, obj_id=site.id) + cfv.value = cf.choices.first() + cfv.save() + + # Retrieve the stored value + cfv = CustomFieldValue.objects.filter(obj_type=obj_type, obj_id=site.pk).first() + self.assertEqual(str(cfv.value), 'Option A') + + # Delete the stored value + cfv.value = None + cfv.save() + self.assertEqual(CustomFieldValue.objects.filter(obj_type=obj_type, obj_id=site.pk).count(), 0) + + # Delete the custom field + cf.delete()