test_utils.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #-*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.test import TestCase
  4. from django.test.client import RequestFactory
  5. from django.urls import reverse
  6. from django.utils import six
  7. from misago.core.utils import (
  8. clean_return_path, format_plaintext_for_html, is_referer_local, is_request_to_misago,
  9. parse_iso8601_string, slugify)
  10. VALID_PATHS = ("/", "/threads/", )
  11. INVALID_PATHS = ("", "somewhere/", )
  12. class IsRequestToMisagoTests(TestCase):
  13. def test_is_request_to_misago(self):
  14. """
  15. is_request_to_misago correctly detects requests directed at Misago
  16. """
  17. misago_prefix = reverse('misago:index')
  18. for path in VALID_PATHS:
  19. request = RequestFactory().get('/')
  20. request.path_info = path
  21. self.assertTrue(
  22. is_request_to_misago(request),
  23. '"%s" is not overlapped by "%s"' % (path, misago_prefix)
  24. )
  25. for path in INVALID_PATHS:
  26. request = RequestFactory().get('/')
  27. request.path_info = path
  28. self.assertFalse(
  29. is_request_to_misago(request),
  30. '"%s" is overlapped by "%s"' % (path, misago_prefix)
  31. )
  32. class SlugifyTests(TestCase):
  33. def test_valid_slugify_output(self):
  34. """Misago's slugify correctly slugifies string"""
  35. test_cases = [
  36. ('Bob', 'bob'),
  37. ('Eric The Fish', 'eric-the-fish'),
  38. ('John Snow', 'john-snow'),
  39. ('J0n', 'j0n'),
  40. ('An###ne', 'anne'),
  41. ('S**t', 'st'),
  42. ('Łók', 'lok'),
  43. ]
  44. for original, slug in test_cases:
  45. self.assertEqual(slugify(original), slug)
  46. class ParseIso8601StringTests(TestCase):
  47. def test_valid_input(self):
  48. """util parses iso 8601 strings"""
  49. INPUTS = [
  50. '2016-10-22T20:55:39.185085Z',
  51. '2016-10-22T20:55:39.185085-01:00',
  52. '2016-10-22T20:55:39-01:00',
  53. '2016-10-22T20:55:39.185085+01:00',
  54. ]
  55. for test_input in INPUTS:
  56. self.assertTrue(parse_iso8601_string(test_input))
  57. def test_invalid_input(self):
  58. """util throws ValueError on invalid input"""
  59. INPUTS = [
  60. '',
  61. '2016-10-22',
  62. '2016-10-22T30:55:39.185085+11:00',
  63. '2016-10-22T20:55:39.18SSSSS5085Z',
  64. ]
  65. for test_input in INPUTS:
  66. with self.assertRaises(ValueError):
  67. self.assertTrue(parse_iso8601_string(test_input))
  68. PLAINTEXT_FORMAT_CASES = [
  69. ('Lorem ipsum.', '<p>Lorem ipsum.</p>'),
  70. ('Lorem <b>ipsum</b>.', '<p>Lorem &lt;b&gt;ipsum&lt;/b&gt;.</p>'),
  71. ('Lorem "ipsum" dolor met.', '<p>Lorem &quot;ipsum&quot; dolor met.</p>'),
  72. ('Lorem ipsum.\nDolor met.', '<p>Lorem ipsum.<br />Dolor met.</p>'),
  73. ('Lorem ipsum.\n\nDolor met.', '<p>Lorem ipsum.</p>\n\n<p>Dolor met.</p>'),
  74. (
  75. 'http://misago-project.org/login/',
  76. '<p><a href="http://misago-project.org/login/">http://misago-project.org/login/</a></p>'
  77. ),
  78. ]
  79. class FormatPlaintextForHtmlTests(TestCase):
  80. def test_format_plaintext_for_html(self):
  81. """format_plaintext_for_html correctly formats plaintext for html"""
  82. for plaintext, html in PLAINTEXT_FORMAT_CASES:
  83. output = format_plaintext_for_html(plaintext)
  84. assertion_message = """
  85. format_plaintext_for_html failed to produce expected output:
  86. expected: %s
  87. return: %s
  88. """ % (html, output)
  89. self.assertEqual(output, html, assertion_message)
  90. class MockRequest(object):
  91. scheme = 'http'
  92. def __init__(self, method, meta=None, post=None):
  93. self.method = method
  94. self.META = meta or {}
  95. self.POST = post or {}
  96. class CleanReturnPathTests(TestCase):
  97. def test_get_request(self):
  98. """clean_return_path works for GET requests"""
  99. bad_request = MockRequest(
  100. 'GET', {
  101. 'HTTP_REFERER': 'http://cookies.com',
  102. 'HTTP_HOST': 'misago-project.org',
  103. }
  104. )
  105. self.assertIsNone(clean_return_path(bad_request))
  106. bad_request = MockRequest(
  107. 'GET', {
  108. 'HTTP_REFERER': 'https://misago-project.org/',
  109. 'HTTP_HOST': 'misago-project.org/',
  110. }
  111. )
  112. self.assertIsNone(clean_return_path(bad_request))
  113. bad_request = MockRequest(
  114. 'GET', {
  115. 'HTTP_REFERER': 'https://misago-project.org/',
  116. 'HTTP_HOST': 'misago-project.org/assadsa/',
  117. }
  118. )
  119. self.assertIsNone(clean_return_path(bad_request))
  120. ok_request = MockRequest(
  121. 'GET', {
  122. 'HTTP_REFERER': 'http://misago-project.org/',
  123. 'HTTP_HOST': 'misago-project.org/',
  124. }
  125. )
  126. self.assertEqual(clean_return_path(ok_request), '/')
  127. ok_request = MockRequest(
  128. 'GET', {
  129. 'HTTP_REFERER': 'http://misago-project.org/login/',
  130. 'HTTP_HOST': 'misago-project.org/',
  131. }
  132. )
  133. self.assertEqual(clean_return_path(ok_request), '/login/')
  134. def test_post_request(self):
  135. """clean_return_path works for POST requests"""
  136. bad_request = MockRequest(
  137. 'POST', {
  138. 'HTTP_REFERER': 'http://misago-project.org/',
  139. 'HTTP_HOST': 'misago-project.org/',
  140. }, {
  141. 'return_path': '/sdasdsa/',
  142. }
  143. )
  144. self.assertIsNone(clean_return_path(bad_request))
  145. ok_request = MockRequest(
  146. 'POST', {
  147. 'HTTP_REFERER': 'http://misago-project.org/',
  148. 'HTTP_HOST': 'misago-project.org/',
  149. }, {
  150. 'return_path': '/login/',
  151. }
  152. )
  153. self.assertEqual(clean_return_path(ok_request), '/login/')
  154. class IsRefererLocalTests(TestCase):
  155. def test_local_referers(self):
  156. """local referers return true"""
  157. ok_request = MockRequest(
  158. 'GET', {
  159. 'HTTP_REFERER': 'http://misago-project.org/',
  160. 'HTTP_HOST': 'misago-project.org/',
  161. }
  162. )
  163. self.assertTrue(is_referer_local(ok_request))
  164. ok_request = MockRequest(
  165. 'GET', {
  166. 'HTTP_REFERER': 'http://misago-project.org/',
  167. 'HTTP_HOST': 'misago-project.org/',
  168. }
  169. )
  170. self.assertTrue(is_referer_local(ok_request))
  171. ok_request = MockRequest(
  172. 'GET', {
  173. 'HTTP_REFERER': 'http://misago-project.org/login/',
  174. 'HTTP_HOST': 'misago-project.org/',
  175. }
  176. )
  177. self.assertTrue(is_referer_local(ok_request))
  178. def test_foreign_referers(self):
  179. """non-local referers return false"""
  180. bad_request = MockRequest(
  181. 'GET', {
  182. 'HTTP_REFERER': 'http://else-project.org/',
  183. 'HTTP_HOST': 'misago-project.org/',
  184. }
  185. )
  186. self.assertFalse(is_referer_local(bad_request))
  187. bad_request = MockRequest(
  188. 'GET', {
  189. 'HTTP_REFERER': 'https://misago-project.org/',
  190. 'HTTP_HOST': 'misago-project.org/',
  191. }
  192. )
  193. self.assertFalse(is_referer_local(bad_request))
  194. bad_request = MockRequest(
  195. 'GET', {
  196. 'HTTP_REFERER': 'http://misago-project.org/',
  197. 'HTTP_HOST': 'misago-project.org/assadsa/',
  198. }
  199. )
  200. self.assertFalse(is_referer_local(bad_request))