test_utils.py 6.2 KB

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