test_paginator.py 3.5 KB

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