diff options
author | Simon Charette <charette.s@gmail.com> | 2022-11-02 22:03:05 -0400 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-12-01 19:14:00 +0100 |
commit | 0ff46591ac3010841c73fd26e0fef93995fedd99 (patch) | |
tree | 7373b7f028df958db09d353e603124bc52b37bed /tests/postgres_tests | |
parent | d3e746ace5eeea07216da97d9c3801f2fdc43223 (diff) | |
download | django-0ff46591ac3010841c73fd26e0fef93995fedd99.tar.gz |
Refs #33308 -- Deprecated support for passing encoded JSON string literals to JSONField & co.
JSON should be provided as literal Python objects an not in their
encoded string literal forms.
Diffstat (limited to 'tests/postgres_tests')
-rw-r--r-- | tests/postgres_tests/test_aggregates.py | 66 |
1 files changed, 61 insertions, 5 deletions
diff --git a/tests/postgres_tests/test_aggregates.py b/tests/postgres_tests/test_aggregates.py index 629493b78f..183cff10c9 100644 --- a/tests/postgres_tests/test_aggregates.py +++ b/tests/postgres_tests/test_aggregates.py @@ -4,6 +4,7 @@ from django.db.models import ( F, Func, IntegerField, + JSONField, OuterRef, Q, Subquery, @@ -15,7 +16,7 @@ from django.db.models.functions import Cast, Concat, Substr from django.test import skipUnlessDBFeature from django.test.utils import Approximate, ignore_warnings from django.utils import timezone -from django.utils.deprecation import RemovedInDjango50Warning +from django.utils.deprecation import RemovedInDjango50Warning, RemovedInDjango51Warning from . import PostgreSQLTestCase from .models import AggregateTestModel, HotelReservation, Room, StatTestModel @@ -124,7 +125,11 @@ class TestGeneralAggregate(PostgreSQLTestCase): (BitOr("integer_field", default=0), 0), (BoolAnd("boolean_field", default=False), False), (BoolOr("boolean_field", default=False), False), - (JSONBAgg("integer_field", default=Value('["<empty>"]')), ["<empty>"]), + (JSONBAgg("integer_field", default=["<empty>"]), ["<empty>"]), + ( + JSONBAgg("integer_field", default=Value(["<empty>"], JSONField())), + ["<empty>"], + ), (StringAgg("char_field", delimiter=";", default="<empty>"), "<empty>"), ( StringAgg("char_field", delimiter=";", default=Value("<empty>")), @@ -189,9 +194,7 @@ class TestGeneralAggregate(PostgreSQLTestCase): {"aggregation": []}, ) self.assertEqual( - queryset.aggregate( - aggregation=JSONBAgg("integer_field", default=Value("[]")) - ), + queryset.aggregate(aggregation=JSONBAgg("integer_field", default=[])), {"aggregation": []}, ) self.assertEqual( @@ -201,6 +204,59 @@ class TestGeneralAggregate(PostgreSQLTestCase): {"aggregation": ""}, ) + @ignore_warnings(category=RemovedInDjango51Warning) + def test_jsonb_agg_default_str_value(self): + AggregateTestModel.objects.all().delete() + queryset = AggregateTestModel.objects.all() + self.assertEqual( + queryset.aggregate( + aggregation=JSONBAgg("integer_field", default=Value("<empty>")) + ), + {"aggregation": "<empty>"}, + ) + + def test_jsonb_agg_default_str_value_deprecation(self): + queryset = AggregateTestModel.objects.all() + msg = ( + "Passing a Value() with an output_field that isn't a JSONField as " + "JSONBAgg(default) is deprecated. Pass default=Value('<empty>', " + "output_field=JSONField()) instead." + ) + with self.assertWarnsMessage(RemovedInDjango51Warning, msg): + queryset.aggregate( + aggregation=JSONBAgg("integer_field", default=Value("<empty>")) + ) + with self.assertWarnsMessage(RemovedInDjango51Warning, msg): + queryset.none().aggregate( + aggregation=JSONBAgg("integer_field", default=Value("<empty>")) + ), + + @ignore_warnings(category=RemovedInDjango51Warning) + def test_jsonb_agg_default_encoded_json_string(self): + AggregateTestModel.objects.all().delete() + queryset = AggregateTestModel.objects.all() + self.assertEqual( + queryset.aggregate( + aggregation=JSONBAgg("integer_field", default=Value("[]")) + ), + {"aggregation": []}, + ) + + def test_jsonb_agg_default_encoded_json_string_deprecation(self): + queryset = AggregateTestModel.objects.all() + msg = ( + "Passing an encoded JSON string as JSONBAgg(default) is deprecated. Pass " + "default=[] instead." + ) + with self.assertWarnsMessage(RemovedInDjango51Warning, msg): + queryset.aggregate( + aggregation=JSONBAgg("integer_field", default=Value("[]")) + ) + with self.assertWarnsMessage(RemovedInDjango51Warning, msg): + queryset.none().aggregate( + aggregation=JSONBAgg("integer_field", default=Value("[]")) + ) + def test_array_agg_charfield(self): values = AggregateTestModel.objects.aggregate(arrayagg=ArrayAgg("char_field")) self.assertEqual(values, {"arrayagg": ["Foo1", "Foo2", "Foo4", "Foo3"]}) |