mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.7 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.create(name='Ivan Ivanov', alias='iivanov')
 | |
| 
 | |
|     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})
 | |
| 
 | |
| 
 | |
| @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()
 |