diff options
author | Nick Pope <nick.pope@flightdataservices.com> | 2020-08-06 11:43:42 +0200 |
---|---|---|
committer | Carlton Gibson <carlton@noumenal.es> | 2020-08-06 12:38:56 +0200 |
commit | 0a306f7da668e53af2516bfad759b52d6c650b69 (patch) | |
tree | b60b7e9b534d95830c6afd1f6bc39d0791d79b25 /tests/pagination | |
parent | f35840c19664fed7b6bc4cf561bf0b6fd1a3b463 (diff) | |
download | django-0a306f7da668e53af2516bfad759b52d6c650b69.tar.gz |
Fixed #25513 -- Extracted admin pagination to Paginator.get_elided_page_range().
Diffstat (limited to 'tests/pagination')
-rw-r--r-- | tests/pagination/tests.py | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/tests/pagination/tests.py b/tests/pagination/tests.py index f82d333ae7..d781bdf8a7 100644 --- a/tests/pagination/tests.py +++ b/tests/pagination/tests.py @@ -1,3 +1,5 @@ +import collections.abc +import unittest.mock import warnings from datetime import datetime @@ -304,6 +306,125 @@ class PaginationTests(SimpleTestCase): with self.subTest(page=page): self.assertEqual(expected, list(next(page_iterator))) + def test_get_elided_page_range(self): + # Paginator.validate_number() must be called: + paginator = Paginator([1, 2, 3], 2) + with unittest.mock.patch.object(paginator, 'validate_number') as mock: + mock.assert_not_called() + list(paginator.get_elided_page_range(2)) + mock.assert_called_with(2) + + ELLIPSIS = Paginator.ELLIPSIS + + # Range is not elided if not enough pages when using default arguments: + paginator = Paginator(range(10 * 100), 100) + page_range = paginator.get_elided_page_range(1) + self.assertIsInstance(page_range, collections.abc.Generator) + self.assertNotIn(ELLIPSIS, page_range) + paginator = Paginator(range(10 * 100 + 1), 100) + self.assertIsInstance(page_range, collections.abc.Generator) + page_range = paginator.get_elided_page_range(1) + self.assertIn(ELLIPSIS, page_range) + + # Range should be elided if enough pages when using default arguments: + tests = [ + # on_each_side=3, on_ends=2 + (1, [1, 2, 3, 4, ELLIPSIS, 49, 50]), + (6, [1, 2, 3, 4, 5, 6, 7, 8, 9, ELLIPSIS, 49, 50]), + (7, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ELLIPSIS, 49, 50]), + (8, [1, 2, ELLIPSIS, 5, 6, 7, 8, 9, 10, 11, ELLIPSIS, 49, 50]), + (43, [1, 2, ELLIPSIS, 40, 41, 42, 43, 44, 45, 46, ELLIPSIS, 49, 50]), + (44, [1, 2, ELLIPSIS, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]), + (45, [1, 2, ELLIPSIS, 42, 43, 44, 45, 46, 47, 48, 49, 50]), + (50, [1, 2, ELLIPSIS, 47, 48, 49, 50]), + ] + paginator = Paginator(range(5000), 100) + for number, expected in tests: + with self.subTest(number=number): + page_range = paginator.get_elided_page_range(number) + self.assertIsInstance(page_range, collections.abc.Generator) + self.assertEqual(list(page_range), expected) + + # Range is not elided if not enough pages when using custom arguments: + tests = [ + (6, 2, 1, 1), (8, 1, 3, 1), (8, 4, 0, 1), (4, 1, 1, 1), + # When on_each_side and on_ends are both <= 1 but not both == 1 it + # is a special case where the range is not elided until an extra + # page is added. + (2, 0, 1, 2), (2, 1, 0, 2), (1, 0, 0, 2), + ] + for pages, on_each_side, on_ends, elided_after in tests: + for offset in range(elided_after + 1): + with self.subTest(pages=pages, offset=elided_after, on_each_side=on_each_side, on_ends=on_ends): + paginator = Paginator(range((pages + offset) * 100), 100) + page_range = paginator.get_elided_page_range( + 1, + on_each_side=on_each_side, + on_ends=on_ends, + ) + self.assertIsInstance(page_range, collections.abc.Generator) + if offset < elided_after: + self.assertNotIn(ELLIPSIS, page_range) + else: + self.assertIn(ELLIPSIS, page_range) + + # Range should be elided if enough pages when using custom arguments: + tests = [ + # on_each_side=2, on_ends=1 + (1, 2, 1, [1, 2, 3, ELLIPSIS, 50]), + (4, 2, 1, [1, 2, 3, 4, 5, 6, ELLIPSIS, 50]), + (5, 2, 1, [1, 2, 3, 4, 5, 6, 7, ELLIPSIS, 50]), + (6, 2, 1, [1, ELLIPSIS, 4, 5, 6, 7, 8, ELLIPSIS, 50]), + (45, 2, 1, [1, ELLIPSIS, 43, 44, 45, 46, 47, ELLIPSIS, 50]), + (46, 2, 1, [1, ELLIPSIS, 44, 45, 46, 47, 48, 49, 50]), + (47, 2, 1, [1, ELLIPSIS, 45, 46, 47, 48, 49, 50]), + (50, 2, 1, [1, ELLIPSIS, 48, 49, 50]), + # on_each_side=1, on_ends=3 + (1, 1, 3, [1, 2, ELLIPSIS, 48, 49, 50]), + (5, 1, 3, [1, 2, 3, 4, 5, 6, ELLIPSIS, 48, 49, 50]), + (6, 1, 3, [1, 2, 3, 4, 5, 6, 7, ELLIPSIS, 48, 49, 50]), + (7, 1, 3, [1, 2, 3, ELLIPSIS, 6, 7, 8, ELLIPSIS, 48, 49, 50]), + (44, 1, 3, [1, 2, 3, ELLIPSIS, 43, 44, 45, ELLIPSIS, 48, 49, 50]), + (45, 1, 3, [1, 2, 3, ELLIPSIS, 44, 45, 46, 47, 48, 49, 50]), + (46, 1, 3, [1, 2, 3, ELLIPSIS, 45, 46, 47, 48, 49, 50]), + (50, 1, 3, [1, 2, 3, ELLIPSIS, 49, 50]), + # on_each_side=4, on_ends=0 + (1, 4, 0, [1, 2, 3, 4, 5, ELLIPSIS]), + (5, 4, 0, [1, 2, 3, 4, 5, 6, 7, 8, 9, ELLIPSIS]), + (6, 4, 0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ELLIPSIS]), + (7, 4, 0, [ELLIPSIS, 3, 4, 5, 6, 7, 8, 9, 10, 11, ELLIPSIS]), + (44, 4, 0, [ELLIPSIS, 40, 41, 42, 43, 44, 45, 46, 47, 48, ELLIPSIS]), + (45, 4, 0, [ELLIPSIS, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]), + (46, 4, 0, [ELLIPSIS, 42, 43, 44, 45, 46, 47, 48, 49, 50]), + (50, 4, 0, [ELLIPSIS, 46, 47, 48, 49, 50]), + # on_each_side=0, on_ends=1 + (1, 0, 1, [1, ELLIPSIS, 50]), + (2, 0, 1, [1, 2, ELLIPSIS, 50]), + (3, 0, 1, [1, 2, 3, ELLIPSIS, 50]), + (4, 0, 1, [1, ELLIPSIS, 4, ELLIPSIS, 50]), + (47, 0, 1, [1, ELLIPSIS, 47, ELLIPSIS, 50]), + (48, 0, 1, [1, ELLIPSIS, 48, 49, 50]), + (49, 0, 1, [1, ELLIPSIS, 49, 50]), + (50, 0, 1, [1, ELLIPSIS, 50]), + # on_each_side=0, on_ends=0 + (1, 0, 0, [1, ELLIPSIS]), + (2, 0, 0, [1, 2, ELLIPSIS]), + (3, 0, 0, [ELLIPSIS, 3, ELLIPSIS]), + (48, 0, 0, [ELLIPSIS, 48, ELLIPSIS]), + (49, 0, 0, [ELLIPSIS, 49, 50]), + (50, 0, 0, [ELLIPSIS, 50]), + ] + paginator = Paginator(range(5000), 100) + for number, on_each_side, on_ends, expected in tests: + with self.subTest(number=number, on_each_side=on_each_side, on_ends=on_ends): + page_range = paginator.get_elided_page_range( + number, + on_each_side=on_each_side, + on_ends=on_ends, + ) + self.assertIsInstance(page_range, collections.abc.Generator) + self.assertEqual(list(page_range), expected) + class ModelPaginationTests(TestCase): """ |