From 22e05007aebd25e044f1daf5e2902619de491b85 Mon Sep 17 00:00:00 2001 From: dbate Date: Mon, 7 Jul 2014 11:28:15 +0100 Subject: [PATCH] IterField now handles tuples --- django_cookbook/model/fields.py | 2 +- .../test/unit/test_IterField_GetPrepValue.py | 57 ++++++++++++++++++ .../test/unit/test_IterField_ToPython.py | 59 +++++++++++++++++++ 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 django_cookbook/test/unit/test_IterField_GetPrepValue.py create mode 100644 django_cookbook/test/unit/test_IterField_ToPython.py diff --git a/django_cookbook/model/fields.py b/django_cookbook/model/fields.py index c7ebeee..3edb585 100644 --- a/django_cookbook/model/fields.py +++ b/django_cookbook/model/fields.py @@ -10,7 +10,7 @@ class IterField(with_metaclass(SubfieldBase, TextField)): """ def to_python(self, value): - if isinstance(value, list) or isinstance(value, dict) or value is None: + if isinstance(value, list) or isinstance(value, dict) or isinstance(value, tuple) or value is None: return value if not isinstance(value, bytes): diff --git a/django_cookbook/test/unit/test_IterField_GetPrepValue.py b/django_cookbook/test/unit/test_IterField_GetPrepValue.py new file mode 100644 index 0000000..a622dce --- /dev/null +++ b/django_cookbook/test/unit/test_IterField_GetPrepValue.py @@ -0,0 +1,57 @@ +import os +import pickle + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_cookbook.test.settings") + +from django_cookbook.model.fields import IterField +from django.test import TestCase + + +class IterField_GetPrepValue(TestCase): + def test_ValueIsAnEmptyList_StringIsEmptyList(self): + field = IterField() + value = [] + + self.assertEqual(pickle.dumps(value), field.get_prep_value(value)) + + def test_ValueIsAnEmptyDictionary_StringIsEmptyDict(self): + field = IterField() + value = {} + + self.assertEqual(pickle.dumps(value), field.get_prep_value(value)) + + def test_ValueIsATuple_StringIsEmptyDict(self): + field = IterField() + value = (1, 2, 3) + + self.assertEqual(pickle.dumps(value), field.get_prep_value(value)) + + def test_ValueIsListOfElements_StringIsJsonRepresentationOfThatListWithNoSpaces(self): + field = IterField() + value = [1, 2, 3, 4, 5] + + self.assertEqual(pickle.dumps(value), field.get_prep_value(value)) + + def test_ValueIsListOfListsAndDictionaries_StringIsJsonRepresentationOfThatListWithNoSpaces(self): + field = IterField() + value = [[1, 2, 3], {4: 5}] + + self.assertEqual(pickle.dumps(value), field.get_prep_value(value)) + + def test_ValueIsDictionaryOfElements_StringIsJsonRepresentationOfThatListWithNoSpaces(self): + field = IterField() + value = {1: 2, 3: 4, 5: 6} + + self.assertEqual(pickle.dumps(value), field.get_prep_value(value)) + + def test_ValueIsDictionaryOfListsAndDictionaries_StringIsJsonRepresentationOfThatListWithNoSpaces(self): + field = IterField() + value = {1: {2: 3}, 4: [5, 6]} + + self.assertEqual(pickle.dumps(value), field.get_prep_value(value)) + + def test_ValueIsTupleOfListsAndDictionaries_StringIsJsonRepresentationOfThatListWithNoSpaces(self): + field = IterField() + value = (0, {1: {2: 3}}, [4, 5, 6]) + + self.assertEqual(pickle.dumps(value), field.get_prep_value(value)) diff --git a/django_cookbook/test/unit/test_IterField_ToPython.py b/django_cookbook/test/unit/test_IterField_ToPython.py new file mode 100644 index 0000000..648e136 --- /dev/null +++ b/django_cookbook/test/unit/test_IterField_ToPython.py @@ -0,0 +1,59 @@ +import os +import pickle + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_cookbook.test.settings") + +from django.test import TestCase +from django_cookbook.model.fields import IterField + + +class IterField_ToPython(TestCase): + def test_ValueIsNone_ReturnedValueIsNone(self): + field = IterField() + + self.assertIsNone(field.to_python(None)) + + def test_StringIsEmpty_ReturnedValueIsEmptyList(self): + field = IterField() + + self.assertEqual([], field.to_python(b"")) + + def test_ValueIsList_ListIsReturned(self): + field = IterField() + + self.assertEqual([1, 2, {3: 4}], field.to_python([1, 2, {3: 4}])) + + def test_ValueIsDictionary_DictionaryIsReturned(self): + field = IterField() + + self.assertEqual({1: 2, 3: [4, 5, 6]}, field.to_python({1: 2, 3: [4, 5, 6]})) + + def test_ValueIsTuple_TupleIsReturned(self): + field = IterField() + + self.assertEqual((1, 2, 3, 4, 5, 6), field.to_python((1, 2, 3, 4, 5, 6))) + + def test_StringIsEmptyList_ReturnedValueIsEmptyList(self): + field = IterField() + + self.assertEqual([], field.to_python(pickle.dumps([]))) + + def test_StringIsListWithOneField_ReturnedValueIsListWithThatField(self): + field = IterField() + + self.assertEqual(["foo"], field.to_python(pickle.dumps(["foo"]))) + + def test_StringIsListWithMultipleField_ReturnedValueIsListWithThoseFields(self): + field = IterField() + + self.assertEqual(["foo", "bar", "boo"], field.to_python(pickle.dumps(["foo", "bar", "boo"]))) + + def test_StringIsListWithMultipleFieldOneOfWhichIsAList_ReturnedValueIsListWithThoseFields(self): + field = IterField() + + self.assertEqual(["foo", ["bar", "boo"], "moo"], field.to_python(pickle.dumps(["foo", ["bar", "boo"], "moo"]))) + + def test_StringIsDictionary_ReturnedValueIsADictionaryWithTheCorrectFields(self): + field = IterField() + + self.assertEqual({"foo": "bar", "boo": ["moo", "maa"]}, field.to_python(pickle.dumps({"foo": "bar", "boo": ["moo", "maa"]}))) \ No newline at end of file