diff options
| author | Chris Muthig <camuthig@gmail.com> | 2024-07-06 10:44:11 -0600 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2025-01-06 09:39:21 +0100 |
| commit | d734f1651ccc0a74325f7b55f7eecc68edef6453 (patch) | |
| tree | a179a47c989be4c29a9dfab9d4627553a63c1937 /tests/postgres_tests | |
| parent | 46b3e7dd8cc1792a40bb8b4d0c267f3d1ceef68c (diff) | |
Refs #35444 -- Deprecated contrib.postgres aggregates ordering for order_by.
Aligns the argument with SQL standards already used in Window.order_by and
sets up for adding support to Aggregate.
Diffstat (limited to 'tests/postgres_tests')
| -rw-r--r-- | tests/postgres_tests/test_aggregates.py | 109 |
1 files changed, 67 insertions, 42 deletions
diff --git a/tests/postgres_tests/test_aggregates.py b/tests/postgres_tests/test_aggregates.py index b72310bdf1..885512cfca 100644 --- a/tests/postgres_tests/test_aggregates.py +++ b/tests/postgres_tests/test_aggregates.py @@ -15,6 +15,7 @@ from django.db.models.fields.json import KeyTextTransform, KeyTransform from django.db.models.functions import Cast, Concat, LPad, Substr from django.test.utils import Approximate from django.utils import timezone +from django.utils.deprecation import RemovedInDjango61Warning from . import PostgreSQLTestCase from .models import AggregateTestModel, HotelReservation, Room, StatTestModel @@ -148,12 +149,36 @@ class TestGeneralAggregate(PostgreSQLTestCase): ) self.assertEqual(values, {"aggregation": expected_result}) + def test_ordering_warns_of_deprecation(self): + msg = "The ordering argument is deprecated. Use order_by instead." + with self.assertWarnsMessage(RemovedInDjango61Warning, msg) as ctx: + values = AggregateTestModel.objects.aggregate( + arrayagg=ArrayAgg("integer_field", ordering=F("integer_field").desc()) + ) + self.assertEqual(values, {"arrayagg": [2, 1, 0, 0]}) + self.assertEqual(ctx.filename, __file__) + + def test_ordering_and_order_by_causes_error(self): + with self.assertWarns(RemovedInDjango61Warning): + with self.assertRaisesMessage( + TypeError, + "Cannot specify both order_by and ordering.", + ): + AggregateTestModel.objects.aggregate( + stringagg=StringAgg( + "char_field", + delimiter=Value("'"), + order_by="char_field", + ordering="char_field", + ) + ) + def test_array_agg_charfield(self): values = AggregateTestModel.objects.aggregate(arrayagg=ArrayAgg("char_field")) self.assertEqual(values, {"arrayagg": ["Foo1", "Foo2", "Foo4", "Foo3"]}) - def test_array_agg_charfield_ordering(self): - ordering_test_cases = ( + def test_array_agg_charfield_order_by(self): + order_by_test_cases = ( (F("char_field").desc(), ["Foo4", "Foo3", "Foo2", "Foo1"]), (F("char_field").asc(), ["Foo1", "Foo2", "Foo3", "Foo4"]), (F("char_field"), ["Foo1", "Foo2", "Foo3", "Foo4"]), @@ -178,10 +203,10 @@ class TestGeneralAggregate(PostgreSQLTestCase): ["Foo3", "Foo1", "Foo2", "Foo4"], ), ) - for ordering, expected_output in ordering_test_cases: - with self.subTest(ordering=ordering, expected_output=expected_output): + for order_by, expected_output in order_by_test_cases: + with self.subTest(order_by=order_by, expected_output=expected_output): values = AggregateTestModel.objects.aggregate( - arrayagg=ArrayAgg("char_field", ordering=ordering) + arrayagg=ArrayAgg("char_field", order_by=order_by) ) self.assertEqual(values, {"arrayagg": expected_output}) @@ -191,9 +216,9 @@ class TestGeneralAggregate(PostgreSQLTestCase): ) self.assertEqual(values, {"arrayagg": [0, 1, 2, 0]}) - def test_array_agg_integerfield_ordering(self): + def test_array_agg_integerfield_order_by(self): values = AggregateTestModel.objects.aggregate( - arrayagg=ArrayAgg("integer_field", ordering=F("integer_field").desc()) + arrayagg=ArrayAgg("integer_field", order_by=F("integer_field").desc()) ) self.assertEqual(values, {"arrayagg": [2, 1, 0, 0]}) @@ -203,16 +228,16 @@ class TestGeneralAggregate(PostgreSQLTestCase): ) self.assertEqual(values, {"arrayagg": [True, False, False, True]}) - def test_array_agg_booleanfield_ordering(self): - ordering_test_cases = ( + def test_array_agg_booleanfield_order_by(self): + order_by_test_cases = ( (F("boolean_field").asc(), [False, False, True, True]), (F("boolean_field").desc(), [True, True, False, False]), (F("boolean_field"), [False, False, True, True]), ) - for ordering, expected_output in ordering_test_cases: - with self.subTest(ordering=ordering, expected_output=expected_output): + for order_by, expected_output in order_by_test_cases: + with self.subTest(order_by=order_by, expected_output=expected_output): values = AggregateTestModel.objects.aggregate( - arrayagg=ArrayAgg("boolean_field", ordering=ordering) + arrayagg=ArrayAgg("boolean_field", order_by=order_by) ) self.assertEqual(values, {"arrayagg": expected_output}) @@ -225,22 +250,22 @@ class TestGeneralAggregate(PostgreSQLTestCase): ) self.assertEqual(values, {"arrayagg": ["pl", "en"]}) - def test_array_agg_jsonfield_ordering(self): + def test_array_agg_jsonfield_order_by(self): values = AggregateTestModel.objects.aggregate( arrayagg=ArrayAgg( KeyTransform("lang", "json_field"), filter=Q(json_field__lang__isnull=False), - ordering=KeyTransform("lang", "json_field"), + order_by=KeyTransform("lang", "json_field"), ), ) self.assertEqual(values, {"arrayagg": ["en", "pl"]}) - def test_array_agg_filter_and_ordering_params(self): + def test_array_agg_filter_and_order_by_params(self): values = AggregateTestModel.objects.aggregate( arrayagg=ArrayAgg( "char_field", filter=Q(json_field__has_key="lang"), - ordering=LPad(Cast("integer_field", CharField()), 2, Value("0")), + order_by=LPad(Cast("integer_field", CharField()), 2, Value("0")), ) ) self.assertEqual(values, {"arrayagg": ["Foo2", "Foo4"]}) @@ -406,8 +431,8 @@ class TestGeneralAggregate(PostgreSQLTestCase): ) self.assertEqual(values, {"stringagg": "Text1;Text2;Text4;Text3"}) - def test_string_agg_charfield_ordering(self): - ordering_test_cases = ( + def test_string_agg_charfield_order_by(self): + order_by_test_cases = ( (F("char_field").desc(), "Foo4;Foo3;Foo2;Foo1"), (F("char_field").asc(), "Foo1;Foo2;Foo3;Foo4"), (F("char_field"), "Foo1;Foo2;Foo3;Foo4"), @@ -416,19 +441,19 @@ class TestGeneralAggregate(PostgreSQLTestCase): (Concat("char_field", Value("@")), "Foo1;Foo2;Foo3;Foo4"), (Concat("char_field", Value("@")).desc(), "Foo4;Foo3;Foo2;Foo1"), ) - for ordering, expected_output in ordering_test_cases: - with self.subTest(ordering=ordering, expected_output=expected_output): + for order_by, expected_output in order_by_test_cases: + with self.subTest(order_by=order_by, expected_output=expected_output): values = AggregateTestModel.objects.aggregate( - stringagg=StringAgg("char_field", delimiter=";", ordering=ordering) + stringagg=StringAgg("char_field", delimiter=";", order_by=order_by) ) self.assertEqual(values, {"stringagg": expected_output}) - def test_string_agg_jsonfield_ordering(self): + def test_string_agg_jsonfield_order_by(self): values = AggregateTestModel.objects.aggregate( stringagg=StringAgg( KeyTextTransform("lang", "json_field"), delimiter=";", - ordering=KeyTextTransform("lang", "json_field"), + order_by=KeyTextTransform("lang", "json_field"), output_field=CharField(), ), ) @@ -446,7 +471,7 @@ class TestGeneralAggregate(PostgreSQLTestCase): def test_orderable_agg_alternative_fields(self): values = AggregateTestModel.objects.aggregate( - arrayagg=ArrayAgg("integer_field", ordering=F("char_field").asc()) + arrayagg=ArrayAgg("integer_field", order_by=F("char_field").asc()) ) self.assertEqual(values, {"arrayagg": [0, 1, 0, 2]}) @@ -454,8 +479,8 @@ class TestGeneralAggregate(PostgreSQLTestCase): values = AggregateTestModel.objects.aggregate(jsonbagg=JSONBAgg("char_field")) self.assertEqual(values, {"jsonbagg": ["Foo1", "Foo2", "Foo4", "Foo3"]}) - def test_jsonb_agg_charfield_ordering(self): - ordering_test_cases = ( + def test_jsonb_agg_charfield_order_by(self): + order_by_test_cases = ( (F("char_field").desc(), ["Foo4", "Foo3", "Foo2", "Foo1"]), (F("char_field").asc(), ["Foo1", "Foo2", "Foo3", "Foo4"]), (F("char_field"), ["Foo1", "Foo2", "Foo3", "Foo4"]), @@ -464,38 +489,38 @@ class TestGeneralAggregate(PostgreSQLTestCase): (Concat("char_field", Value("@")), ["Foo1", "Foo2", "Foo3", "Foo4"]), (Concat("char_field", Value("@")).desc(), ["Foo4", "Foo3", "Foo2", "Foo1"]), ) - for ordering, expected_output in ordering_test_cases: - with self.subTest(ordering=ordering, expected_output=expected_output): + for order_by, expected_output in order_by_test_cases: + with self.subTest(order_by=order_by, expected_output=expected_output): values = AggregateTestModel.objects.aggregate( - jsonbagg=JSONBAgg("char_field", ordering=ordering), + jsonbagg=JSONBAgg("char_field", order_by=order_by), ) self.assertEqual(values, {"jsonbagg": expected_output}) - def test_jsonb_agg_integerfield_ordering(self): + def test_jsonb_agg_integerfield_order_by(self): values = AggregateTestModel.objects.aggregate( - jsonbagg=JSONBAgg("integer_field", ordering=F("integer_field").desc()), + jsonbagg=JSONBAgg("integer_field", order_by=F("integer_field").desc()), ) self.assertEqual(values, {"jsonbagg": [2, 1, 0, 0]}) - def test_jsonb_agg_booleanfield_ordering(self): - ordering_test_cases = ( + def test_jsonb_agg_booleanfield_order_by(self): + order_by_test_cases = ( (F("boolean_field").asc(), [False, False, True, True]), (F("boolean_field").desc(), [True, True, False, False]), (F("boolean_field"), [False, False, True, True]), ) - for ordering, expected_output in ordering_test_cases: - with self.subTest(ordering=ordering, expected_output=expected_output): + for order_by, expected_output in order_by_test_cases: + with self.subTest(order_by=order_by, expected_output=expected_output): values = AggregateTestModel.objects.aggregate( - jsonbagg=JSONBAgg("boolean_field", ordering=ordering), + jsonbagg=JSONBAgg("boolean_field", order_by=order_by), ) self.assertEqual(values, {"jsonbagg": expected_output}) - def test_jsonb_agg_jsonfield_ordering(self): + def test_jsonb_agg_jsonfield_order_by(self): values = AggregateTestModel.objects.aggregate( jsonbagg=JSONBAgg( KeyTransform("lang", "json_field"), filter=Q(json_field__lang__isnull=False), - ordering=KeyTransform("lang", "json_field"), + order_by=KeyTransform("lang", "json_field"), ), ) self.assertEqual(values, {"jsonbagg": ["en", "pl"]}) @@ -533,7 +558,7 @@ class TestGeneralAggregate(PostgreSQLTestCase): Room.objects.annotate( requirements=JSONBAgg( "hotelreservation__requirements", - ordering="-hotelreservation__start", + order_by="-hotelreservation__start", ) ) .filter(requirements__0__sea_view=True) @@ -552,7 +577,7 @@ class TestGeneralAggregate(PostgreSQLTestCase): ], ) - def test_string_agg_array_agg_ordering_in_subquery(self): + def test_string_agg_array_agg_order_by_in_subquery(self): stats = [] for i, agg in enumerate(AggregateTestModel.objects.order_by("char_field")): stats.append(StatTestModel(related_field=agg, int1=i, int2=i + 1)) @@ -561,7 +586,7 @@ class TestGeneralAggregate(PostgreSQLTestCase): for aggregate, expected_result in ( ( - ArrayAgg("stattestmodel__int1", ordering="-stattestmodel__int2"), + ArrayAgg("stattestmodel__int1", order_by="-stattestmodel__int2"), [ ("Foo1", [0, 1]), ("Foo2", [1, 2]), @@ -573,7 +598,7 @@ class TestGeneralAggregate(PostgreSQLTestCase): StringAgg( Cast("stattestmodel__int1", CharField()), delimiter=";", - ordering="-stattestmodel__int2", + order_by="-stattestmodel__int2", ), [("Foo1", "0;1"), ("Foo2", "1;2"), ("Foo3", "2;3"), ("Foo4", "3;4")], ), |
