test_paginator.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. from itertools import product
  2. from django.test import TestCase
  3. from ..paginator import PostsPaginator
  4. class PostsPaginatorTests(TestCase):
  5. def test_paginator(self):
  6. """pages share first and last items with each other"""
  7. items = [i + 1 for i in range(30)]
  8. paginator = PostsPaginator(items, 5)
  9. self.assertEqual(
  10. self.get_paginator_items_list(paginator),
  11. [
  12. [1, 2, 3, 4, 5],
  13. [5, 6, 7, 8, 9],
  14. [9, 10, 11, 12, 13],
  15. [13, 14, 15, 16, 17],
  16. [17, 18, 19, 20, 21],
  17. [21, 22, 23, 24, 25],
  18. [25, 26, 27, 28, 29],
  19. [29, 30],
  20. ],
  21. )
  22. def test_paginator_orphans(self):
  23. """paginator handles orphans"""
  24. items = [i + 1 for i in range(16)]
  25. paginator = PostsPaginator(items, 8, 6)
  26. self.assertEqual(
  27. self.get_paginator_items_list(paginator),
  28. [[1, 2, 3, 4, 5, 6, 7, 8], [8, 9, 10, 11, 12, 13, 14, 15, 16]],
  29. )
  30. paginator = PostsPaginator(items, 4, 4)
  31. self.assertEqual(
  32. self.get_paginator_items_list(paginator),
  33. [[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10], [10, 11, 12, 13, 14, 15, 16]],
  34. )
  35. paginator = PostsPaginator(items, 5, 3)
  36. self.assertEqual(
  37. self.get_paginator_items_list(paginator),
  38. [[1, 2, 3, 4, 5], [5, 6, 7, 8, 9], [9, 10, 11, 12, 13, 14, 15, 16]],
  39. )
  40. paginator = PostsPaginator(items, 6, 2)
  41. self.assertEqual(
  42. self.get_paginator_items_list(paginator),
  43. [[1, 2, 3, 4, 5, 6], [6, 7, 8, 9, 10, 11], [11, 12, 13, 14, 15, 16]],
  44. )
  45. paginator = PostsPaginator(items, 7, 1)
  46. self.assertEqual(
  47. self.get_paginator_items_list(paginator),
  48. [[1, 2, 3, 4, 5, 6, 7], [7, 8, 9, 10, 11, 12, 13], [13, 14, 15, 16]],
  49. )
  50. paginator = PostsPaginator(items, 7, 3)
  51. self.assertEqual(
  52. self.get_paginator_items_list(paginator),
  53. [[1, 2, 3, 4, 5, 6, 7], [7, 8, 9, 10, 11, 12, 13, 14, 15, 16]],
  54. )
  55. paginator = PostsPaginator(items, 10, 6)
  56. self.assertEqual(self.get_paginator_items_list(paginator), [items])
  57. def test_paginator_overlap(self):
  58. """test for #732 - assert that page contants don't overlap too much"""
  59. num_items = 16
  60. items = [i + 1 for i in range(num_items)]
  61. for per_page, orphans in product(range(num_items), range(num_items)):
  62. paginator = PostsPaginator(items, per_page + 2, orphans)
  63. pages = self.get_paginator_items_list(paginator)
  64. for p, page in enumerate(pages):
  65. for c, compared in enumerate(pages):
  66. if p == c:
  67. continue
  68. common_part = set(page) & set(compared)
  69. self.assertTrue(
  70. len(common_part) < 2,
  71. "invalid page %s: %s"
  72. % (max(p, c) + 1, sorted(list(common_part))),
  73. )
  74. def get_paginator_items_list(self, paginator):
  75. items_list = []
  76. for page in paginator.page_range:
  77. items_list.append(paginator.page(page).object_list)
  78. return items_list