1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
# -*- coding: utf-8 -*-
from django.test import TestCase
from django_extensions.db.fields.json import dumps, loads, JSONField, JSONDict, JSONList
from .testapp.models import JSONFieldTestModel
class JsonFieldTest(TestCase):
def test_char_field_create(self):
j = JSONFieldTestModel.objects.create(a=6, j_field=dict(foo="bar"))
self.assertEqual(j.a, 6)
self.assertEqual(j.j_field, {"foo": "bar"})
def test_char_field_get_or_create(self):
j, created = JSONFieldTestModel.objects.get_or_create(
a=6, j_field=dict(foo="bar")
)
self.assertTrue(created)
self.assertEqual(j.a, 6)
self.assertEqual(j.j_field, {"foo": "bar"})
j, created = JSONFieldTestModel.objects.get_or_create(
a=6, j_field=dict(foo="bar")
)
self.assertFalse(created)
self.assertEqual(j.a, 6)
self.assertEqual(j.j_field, {"foo": "bar"})
def test_default(self):
j = JSONFieldTestModel.objects.create(a=1)
self.assertEqual(j.j_field, {})
def test_default_mutable(self):
j1 = JSONFieldTestModel.objects.create(a=1)
self.assertEqual(j1.j_field, {})
j2 = JSONFieldTestModel.objects.create(a=1)
self.assertEqual(j2.j_field, {})
self.assertIsNot(j1.j_field, j2.j_field)
def test_get_default(self):
j_field = JSONField()
value = j_field.get_default()
self.assertEqual(value, {})
self.assertIsInstance(value, JSONDict)
j_field = JSONField(default={})
value = j_field.get_default()
self.assertEqual(value, {})
self.assertIsInstance(value, JSONDict)
j_field = JSONField(default="{}")
value = j_field.get_default()
self.assertEqual(value, {})
self.assertIsInstance(value, JSONDict)
j_field = JSONField(default=[{}])
value = j_field.get_default()
self.assertEqual(value, [{}])
self.assertIsInstance(value, JSONList)
j_field = JSONField(default="[{}]")
value = j_field.get_default()
self.assertEqual(value, [{}])
self.assertIsInstance(value, JSONList)
j_field = JSONField(default=lambda: "{}")
value = j_field.get_default()
self.assertEqual(value, {})
self.assertIsInstance(value, JSONDict)
def test_empty_list(self):
j = JSONFieldTestModel.objects.create(a=6, j_field=[])
self.assertIsInstance(j.j_field, list)
self.assertEqual(j.j_field, [])
def test_float_values(self):
"""Tests that float values in JSONFields are correctly serialized over
repeated saves. Regression test for c382398b, which fixes floats
being returned as strings after a second save."""
test_instance = JSONFieldTestModel(a=6, j_field={"test": 0.1})
test_instance.save()
test_instance = JSONFieldTestModel.objects.get()
test_instance.save()
test_instance = JSONFieldTestModel.objects.get()
self.assertEqual(test_instance.j_field["test"], 0.1)
def test_get_prep_value(self):
j_field = JSONField()
self.assertEqual(
str(dumps([{"a": "a"}])),
j_field.get_prep_value(value=[{"a": "a"}]),
)
self.assertEqual(
str(dumps([{"a": "a"}])),
j_field.get_prep_value(value='[{"a": "a"}]'),
)
def test_get_db_prep_save(self):
j_field = JSONField()
self.assertEqual(
str(dumps([{"a": "a"}])),
j_field.get_db_prep_save(value=[{"a": "a"}], connection=None),
)
self.assertEqual(
str('[{"a": "a"}]'),
j_field.get_db_prep_save(value='[{"a": "a"}]', connection=None),
)
def test_to_python(self):
j_field = JSONField()
self.assertEqual(loads("1"), j_field.to_python("1"))
self.assertEqual(loads('"1"'), j_field.to_python('"1"'))
self.assertEqual(loads('[{"a": 1}]'), j_field.to_python('[{"a": 1}]'))
self.assertEqual(loads('[{"a": "1"}]'), j_field.to_python('[{"a": "1"}]'))
def test_bulk_update_custom_get_prep_value(self):
obj = JSONFieldTestModel.objects.create(a=1, j_field={"version": "1"})
obj.j_field["version"] = "1-alpha"
JSONFieldTestModel.objects.bulk_update([obj], ["j_field"])
self.assertSequenceEqual(
JSONFieldTestModel.objects.values("j_field"),
[{"j_field": {"version": "1-alpha"}}],
)
|