test_utils.py 7.0 KB

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