e01d456e7b
Syncdb necessary.
109 lines
2.9 KiB
Python
109 lines
2.9 KiB
Python
from django.db import models
|
|
from django.test import TestCase
|
|
from django.utils import simplejson as json
|
|
|
|
from fields import JSONField
|
|
|
|
|
|
class JsonModel(models.Model):
|
|
json = JSONField()
|
|
|
|
|
|
class ComplexEncoder(json.JSONEncoder):
|
|
def default(self, obj):
|
|
if isinstance(obj, complex):
|
|
return {
|
|
'__complex__': True,
|
|
'real': obj.real,
|
|
'imag': obj.imag,
|
|
}
|
|
|
|
return json.JSONEncoder.default(self, obj)
|
|
|
|
|
|
def as_complex(dct):
|
|
if '__complex__' in dct:
|
|
return complex(dct['real'], dct['imag'])
|
|
return dct
|
|
|
|
|
|
class JSONModelCustomEncoders(models.Model):
|
|
# A JSON field that can store complex numbers
|
|
json = JSONField(
|
|
dump_kwargs={'cls': ComplexEncoder},
|
|
load_kwargs={'object_hook': as_complex},
|
|
)
|
|
|
|
|
|
class JSONFieldTest(TestCase):
|
|
"""JSONField Wrapper Tests"""
|
|
|
|
def test_json_field_create(self):
|
|
"""Test saving a JSON object in our JSONField"""
|
|
|
|
json_obj = {
|
|
"item_1": "this is a json blah",
|
|
"blergh": "hey, hey, hey"}
|
|
|
|
obj = JsonModel.objects.create(json=json_obj)
|
|
new_obj = JsonModel.objects.get(id=obj.id)
|
|
|
|
self.failUnlessEqual(new_obj.json, json_obj)
|
|
|
|
def test_json_field_modify(self):
|
|
"""Test modifying a JSON object in our JSONField"""
|
|
|
|
json_obj_1 = {'a': 1, 'b': 2}
|
|
json_obj_2 = {'a': 3, 'b': 4}
|
|
|
|
obj = JsonModel.objects.create(json=json_obj_1)
|
|
|
|
self.failUnlessEqual(obj.json, json_obj_1)
|
|
|
|
obj.json = json_obj_2
|
|
|
|
self.failUnlessEqual(obj.json, json_obj_2)
|
|
|
|
obj.save()
|
|
|
|
self.failUnlessEqual(obj.json, json_obj_2)
|
|
|
|
self.assert_(obj)
|
|
|
|
def test_json_field_load(self):
|
|
"""Test loading a JSON object from the DB"""
|
|
|
|
json_obj_1 = {'a': 1, 'b': 2}
|
|
|
|
obj = JsonModel.objects.create(json=json_obj_1)
|
|
|
|
new_obj = JsonModel.objects.get(id=obj.id)
|
|
|
|
self.failUnlessEqual(new_obj.json, json_obj_1)
|
|
|
|
def test_json_list(self):
|
|
"""Test storing a JSON list"""
|
|
|
|
json_obj = ["my", "list", "of", 1, "objs", {"hello": "there"}]
|
|
|
|
obj = JsonModel.objects.create(json=json_obj)
|
|
new_obj = JsonModel.objects.get(id=obj.id)
|
|
self.failUnlessEqual(new_obj.json, json_obj)
|
|
|
|
def test_empty_objects(self):
|
|
"""Test storing empty objects"""
|
|
|
|
for json_obj in [{}, [], 0, '', False]:
|
|
obj = JsonModel.objects.create(json=json_obj)
|
|
new_obj = JsonModel.objects.get(id=obj.id)
|
|
self.failUnlessEqual(json_obj, obj.json)
|
|
self.failUnlessEqual(json_obj, new_obj.json)
|
|
|
|
def test_custom_encoder(self):
|
|
"""Test encoder_cls and object_hook"""
|
|
value = 1 + 3j # A complex number
|
|
|
|
obj = JSONModelCustomEncoders.objects.create(json=value)
|
|
new_obj = JSONModelCustomEncoders.objects.get(pk=obj.pk)
|
|
self.failUnlessEqual(value, new_obj.json)
|