/tests/modeltests/pagination/tests.py

https://code.google.com/p/mango-py/ · Python · 132 lines · 104 code · 19 blank · 9 comment · 2 complexity · 6a1f9949759de680f2c3c7a314d937f1 MD5 · raw file

  1. from datetime import datetime
  2. from operator import attrgetter
  3. from django.core.paginator import Paginator, InvalidPage, EmptyPage
  4. from django.test import TestCase
  5. from models import Article
  6. class CountContainer(object):
  7. def count(self):
  8. return 42
  9. class LenContainer(object):
  10. def __len__(self):
  11. return 42
  12. class PaginationTests(TestCase):
  13. def setUp(self):
  14. # Prepare a list of objects for pagination.
  15. for x in range(1, 10):
  16. a = Article(headline='Article %s' % x, pub_date=datetime(2005, 7, 29))
  17. a.save()
  18. def test_paginator(self):
  19. paginator = Paginator(Article.objects.all(), 5)
  20. self.assertEqual(9, paginator.count)
  21. self.assertEqual(2, paginator.num_pages)
  22. self.assertEqual([1, 2], paginator.page_range)
  23. def test_first_page(self):
  24. paginator = Paginator(Article.objects.all(), 5)
  25. p = paginator.page(1)
  26. self.assertEqual(u"<Page 1 of 2>", unicode(p))
  27. self.assertQuerysetEqual(p.object_list, [
  28. "<Article: Article 1>",
  29. "<Article: Article 2>",
  30. "<Article: Article 3>",
  31. "<Article: Article 4>",
  32. "<Article: Article 5>"
  33. ]
  34. )
  35. self.assertTrue(p.has_next())
  36. self.assertFalse(p.has_previous())
  37. self.assertTrue(p.has_other_pages())
  38. self.assertEqual(2, p.next_page_number())
  39. self.assertEqual(0, p.previous_page_number())
  40. self.assertEqual(1, p.start_index())
  41. self.assertEqual(5, p.end_index())
  42. def test_last_page(self):
  43. paginator = Paginator(Article.objects.all(), 5)
  44. p = paginator.page(2)
  45. self.assertEqual(u"<Page 2 of 2>", unicode(p))
  46. self.assertQuerysetEqual(p.object_list, [
  47. "<Article: Article 6>",
  48. "<Article: Article 7>",
  49. "<Article: Article 8>",
  50. "<Article: Article 9>"
  51. ]
  52. )
  53. self.assertFalse(p.has_next())
  54. self.assertTrue(p.has_previous())
  55. self.assertTrue(p.has_other_pages())
  56. self.assertEqual(3, p.next_page_number())
  57. self.assertEqual(1, p.previous_page_number())
  58. self.assertEqual(6, p.start_index())
  59. self.assertEqual(9, p.end_index())
  60. def test_empty_page(self):
  61. paginator = Paginator(Article.objects.all(), 5)
  62. self.assertRaises(EmptyPage, paginator.page, 0)
  63. self.assertRaises(EmptyPage, paginator.page, 3)
  64. # Empty paginators with allow_empty_first_page=True.
  65. paginator = Paginator(Article.objects.filter(id=0), 5, allow_empty_first_page=True)
  66. self.assertEqual(0, paginator.count)
  67. self.assertEqual(1, paginator.num_pages)
  68. self.assertEqual([1], paginator.page_range)
  69. # Empty paginators with allow_empty_first_page=False.
  70. paginator = Paginator(Article.objects.filter(id=0), 5, allow_empty_first_page=False)
  71. self.assertEqual(0, paginator.count)
  72. self.assertEqual(0, paginator.num_pages)
  73. self.assertEqual([], paginator.page_range)
  74. def test_invalid_page(self):
  75. paginator = Paginator(Article.objects.all(), 5)
  76. self.assertRaises(InvalidPage, paginator.page, 7)
  77. def test_orphans(self):
  78. # Add a few more records to test out the orphans feature.
  79. for x in range(10, 13):
  80. Article(headline="Article %s" % x, pub_date=datetime(2006, 10, 6)).save()
  81. # With orphans set to 3 and 10 items per page, we should get all 12 items on a single page.
  82. paginator = Paginator(Article.objects.all(), 10, orphans=3)
  83. self.assertEqual(1, paginator.num_pages)
  84. # With orphans only set to 1, we should get two pages.
  85. paginator = Paginator(Article.objects.all(), 10, orphans=1)
  86. self.assertEqual(2, paginator.num_pages)
  87. def test_paginate_list(self):
  88. # Paginators work with regular lists/tuples, too -- not just with QuerySets.
  89. paginator = Paginator([1, 2, 3, 4, 5, 6, 7, 8, 9], 5)
  90. self.assertEqual(9, paginator.count)
  91. self.assertEqual(2, paginator.num_pages)
  92. self.assertEqual([1, 2], paginator.page_range)
  93. p = paginator.page(1)
  94. self.assertEqual(u"<Page 1 of 2>", unicode(p))
  95. self.assertEqual([1, 2, 3, 4, 5], p.object_list)
  96. self.assertTrue(p.has_next())
  97. self.assertFalse(p.has_previous())
  98. self.assertTrue(p.has_other_pages())
  99. self.assertEqual(2, p.next_page_number())
  100. self.assertEqual(0, p.previous_page_number())
  101. self.assertEqual(1, p.start_index())
  102. self.assertEqual(5, p.end_index())
  103. def test_paginate_misc_classes(self):
  104. # Paginator can be passed other objects with a count() method.
  105. paginator = Paginator(CountContainer(), 10)
  106. self.assertEqual(42, paginator.count)
  107. self.assertEqual(5, paginator.num_pages)
  108. self.assertEqual([1, 2, 3, 4, 5], paginator.page_range)
  109. # Paginator can be passed other objects that implement __len__.
  110. paginator = Paginator(LenContainer(), 10)
  111. self.assertEqual(42, paginator.count)
  112. self.assertEqual(5, paginator.num_pages)
  113. self.assertEqual([1, 2, 3, 4, 5], paginator.page_range)