test_shortcuts.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. from django.http import Http404
  2. from django.test import TestCase, override_settings
  3. from django.urls import reverse
  4. from misago.core.shortcuts import get_int_or_404
  5. @override_settings(ROOT_URLCONF="misago.core.testproject.urls")
  6. class PaginateTests(TestCase):
  7. def test_valid_page_handling(self):
  8. """Valid page number causes no errors"""
  9. response = self.client.get(reverse("test-pagination", kwargs={"page": 2}))
  10. self.assertEqual("5,6,7,8,9", response.content.decode())
  11. def test_invalid_page_handling(self):
  12. """Invalid page number results in 404 error"""
  13. response = self.client.get(reverse("test-pagination", kwargs={"page": 42}))
  14. self.assertEqual(response.status_code, 404)
  15. def test_implicit_page_handling(self):
  16. """Implicit page number causes no errors"""
  17. response = self.client.get(reverse("test-pagination"))
  18. self.assertEqual("0,1,2,3,4", response.content.decode())
  19. def test_explicit_page_handling(self):
  20. """Explicit page number results in redirect"""
  21. response = self.client.get(reverse("test-pagination", kwargs={"page": 1}))
  22. valid_url = "/forum/test-pagination/"
  23. self.assertEqual(response["Location"], valid_url)
  24. @override_settings(ROOT_URLCONF="misago.core.testproject.urls")
  25. class ValidateSlugTests(TestCase):
  26. def test_valid_slug_handling(self):
  27. """Valid slug causes no interruption in view processing"""
  28. response = self.client.get(
  29. reverse("validate-slug-view", kwargs={"slug": "eric-the-fish", "pk": 1})
  30. )
  31. self.assertContains(response, "Allright")
  32. def test_invalid_slug_handling(self):
  33. """Invalid slug returns in redirect to valid page"""
  34. response = self.client.get(
  35. reverse("validate-slug-view", kwargs={"slug": "lion-the-eric", "pk": 1})
  36. )
  37. valid_url = "/forum/test-valid-slug/eric-the-fish-1/"
  38. self.assertEqual(response["Location"], valid_url)
  39. class GetIntOr404Tests(TestCase):
  40. def test_valid_inputs(self):
  41. """get_int_or_404 returns int for valid values"""
  42. VALID_VALUES = [("0", 0), ("123", 123), ("000123", 123), ("1", 1)]
  43. for value, result in VALID_VALUES:
  44. self.assertEqual(get_int_or_404(value), result)
  45. def test_invalid_inputs(self):
  46. """get_int_or_404 raises Http404 for invalid values"""
  47. INVALID_VALUES = [
  48. None,
  49. "",
  50. "str",
  51. "5tr",
  52. "s0tr",
  53. "str123",
  54. "12.321",
  55. ".4",
  56. "5.",
  57. ]
  58. for value in INVALID_VALUES:
  59. with self.assertRaises(Http404):
  60. get_int_or_404(value)
  61. @override_settings(ROOT_URLCONF="misago.core.testproject.urls")
  62. class PaginatedResponseTests(TestCase):
  63. def test_page_response(self):
  64. """utility returns response for only page arg"""
  65. response = self.client.get(reverse("test-paginated-response"))
  66. self.assertEqual(response.status_code, 200)
  67. self.assertEqual(
  68. response.json(),
  69. {
  70. "results": [i + 10 for i in range(10)],
  71. "page": 2,
  72. "pages": 10,
  73. "count": 100,
  74. "first": 1,
  75. "previous": 1,
  76. "next": 3,
  77. "last": 10,
  78. "before": 10,
  79. "more": 80,
  80. },
  81. )
  82. def test_explicit_data_response(self):
  83. """utility returns response with explicit data"""
  84. response = self.client.get(reverse("test-paginated-response-data"))
  85. self.assertEqual(response.status_code, 200)
  86. self.assertEqual(
  87. response.json(),
  88. {
  89. "results": ["a", "b", "c", "d", "e"],
  90. "page": 2,
  91. "pages": 10,
  92. "count": 100,
  93. "first": 1,
  94. "previous": 1,
  95. "next": 3,
  96. "last": 10,
  97. "before": 10,
  98. "more": 80,
  99. },
  100. )
  101. def test_explicit_serializer_response(self):
  102. """utility returns response with data serialized via serializer"""
  103. response = self.client.get(reverse("test-paginated-response-serializer"))
  104. self.assertEqual(response.status_code, 200)
  105. self.assertEqual(
  106. response.json(),
  107. {
  108. "results": [{"id": 0}, {"id": 2}, {"id": 4}, {"id": 6}],
  109. "page": 1,
  110. "pages": 1,
  111. "count": 4,
  112. "first": None,
  113. "previous": None,
  114. "next": None,
  115. "last": None,
  116. "before": 0,
  117. "more": 0,
  118. },
  119. )
  120. def test_explicit_data_serializer_response(self):
  121. """utility returns response with explicit data serialized via serializer"""
  122. response = self.client.get(reverse("test-paginated-response-data-serializer"))
  123. self.assertEqual(response.status_code, 200)
  124. self.assertEqual(
  125. response.json(),
  126. {
  127. "results": [{"id": "aa"}, {"id": "bb"}, {"id": "cc"}, {"id": "dd"}],
  128. "page": 1,
  129. "pages": 1,
  130. "count": 4,
  131. "first": None,
  132. "previous": None,
  133. "next": None,
  134. "last": None,
  135. "before": 0,
  136. "more": 0,
  137. },
  138. )
  139. def test_explicit_data_extra_response(self):
  140. """utility returns response with explicit data and extra"""
  141. response = self.client.get(reverse("test-paginated-response-data-extra"))
  142. self.assertEqual(response.status_code, 200)
  143. self.assertEqual(
  144. response.json(),
  145. {
  146. "results": ["a", "b", "c", "d"],
  147. "page": 1,
  148. "pages": 1,
  149. "count": 4,
  150. "first": None,
  151. "previous": None,
  152. "next": "EXTRA",
  153. "last": None,
  154. "before": 0,
  155. "more": 0,
  156. "lorem": "ipsum",
  157. },
  158. )