|
@@ -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"]})
|