test_utils.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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, resolve_slugify, 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_resolve_invalid_module(self):
  34. """resolve_slugify raises import error for invalid module"""
  35. with self.assertRaises(ImportError):
  36. resolve_slugify('some.invalid.path')
  37. try:
  38. resolve_slugify('some.invalid.path')
  39. except ImportError as e:
  40. error_message = six.text_type(e)
  41. self.assertEqual(error_message, 'module some.invalid does not exist')
  42. def test_resolve_nonexistant_name(self):
  43. """resolve_slugify raises import error for invalid name"""
  44. with self.assertRaises(ImportError):
  45. resolve_slugify('misago.threads.invalidname')
  46. try:
  47. resolve_slugify('misago.threads.invalidname')
  48. except ImportError as e:
  49. error_message = six.text_type(e)
  50. self.assertEqual(error_message, 'name invalidname not found in misago.threads module')
  51. def test_resolve_valid_name(self):
  52. """resolve_slugify resolves valid paths"""
  53. resolved_slugify = resolve_slugify('misago.core.slugify.default')
  54. self.assertEqual(resolved_slugify, slugify)
  55. def test_valid_slugify_output(self):
  56. """Misago's slugify correctly slugifies string"""
  57. test_cases = [
  58. ('Bob', 'bob'),
  59. ('Eric The Fish', 'eric-the-fish'),
  60. ('John Snow', 'john-snow'),
  61. ('J0n', 'j0n'),
  62. ('An###ne', 'anne'),
  63. ('S**t', 'st'),
  64. ('Łók', 'lok'),
  65. ]
  66. for original, slug in test_cases:
  67. self.assertEqual(slugify(original), slug)
  68. class ParseIso8601StringTests(TestCase):
  69. def test_valid_input(self):
  70. """util parses iso 8601 strings"""
  71. INPUTS = [
  72. '2016-10-22T20:55:39.185085Z',
  73. '2016-10-22T20:55:39.185085-01:00',
  74. '2016-10-22T20:55:39-01:00',
  75. '2016-10-22T20:55:39.185085+01:00',
  76. ]
  77. for test_input in INPUTS:
  78. self.assertTrue(parse_iso8601_string(test_input))
  79. def test_invalid_input(self):
  80. """util throws ValueError on invalid input"""
  81. INPUTS = [
  82. '',
  83. '2016-10-22',
  84. '2016-10-22T30:55:39.185085+11:00',
  85. '2016-10-22T20:55:39.18SSSSS5085Z',
  86. ]
  87. for test_input in INPUTS:
  88. with self.assertRaises(ValueError):
  89. self.assertTrue(parse_iso8601_string(test_input))
  90. PLAINTEXT_FORMAT_CASES = [
  91. ('Lorem ipsum.', '<p>Lorem ipsum.</p>'),
  92. ('Lorem <b>ipsum</b>.', '<p>Lorem &lt;b&gt;ipsum&lt;/b&gt;.</p>'),
  93. ('Lorem "ipsum" dolor met.', '<p>Lorem &quot;ipsum&quot; dolor met.</p>'),
  94. ('Lorem ipsum.\nDolor met.', '<p>Lorem ipsum.<br />Dolor met.</p>'),
  95. ('Lorem ipsum.\n\nDolor met.', '<p>Lorem ipsum.</p>\n\n<p>Dolor met.</p>'),
  96. (
  97. 'http://misago-project.org/login/',
  98. '<p><a href="http://misago-project.org/login/">http://misago-project.org/login/</a></p>'
  99. ),
  100. ]
  101. class FormatPlaintextForHtmlTests(TestCase):
  102. def test_format_plaintext_for_html(self):
  103. """format_plaintext_for_html correctly formats plaintext for html"""
  104. for plaintext, html in PLAINTEXT_FORMAT_CASES:
  105. output = format_plaintext_for_html(plaintext)
  106. assertion_message = """
  107. format_plaintext_for_html failed to produce expected output:
  108. expected: %s
  109. return: %s
  110. """ % (html, output)
  111. self.assertEqual(output, html, assertion_message)
  112. class MockRequest(object):
  113. scheme = 'http'
  114. def __init__(self, method, meta=None, post=None):
  115. self.method = method
  116. self.META = meta or {}
  117. self.POST = post or {}
  118. class CleanReturnPathTests(TestCase):
  119. def test_get_request(self):
  120. """clean_return_path works for GET requests"""
  121. bad_request = MockRequest(
  122. 'GET', {
  123. 'HTTP_REFERER': 'http://cookies.com',
  124. 'HTTP_HOST': 'misago-project.org',
  125. }
  126. )
  127. self.assertIsNone(clean_return_path(bad_request))
  128. bad_request = MockRequest(
  129. 'GET', {
  130. 'HTTP_REFERER': 'https://misago-project.org/',
  131. 'HTTP_HOST': 'misago-project.org/',
  132. }
  133. )
  134. self.assertIsNone(clean_return_path(bad_request))
  135. bad_request = MockRequest(
  136. 'GET', {
  137. 'HTTP_REFERER': 'https://misago-project.org/',
  138. 'HTTP_HOST': 'misago-project.org/assadsa/',
  139. }
  140. )
  141. self.assertIsNone(clean_return_path(bad_request))
  142. ok_request = MockRequest(
  143. 'GET', {
  144. 'HTTP_REFERER': 'http://misago-project.org/',
  145. 'HTTP_HOST': 'misago-project.org/',
  146. }
  147. )
  148. self.assertEqual(clean_return_path(ok_request), '/')
  149. ok_request = MockRequest(
  150. 'GET', {
  151. 'HTTP_REFERER': 'http://misago-project.org/login/',
  152. 'HTTP_HOST': 'misago-project.org/',
  153. }
  154. )
  155. self.assertEqual(clean_return_path(ok_request), '/login/')
  156. def test_post_request(self):
  157. """clean_return_path works for POST requests"""
  158. bad_request = MockRequest(
  159. 'POST', {
  160. 'HTTP_REFERER': 'http://misago-project.org/',
  161. 'HTTP_HOST': 'misago-project.org/',
  162. }, {
  163. 'return_path': '/sdasdsa/',
  164. }
  165. )
  166. self.assertIsNone(clean_return_path(bad_request))
  167. ok_request = MockRequest(
  168. 'POST', {
  169. 'HTTP_REFERER': 'http://misago-project.org/',
  170. 'HTTP_HOST': 'misago-project.org/',
  171. }, {
  172. 'return_path': '/login/',
  173. }
  174. )
  175. self.assertEqual(clean_return_path(ok_request), '/login/')
  176. class IsRefererLocalTests(TestCase):
  177. def test_local_referers(self):
  178. """local referers return true"""
  179. ok_request = MockRequest(
  180. 'GET', {
  181. 'HTTP_REFERER': 'http://misago-project.org/',
  182. 'HTTP_HOST': 'misago-project.org/',
  183. }
  184. )
  185. self.assertTrue(is_referer_local(ok_request))
  186. ok_request = MockRequest(
  187. 'GET', {
  188. 'HTTP_REFERER': 'http://misago-project.org/',
  189. 'HTTP_HOST': 'misago-project.org/',
  190. }
  191. )
  192. self.assertTrue(is_referer_local(ok_request))
  193. ok_request = MockRequest(
  194. 'GET', {
  195. 'HTTP_REFERER': 'http://misago-project.org/login/',
  196. 'HTTP_HOST': 'misago-project.org/',
  197. }
  198. )
  199. self.assertTrue(is_referer_local(ok_request))
  200. def test_foreign_referers(self):
  201. """non-local referers return false"""
  202. bad_request = MockRequest(
  203. 'GET', {
  204. 'HTTP_REFERER': 'http://else-project.org/',
  205. 'HTTP_HOST': 'misago-project.org/',
  206. }
  207. )
  208. self.assertFalse(is_referer_local(bad_request))
  209. bad_request = MockRequest(
  210. 'GET', {
  211. 'HTTP_REFERER': 'https://misago-project.org/',
  212. 'HTTP_HOST': 'misago-project.org/',
  213. }
  214. )
  215. self.assertFalse(is_referer_local(bad_request))
  216. bad_request = MockRequest(
  217. 'GET', {
  218. 'HTTP_REFERER': 'http://misago-project.org/',
  219. 'HTTP_HOST': 'misago-project.org/assadsa/',
  220. }
  221. )
  222. self.assertFalse(is_referer_local(bad_request))