django-eav2/tests/test_data_validation.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

217 lines
7.7 KiB
Python
Raw Permalink Normal View History

2010-09-27 13:28:52 +00:00
from django.contrib.auth.models import User
2021-06-17 23:38:46 +00:00
from django.core.exceptions import ValidationError
from django.test import TestCase
from django.utils import timezone
2010-09-27 13:28:52 +00:00
import eav
2021-06-17 23:38:46 +00:00
from eav.models import Attribute, EnumGroup, EnumValue, Value
2021-07-04 15:59:24 +00:00
from test_project.models import Patient
2010-09-27 13:28:52 +00:00
class DataValidation(TestCase):
def setUp(self):
eav.register(Patient)
Attribute.objects.create(name="Age", datatype=Attribute.TYPE_INT)
Attribute.objects.create(name="DoB", datatype=Attribute.TYPE_DATE)
Attribute.objects.create(name="Height", datatype=Attribute.TYPE_FLOAT)
Attribute.objects.create(name="City", datatype=Attribute.TYPE_TEXT)
Attribute.objects.create(name="Pregnant", datatype=Attribute.TYPE_BOOLEAN)
Attribute.objects.create(name="User", datatype=Attribute.TYPE_OBJECT)
Attribute.objects.create(name="Extra", datatype=Attribute.TYPE_JSON)
Attribute.objects.create(name="Multi", datatype=Attribute.TYPE_CSV)
2010-09-27 13:28:52 +00:00
def tearDown(self):
eav.unregister(Patient)
def test_required_field(self):
p = Patient(name="Bob")
2010-09-27 13:28:52 +00:00
p.eav.age = 5
p.save()
2021-06-17 23:38:46 +00:00
Attribute.objects.create(
name="Weight",
datatype=Attribute.TYPE_INT,
required=True,
2021-06-17 23:38:46 +00:00
)
2010-09-27 13:28:52 +00:00
p.eav.age = 6
self.assertRaises(ValidationError, p.save)
p = Patient.objects.get(name="Bob")
2010-09-27 13:28:52 +00:00
self.assertEqual(p.eav.age, 5)
p.eav.weight = 23
p.save()
p = Patient.objects.get(name="Bob")
2010-09-27 13:28:52 +00:00
self.assertEqual(p.eav.weight, 23)
def test_create_required_field(self):
2021-06-17 23:38:46 +00:00
Attribute.objects.create(
name="Weight",
datatype=Attribute.TYPE_INT,
required=True,
2021-06-17 23:38:46 +00:00
)
self.assertRaises(
ValidationError,
Patient.objects.create,
name="Joe",
eav__age=5,
2021-06-17 23:38:46 +00:00
)
2010-09-27 13:28:52 +00:00
self.assertEqual(Patient.objects.count(), 0)
self.assertEqual(Value.objects.count(), 0)
Patient.objects.create(name="Joe", eav__weight=2, eav__age=5)
2010-09-27 13:28:52 +00:00
self.assertEqual(Patient.objects.count(), 1)
self.assertEqual(Value.objects.count(), 2)
def test_validation_error_create(self):
2021-06-17 23:38:46 +00:00
self.assertRaises(
ValidationError,
Patient.objects.create,
name="Joe",
eav__age="df",
2021-06-17 23:38:46 +00:00
)
2010-09-27 13:28:52 +00:00
self.assertEqual(Patient.objects.count(), 0)
self.assertEqual(Value.objects.count(), 0)
def test_changing_datatypes(self):
a = Attribute.objects.create(name="Color", datatype=Attribute.TYPE_INT)
2010-09-27 13:28:52 +00:00
a.datatype = Attribute.TYPE_TEXT
a.save()
Patient.objects.create(name="Bob", eav__color="brown")
2010-09-27 13:28:52 +00:00
a.datatype = Attribute.TYPE_INT
self.assertRaises(ValidationError, a.save)
def test_int_validation(self):
p = Patient.objects.create(name="Joe")
p.eav.age = "bad"
2010-09-27 13:28:52 +00:00
self.assertRaises(ValidationError, p.save)
p.eav.age = 15
p.save()
self.assertEqual(Patient.objects.get(pk=p.pk).eav.age, 15)
def test_date_validation(self):
p = Patient.objects.create(name="Joe")
p.eav.dob = "12"
2017-09-05 10:01:20 +00:00
self.assertRaises(ValidationError, lambda: p.save())
2010-09-27 13:28:52 +00:00
p.eav.dob = 15
2017-09-05 10:01:20 +00:00
self.assertRaises(ValidationError, lambda: p.save())
now = timezone.now()
2010-09-27 13:28:52 +00:00
p.eav.dob = now
p.save()
self.assertEqual(Patient.objects.get(pk=p.pk).eav.dob, now)
2017-09-05 10:01:20 +00:00
today = timezone.now().date()
2010-09-27 13:28:52 +00:00
p.eav.dob = today
p.save()
self.assertEqual(Patient.objects.get(pk=p.pk).eav.dob.date(), today)
def test_float_validation(self):
p = Patient.objects.create(name="Joe")
p.eav.height = "bad"
2010-09-27 13:28:52 +00:00
self.assertRaises(ValidationError, p.save)
p.eav.height = 15
p.save()
self.assertEqual(Patient.objects.get(pk=p.pk).eav.height, 15)
p.eav.height = "2.3"
2010-09-27 13:28:52 +00:00
p.save()
self.assertEqual(Patient.objects.get(pk=p.pk).eav.height, 2.3)
def test_text_validation(self):
p = Patient.objects.create(name="Joe")
2010-09-27 13:28:52 +00:00
p.eav.city = 5
self.assertRaises(ValidationError, p.save)
p.eav.city = "El Dorado"
2010-09-27 13:28:52 +00:00
p.save()
self.assertEqual(Patient.objects.get(pk=p.pk).eav.city, "El Dorado")
2010-09-27 13:28:52 +00:00
def test_bool_validation(self):
p = Patient.objects.create(name="Joe")
2010-09-27 13:28:52 +00:00
p.eav.pregnant = 5
self.assertRaises(ValidationError, p.save)
p.eav.pregnant = True
p.save()
self.assertEqual(Patient.objects.get(pk=p.pk).eav.pregnant, True)
def test_object_validation(self):
p = Patient.objects.create(name="Joe")
2010-09-27 13:28:52 +00:00
p.eav.user = 5
self.assertRaises(ValidationError, p.save)
p.eav.user = object
self.assertRaises(ValidationError, p.save)
p.eav.user = User(username="joe")
2010-09-27 13:28:52 +00:00
self.assertRaises(ValidationError, p.save)
u = User.objects.create(username="joe")
2010-09-27 13:28:52 +00:00
p.eav.user = u
p.save()
self.assertEqual(Patient.objects.get(pk=p.pk).eav.user, u)
def test_enum_validation(self):
yes = EnumValue.objects.create(value="yes")
no = EnumValue.objects.create(value="no")
unkown = EnumValue.objects.create(value="unkown")
green = EnumValue.objects.create(value="green")
ynu = EnumGroup.objects.create(name="Yes / No / Unknown")
ynu.values.add(yes)
ynu.values.add(no)
ynu.values.add(unkown)
2021-06-17 23:38:46 +00:00
Attribute.objects.create(
name="Fever",
datatype=Attribute.TYPE_ENUM,
enum_group=ynu,
2021-06-17 23:38:46 +00:00
)
2010-09-27 13:28:52 +00:00
p = Patient.objects.create(name="Joe")
2010-09-27 13:28:52 +00:00
p.eav.fever = 5
self.assertRaises(ValidationError, p.save)
p.eav.fever = object
self.assertRaises(ValidationError, p.save)
p.eav.fever = green
self.assertRaises(ValidationError, p.save)
p.eav.fever = EnumValue(value="yes")
2010-09-27 13:28:52 +00:00
self.assertRaises(ValidationError, p.save)
p.eav.fever = no
p.save()
self.assertEqual(Patient.objects.get(pk=p.pk).eav.fever, no)
def test_enum_datatype_without_enum_group(self):
a = Attribute(name="Age Bracket", datatype=Attribute.TYPE_ENUM)
2010-09-27 13:28:52 +00:00
self.assertRaises(ValidationError, a.save)
yes = EnumValue.objects.create(value="yes")
no = EnumValue.objects.create(value="no")
unkown = EnumValue.objects.create(value="unkown")
ynu = EnumGroup.objects.create(name="Yes / No / Unknown")
ynu.values.add(yes)
ynu.values.add(no)
ynu.values.add(unkown)
a = Attribute(name="Age Bracket", datatype=Attribute.TYPE_ENUM, enum_group=ynu)
2010-09-27 13:28:52 +00:00
a.save()
def test_enum_group_on_other_datatype(self):
yes = EnumValue.objects.create(value="yes")
no = EnumValue.objects.create(value="no")
unkown = EnumValue.objects.create(value="unkown")
ynu = EnumGroup.objects.create(name="Yes / No / Unknown")
ynu.values.add(yes)
ynu.values.add(no)
ynu.values.add(unkown)
a = Attribute(name="color", datatype=Attribute.TYPE_TEXT, enum_group=ynu)
2010-09-27 13:28:52 +00:00
self.assertRaises(ValidationError, a.save)
2021-04-05 02:53:45 +00:00
def test_json_validation(self):
p = Patient.objects.create(name="Joe")
2021-04-05 02:53:45 +00:00
p.eav.extra = 5
self.assertRaises(ValidationError, p.save)
p.eav.extra = {"eyes": "blue", "hair": "brown"}
p.save()
self.assertEqual(Patient.objects.get(pk=p.pk).eav.extra.get("eyes", ""), "blue")
def test_csv_validation(self):
yes = EnumValue.objects.create(value="yes")
p = Patient.objects.create(name="Mike")
p.eav.multi = yes
self.assertRaises(ValidationError, p.save)
p.eav.multi = "one;two;three"
p.save()
2021-06-17 23:38:46 +00:00
self.assertEqual(
Patient.objects.get(pk=p.pk).eav.multi,
["one", "two", "three"],
2021-06-17 23:38:46 +00:00
)