summaryrefslogtreecommitdiff
path: root/tests/db_functions/json
diff options
context:
space:
mode:
authorSage Abdullah <me@laymonage.com>2024-12-15 16:01:45 +0000
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2024-12-16 12:06:01 +0100
commitd7d711c68cc070d9b6962f43f97ece097162adcc (patch)
treec62e55926c88fc999cba8666d7595e054a1a4313 /tests/db_functions/json
parentd36ad43f612295e2740fa26b7307d4041044ae3e (diff)
Refs #35718, Refs #32179 -- Moved JSONObject to django.db.models.functions.json.
Diffstat (limited to 'tests/db_functions/json')
-rw-r--r--tests/db_functions/json/__init__.py0
-rw-r--r--tests/db_functions/json/test_json_object.py114
2 files changed, 114 insertions, 0 deletions
diff --git a/tests/db_functions/json/__init__.py b/tests/db_functions/json/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/db_functions/json/__init__.py
diff --git a/tests/db_functions/json/test_json_object.py b/tests/db_functions/json/test_json_object.py
new file mode 100644
index 0000000000..9a3d48288c
--- /dev/null
+++ b/tests/db_functions/json/test_json_object.py
@@ -0,0 +1,114 @@
+from django.db import NotSupportedError
+from django.db.models import F, Value
+from django.db.models.functions import JSONObject, Lower
+from django.test import TestCase
+from django.test.testcases import skipIfDBFeature, skipUnlessDBFeature
+from django.utils import timezone
+
+from ..models import Article, Author
+
+
+@skipUnlessDBFeature("has_json_object_function")
+class JSONObjectTests(TestCase):
+ @classmethod
+ def setUpTestData(cls):
+ Author.objects.bulk_create(
+ [
+ Author(name="Ivan Ivanov", alias="iivanov"),
+ Author(name="Bertha Berthy", alias="bberthy"),
+ ]
+ )
+
+ def test_empty(self):
+ obj = Author.objects.annotate(json_object=JSONObject()).first()
+ self.assertEqual(obj.json_object, {})
+
+ def test_basic(self):
+ obj = Author.objects.annotate(json_object=JSONObject(name="name")).first()
+ self.assertEqual(obj.json_object, {"name": "Ivan Ivanov"})
+
+ def test_expressions(self):
+ obj = Author.objects.annotate(
+ json_object=JSONObject(
+ name=Lower("name"),
+ alias="alias",
+ goes_by="goes_by",
+ salary=Value(30000.15),
+ age=F("age") * 2,
+ )
+ ).first()
+ self.assertEqual(
+ obj.json_object,
+ {
+ "name": "ivan ivanov",
+ "alias": "iivanov",
+ "goes_by": None,
+ "salary": 30000.15,
+ "age": 60,
+ },
+ )
+
+ def test_nested_json_object(self):
+ obj = Author.objects.annotate(
+ json_object=JSONObject(
+ name="name",
+ nested_json_object=JSONObject(
+ alias="alias",
+ age="age",
+ ),
+ )
+ ).first()
+ self.assertEqual(
+ obj.json_object,
+ {
+ "name": "Ivan Ivanov",
+ "nested_json_object": {
+ "alias": "iivanov",
+ "age": 30,
+ },
+ },
+ )
+
+ def test_nested_empty_json_object(self):
+ obj = Author.objects.annotate(
+ json_object=JSONObject(
+ name="name",
+ nested_json_object=JSONObject(),
+ )
+ ).first()
+ self.assertEqual(
+ obj.json_object,
+ {
+ "name": "Ivan Ivanov",
+ "nested_json_object": {},
+ },
+ )
+
+ def test_textfield(self):
+ Article.objects.create(
+ title="The Title",
+ text="x" * 4000,
+ written=timezone.now(),
+ )
+ obj = Article.objects.annotate(json_object=JSONObject(text=F("text"))).first()
+ self.assertEqual(obj.json_object, {"text": "x" * 4000})
+
+ def test_order_by_key(self):
+ qs = Author.objects.annotate(attrs=JSONObject(alias=F("alias"))).order_by(
+ "attrs__alias"
+ )
+ self.assertQuerySetEqual(qs, Author.objects.order_by("alias"))
+
+ def test_order_by_nested_key(self):
+ qs = Author.objects.annotate(
+ attrs=JSONObject(nested=JSONObject(alias=F("alias")))
+ ).order_by("-attrs__nested__alias")
+ self.assertQuerySetEqual(qs, Author.objects.order_by("-alias"))
+
+
+@skipIfDBFeature("has_json_object_function")
+class JSONObjectNotSupportedTests(TestCase):
+ def test_not_supported(self):
+ msg = "JSONObject() is not supported on this database backend."
+ with self.assertRaisesMessage(NotSupportedError, msg):
+ Author.objects.annotate(json_object=JSONObject()).get()