django-eav2/tests/set_and_get.py
2010-09-23 15:51:59 +03:00

304 lines
9.9 KiB
Python

from datetime import datetime
from django.test import TestCase
from django.contrib.auth.models import User
import eav
from ..models import *
from ..registry import EavConfig
from .models import Patient
class EavSetterAndGetterTests(TestCase):
"""
Testing setters and getters
"""
def setUp(self):
eav.unregister(Patient)
eav.register(Patient)
self.attribute = Attribute.objects\
.create(datatype=Attribute.TYPE_TEXT,
name='City', slug='city')
self.patient = Patient.objects.create(name="Doe")
self.value = Value.objects.create(entity=self.patient,
attribute=self.attribute,
value_text='Denver')
def tearDown(self):
eav.unregister(Patient)
eav.unregister(User)
def additional_attribute_setup(self):
self.country_attr = Attribute.objects\
.create(datatype=Attribute.TYPE_TEXT,
name='Country', slug='country')
class PatientEav(EavConfig):
@classmethod
def get_attributes(cls):
return Attribute.objects.filter(slug='country')
self.PatientEav = PatientEav
class UserEav(EavConfig):
@classmethod
def get_attributes(cls):
return Attribute.objects.filter(slug='city')
self.UserEav = UserEav
def test_save_single_value(self):
patient = Patient.objects.create(name="x")
attr = Attribute.objects.create(datatype=Attribute.TYPE_TEXT,
name='a', slug='a')
# save value
attr.save_value(patient, 'b')
patient = Patient.objects.get(name="x")
self.assertEqual(patient.eav.a, 'b')
def test_save_value(self):
# TODO: update test_save_value when multiple values are out
# save value
self.attribute.save_value(self.patient, 'Paris')
self.assertEqual(self.patient.eav.city, 'Paris')
def test_you_can_assign_a_value_to_an_unsaved_object(self):
patient = Patient()
patient.eav.city = 'Paris'
patient.save()
self.assertEqual(patient.eav.city, 'Paris')
self.assertEqual(Value.objects.filter(value_text='Paris').count(), 1)
def test_you_can_assign_a_value_to_a_saved_object(self):
patient = Patient.objects.create(name='new_patient')
patient.eav.city = 'Paris'
patient.save()
self.assertEqual(patient.eav.city, 'Paris')
self.assertEqual(Value.objects.filter(value_text='Paris').count(), 1)
def test_underscore_prevent_a_data_from_been_saved(self):
patient = Patient.objects.create(name='new_patient')
patient.eav._test = 'Paris'
patient.save()
patient = Patient.objects.get(name='new_patient')
try:
patient.eav._test
self.fail()
except AttributeError:
pass
self.assertFalse(Value.objects.filter(value_text='Paris').count())
def test_you_can_create_several_type_of_attributes(self):
self.patient = Patient(name='test')
Attribute.objects.create(datatype=Attribute.TYPE_TEXT,
name='text', slug='text')
Attribute.objects.create(datatype=Attribute.TYPE_FLOAT,
name='float', slug='float')
Attribute.objects.create(datatype=Attribute.TYPE_INT,
name='int', slug='int')
Attribute.objects.create(datatype=Attribute.TYPE_DATE,
name='date', slug='date')
Attribute.objects.create(datatype=Attribute.TYPE_BOOLEAN,
name='bool', slug='bool')
Attribute.objects.create(datatype=Attribute.TYPE_OBJECT,
name='object', slug='object')
now = datetime.today()
self.patient.eav.text = 'a'
self.patient.eav.float = 1.0
self.patient.eav.int = 1
self.patient.eav.date = now
self.patient.eav.bool = True
self.patient.eav.object = User.objects.create(username='Bob')
self.patient.save()
patient = Patient.objects.get(pk=self.patient.pk)
self.assertEqual(self.patient.eav.float, 1.0)
self.assertEqual(self.patient.eav.int, 1)
self.assertEqual(self.patient.eav.date, now)
self.assertEqual(self.patient.eav.bool, True)
self.assertEqual(self.patient.eav.object,
User.objects.get(username='Bob'))
def test_assign_a_value_that_is_not_an_eav_attribute_does_nothing(self):
self.patient.eav.no_an_attribute = 'Woot'
self.patient.save()
self.assertFalse(Value.objects.filter(value_text='Paris').count())
def test_get_a_value_that_does_not_exists(self):
self.assertFalse(hasattr(self.patient.eav, 'impossible_value'))
def test_attributes_are_filtered_according_to_config_class(self):
self.additional_attribute_setup()
eav.unregister(Patient)
eav.register(Patient, self.PatientEav)
eav.register(User, self.UserEav)
p = Patient.objects.create(name='Bob')
u = User.objects.create(username='hope')
self.assertEqual(list(p.eav.get_all_attributes()),
list(Attribute.objects.filter(slug='country')))
self.assertEqual(list(u.eav.get_all_attributes()),
list(Attribute.objects.filter(slug='city')))
def test_can_filter_attribute_availability_for_entity(self):
self.additional_attribute_setup()
self.patient.eav.city = 'Tunis'
self.patient.save()
self.assertEqual(Patient.objects.get(pk=self.patient.pk).eav.city,
'Tunis')
eav.unregister(Patient)
eav.register(Patient, self.PatientEav)
p = Patient.objects.create(name='Patrick')
p.eav.city = 'Paris'
p.eav.country = 'USA'
p.save()
p = Patient.objects.get(pk=p.pk)
self.assertFalse(hasattr(p.eav, 'city'))
self.assertEqual(p.eav.country, 'USA')
def test_can_have_differente_attribute_filter(self):
self.additional_attribute_setup()
eav.unregister(Patient)
eav.register(Patient, self.PatientEav)
eav.register(User, self.UserEav)
p = Patient.objects.create(name='Patrick')
u = User.objects.create(username='John')
p.eav.city = 'Paris'
p.eav.country = 'USA'
p.save()
u.eav.city = 'Paris'
u.eav.country = 'USA'
u.save()
p = Patient.objects.get(pk=p.pk)
u = User.objects.get(pk=u.pk)
self.assertFalse(hasattr(p.eav, 'city'))
self.assertEqual(p.eav.country, 'USA')
self.assertFalse(hasattr(u.eav, 'country'))
self.assertEqual(u.eav.city, 'Paris')
def test_can_have_a_subclass_for_config_class(self):
self.additional_attribute_setup()
eav.unregister(Patient)
class SubPatientEav(self.PatientEav):
@classmethod
def get_attributes(cls):
return Attribute.objects.filter(slug='country')
eav.register(Patient, SubPatientEav)
self.patient.eav.city = 'Paris'
self.patient.eav.country = 'USA'
self.patient.save()
p = Patient.objects.get(pk=self.patient.pk)
self.assertFalse(hasattr(p.eav, 'city'))
self.assertEqual(p.eav.country, 'USA')
def test_blank_set_all_value_field_with_a_null_default_to_none(self):
self.value._blank()
self.assertEqual(self.value.value_text, None)
self.assertEqual(self.value.value_int, None)
self.assertEqual(self.value.value_float, None)
self.assertEqual(self.value.value_date, None)
self.assertEqual(self.value.value_object, None)
self.assertEqual(self.value.value_bool, None)
def test_get_value_on_eavvalue_return_python_object(self):
self.assertEqual(self.value._get_value(), 'Denver')
self.assertEqual(self.value.value, self.value._get_value())
def test_set_value_store_the_python_object_and_blank_other_fields(self):
self.value._set_value('Bamako')
self.assertEqual(self.value.value, 'Bamako')
self.assertEqual(self.value.value_text, 'Bamako')
self.assertEqual(self.value.value_int, None)
self.assertEqual(self.value.value_float, None)
self.assertEqual(self.value.value_date, None)
self.assertEqual(self.value.value_bool, None)
self.assertEqual(self.value.value_object, None)
def test_values(self):
self.additional_attribute_setup()
self.patient.eav.city = 'Beijin'
self.patient.eav.coutry = 'China'
self.patient.save()
self.assertEqual(list(self.patient.eav.get_values()),
list(Value.objects.exclude(value_text='Denver')))
def test_iteration(self):
self.additional_attribute_setup()
self.patient.eav.country = 'Kenya'
self.patient.eav.save()
self.assertEqual(list(Value.objects.all()),
list(Patient.objects.get(pk=self.patient.pk).eav))