test_utils.py 8.2 KB

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