test_utils.py 7.0 KB

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