diff options
| author | Floris den Hengst <florisdenhengst@gmail.com> | 2016-07-05 11:47:24 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-06-28 20:29:33 -0400 |
| commit | 96199e562dcc409ab4bdc2b2146fa7cf73c7c5fe (patch) | |
| tree | cb047cbe692bfe22a10b25b1336730079ec027bf /tests/postgres_tests | |
| parent | 2a0116266c4d81bd1cc4e3ea20efe9a7874f481b (diff) | |
Fixed #26067 -- Added ordering support to ArrayAgg and StringAgg.
Diffstat (limited to 'tests/postgres_tests')
| -rw-r--r-- | tests/postgres_tests/test_aggregates.py | 65 |
1 files changed, 60 insertions, 5 deletions
diff --git a/tests/postgres_tests/test_aggregates.py b/tests/postgres_tests/test_aggregates.py index d4a01ff027..85d6f45fd1 100644 --- a/tests/postgres_tests/test_aggregates.py +++ b/tests/postgres_tests/test_aggregates.py @@ -22,21 +22,57 @@ class TestGeneralAggregate(PostgreSQLTestCase): def setUpTestData(cls): AggregateTestModel.objects.create(boolean_field=True, char_field='Foo1', integer_field=0) AggregateTestModel.objects.create(boolean_field=False, char_field='Foo2', integer_field=1) - AggregateTestModel.objects.create(boolean_field=False, char_field='Foo3', integer_field=2) - AggregateTestModel.objects.create(boolean_field=True, char_field='Foo4', integer_field=0) + AggregateTestModel.objects.create(boolean_field=False, char_field='Foo4', integer_field=2) + AggregateTestModel.objects.create(boolean_field=True, char_field='Foo3', integer_field=0) def test_array_agg_charfield(self): values = AggregateTestModel.objects.aggregate(arrayagg=ArrayAgg('char_field')) - self.assertEqual(values, {'arrayagg': ['Foo1', 'Foo2', 'Foo3', 'Foo4']}) + self.assertEqual(values, {'arrayagg': ['Foo1', 'Foo2', 'Foo4', 'Foo3']}) + + def test_array_agg_charfield_ordering(self): + ordering_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']), + ([F('boolean_field'), F('char_field').desc()], ['Foo4', 'Foo2', 'Foo3', 'Foo1']), + ((F('boolean_field'), F('char_field').desc()), ['Foo4', 'Foo2', 'Foo3', 'Foo1']), + ('char_field', ['Foo1', 'Foo2', 'Foo3', 'Foo4']), + ('-char_field', ['Foo4', 'Foo3', 'Foo2', 'Foo1']), + ) + for ordering, expected_output in ordering_test_cases: + with self.subTest(ordering=ordering, expected_output=expected_output): + values = AggregateTestModel.objects.aggregate( + arrayagg=ArrayAgg('char_field', ordering=ordering) + ) + self.assertEqual(values, {'arrayagg': expected_output}) def test_array_agg_integerfield(self): values = AggregateTestModel.objects.aggregate(arrayagg=ArrayAgg('integer_field')) self.assertEqual(values, {'arrayagg': [0, 1, 2, 0]}) + def test_array_agg_integerfield_ordering(self): + values = AggregateTestModel.objects.aggregate( + arrayagg=ArrayAgg('integer_field', ordering=F('integer_field').desc()) + ) + self.assertEqual(values, {'arrayagg': [2, 1, 0, 0]}) + def test_array_agg_booleanfield(self): values = AggregateTestModel.objects.aggregate(arrayagg=ArrayAgg('boolean_field')) self.assertEqual(values, {'arrayagg': [True, False, False, True]}) + def test_array_agg_booleanfield_ordering(self): + ordering_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): + values = AggregateTestModel.objects.aggregate( + arrayagg=ArrayAgg('boolean_field', ordering=ordering) + ) + self.assertEqual(values, {'arrayagg': expected_output}) + def test_array_agg_empty_result(self): AggregateTestModel.objects.all().delete() values = AggregateTestModel.objects.aggregate(arrayagg=ArrayAgg('char_field')) @@ -122,17 +158,36 @@ class TestGeneralAggregate(PostgreSQLTestCase): def test_string_agg_charfield(self): values = AggregateTestModel.objects.aggregate(stringagg=StringAgg('char_field', delimiter=';')) - self.assertEqual(values, {'stringagg': 'Foo1;Foo2;Foo3;Foo4'}) + self.assertEqual(values, {'stringagg': 'Foo1;Foo2;Foo4;Foo3'}) + + def test_string_agg_charfield_ordering(self): + ordering_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'), + ) + for ordering, expected_output in ordering_test_cases: + with self.subTest(ordering=ordering, expected_output=expected_output): + values = AggregateTestModel.objects.aggregate( + stringagg=StringAgg('char_field', delimiter=';', ordering=ordering) + ) + self.assertEqual(values, {'stringagg': expected_output}) def test_string_agg_empty_result(self): AggregateTestModel.objects.all().delete() values = AggregateTestModel.objects.aggregate(stringagg=StringAgg('char_field', delimiter=';')) self.assertEqual(values, {'stringagg': ''}) + def test_orderable_agg_alternative_fields(self): + values = AggregateTestModel.objects.aggregate( + arrayagg=ArrayAgg('integer_field', ordering=F('char_field').asc()) + ) + self.assertEqual(values, {'arrayagg': [0, 1, 0, 2]}) + @skipUnlessDBFeature('has_jsonb_agg') def test_json_agg(self): values = AggregateTestModel.objects.aggregate(jsonagg=JSONBAgg('char_field')) - self.assertEqual(values, {'jsonagg': ['Foo1', 'Foo2', 'Foo3', 'Foo4']}) + self.assertEqual(values, {'jsonagg': ['Foo1', 'Foo2', 'Foo4', 'Foo3']}) @skipUnlessDBFeature('has_jsonb_agg') def test_json_agg_empty(self): |
