test_utils.py 7.0 KB

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