test_utils.py 8.2 KB

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