test_paginator.py 3.3 KB

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