summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorNick Pope <nick.pope@flightdataservices.com>2020-08-06 11:43:42 +0200
committerCarlton Gibson <carlton@noumenal.es>2020-08-06 12:38:56 +0200
commit0a306f7da668e53af2516bfad759b52d6c650b69 (patch)
treeb60b7e9b534d95830c6afd1f6bc39d0791d79b25 /tests
parentf35840c19664fed7b6bc4cf561bf0b6fd1a3b463 (diff)
Fixed #25513 -- Extracted admin pagination to Paginator.get_elided_page_range().
Diffstat (limited to 'tests')
-rw-r--r--tests/admin_changelist/tests.py36
-rw-r--r--tests/pagination/tests.py121
2 files changed, 139 insertions, 18 deletions
diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py
index bd4d406c10..28acc401c1 100644
--- a/tests/admin_changelist/tests.py
+++ b/tests/admin_changelist/tests.py
@@ -1242,32 +1242,32 @@ class ChangeListTests(TestCase):
request = self.factory.get('/group/')
request.user = self.superuser
cl = m.get_changelist_instance(request)
- per_page = cl.list_per_page = 10
+ cl.list_per_page = 10
- for page_num, objects_count, expected_page_range in [
- (1, per_page, []),
- (1, per_page * 2, [1, 2]),
- (6, per_page * 11, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),
- (6, per_page * 12, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),
- (6, per_page * 13, [1, 2, 3, 4, 5, 6, 7, 8, 9, '.', 12, 13]),
- (7, per_page * 12, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),
- (7, per_page * 13, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]),
- (7, per_page * 14, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, '.', 13, 14]),
- (8, per_page * 13, [1, 2, '.', 5, 6, 7, 8, 9, 10, 11, 12, 13]),
- (8, per_page * 14, [1, 2, '.', 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]),
- (8, per_page * 15, [1, 2, '.', 5, 6, 7, 8, 9, 10, 11, '.', 14, 15]),
+ ELLIPSIS = cl.paginator.ELLIPSIS
+ for number, pages, expected in [
+ (1, 1, []),
+ (1, 2, [1, 2]),
+ (6, 11, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),
+ (6, 12, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),
+ (6, 13, [1, 2, 3, 4, 5, 6, 7, 8, 9, ELLIPSIS, 12, 13]),
+ (7, 12, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),
+ (7, 13, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]),
+ (7, 14, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ELLIPSIS, 13, 14]),
+ (8, 13, [1, 2, ELLIPSIS, 5, 6, 7, 8, 9, 10, 11, 12, 13]),
+ (8, 14, [1, 2, ELLIPSIS, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]),
+ (8, 15, [1, 2, ELLIPSIS, 5, 6, 7, 8, 9, 10, 11, ELLIPSIS, 14, 15]),
]:
with self.subTest(number=number, pages=pages):
- # assuming exactly `objects_count` objects
+ # assuming exactly `pages * cl.list_per_page` objects
Group.objects.all().delete()
- for i in range(objects_count):
+ for i in range(pages * cl.list_per_page):
Group.objects.create(name='test band')
# setting page number and calculating page range
- cl.page_num = page_num
+ cl.page_num = number
cl.get_results(request)
- real_page_range = pagination(cl)['page_range']
- self.assertEqual(expected_page_range, list(real_page_range))
+ self.assertEqual(list(pagination(cl)['page_range']), expected)
def test_object_tools_displayed_no_add_permission(self):
"""
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):
"""