mirror of
				https://github.com/django/django.git
				synced 2025-10-26 07:06:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			115 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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()
 |