summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/model_fields/test_jsonfield.py31
-rw-r--r--tests/postgres_tests/test_aggregates.py66
2 files changed, 90 insertions, 7 deletions
diff --git a/tests/model_fields/test_jsonfield.py b/tests/model_fields/test_jsonfield.py
index 277e8aaa3c..05816817ef 100644
--- a/tests/model_fields/test_jsonfield.py
+++ b/tests/model_fields/test_jsonfield.py
@@ -19,6 +19,7 @@ from django.db.models import (
ExpressionWrapper,
F,
IntegerField,
+ JSONField,
OuterRef,
Q,
Subquery,
@@ -36,6 +37,7 @@ from django.db.models.fields.json import (
from django.db.models.functions import Cast
from django.test import SimpleTestCase, TestCase, skipIfDBFeature, skipUnlessDBFeature
from django.test.utils import CaptureQueriesContext
+from django.utils.deprecation import RemovedInDjango51Warning
from .models import CustomJSONDecoder, JSONModel, NullableJSONModel, RelatedJSONModel
@@ -191,15 +193,40 @@ class TestSaveLoad(TestCase):
obj.refresh_from_db()
self.assertIsNone(obj.value)
+ def test_ambiguous_str_value_deprecation(self):
+ msg = (
+ "Providing an encoded JSON string via Value() is deprecated. Use Value([], "
+ "output_field=JSONField()) instead."
+ )
+ with self.assertWarnsMessage(RemovedInDjango51Warning, msg):
+ obj = NullableJSONModel.objects.create(value=Value("[]"))
+ obj.refresh_from_db()
+ self.assertEqual(obj.value, [])
+
+ @skipUnlessDBFeature("supports_primitives_in_json_field")
+ def test_value_str_primitives_deprecation(self):
+ msg = (
+ "Providing an encoded JSON string via Value() is deprecated. Use "
+ "Value(None, output_field=JSONField()) instead."
+ )
+ with self.assertWarnsMessage(RemovedInDjango51Warning, msg):
+ obj = NullableJSONModel.objects.create(value=Value("null"))
+ obj.refresh_from_db()
+ self.assertIsNone(obj.value)
+ obj = NullableJSONModel.objects.create(value=Value("invalid-json"))
+ obj.refresh_from_db()
+ self.assertEqual(obj.value, "invalid-json")
+
@skipUnlessDBFeature("supports_primitives_in_json_field")
def test_json_null_different_from_sql_null(self):
- json_null = NullableJSONModel.objects.create(value=Value("null"))
+ json_null = NullableJSONModel.objects.create(value=Value(None, JSONField()))
+ NullableJSONModel.objects.update(value=Value(None, JSONField()))
json_null.refresh_from_db()
sql_null = NullableJSONModel.objects.create(value=None)
sql_null.refresh_from_db()
# 'null' is not equal to NULL in the database.
self.assertSequenceEqual(
- NullableJSONModel.objects.filter(value=Value("null")),
+ NullableJSONModel.objects.filter(value=Value(None, JSONField())),
[json_null],
)
self.assertSequenceEqual(
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"]})