test_paginator.py 3.4 KB

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