test_utils.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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 (clean_return_path, is_request_to_misago,
  7. slugify, time_amount, is_referer_local,
  8. date_format, format_plaintext_for_html)
  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. PLAINTEXT_FORMAT_CASES = (
  50. (
  51. u'Lorem ipsum.',
  52. u'<p>Lorem ipsum.</p>'
  53. ),
  54. (
  55. u'Lorem <b>ipsum</b>.',
  56. u'<p>Lorem &lt;b&gt;ipsum&lt;/b&gt;.</p>'
  57. ),
  58. (
  59. u'Lorem "ipsum" dolor met.',
  60. u'<p>Lorem &quot;ipsum&quot; dolor met.</p>'
  61. ),
  62. (
  63. u'Lorem ipsum.\nDolor met.',
  64. u'<p>Lorem ipsum.<br />Dolor met.</p>'
  65. ),
  66. (
  67. u'Lorem ipsum.\n\nDolor met.',
  68. u'<p>Lorem ipsum.</p>\n\n<p>Dolor met.</p>'
  69. ),
  70. (
  71. u'http://misago-project.org/login/',
  72. u'<p><a href="http://misago-project.org/login/">http://misago-project.org/login/</a></p>'
  73. ),
  74. )
  75. class FormatPlaintextForHtmlTests(TestCase):
  76. def test_format_plaintext_for_html(self):
  77. """format_plaintext_for_html correctly formats plaintext for html"""
  78. for plaintext, html in PLAINTEXT_FORMAT_CASES:
  79. output = format_plaintext_for_html(plaintext)
  80. assertion_message = """
  81. format_plaintext_for_html failed to produce expected output:
  82. expected: %s
  83. return: %s
  84. """ % (html, output)
  85. self.assertEqual(output, html, assertion_message)
  86. class MockRequest(object):
  87. scheme = 'http'
  88. def __init__(self, method, meta=None, post=None):
  89. self.method = method
  90. self.META = meta or {}
  91. self.POST = post or {}
  92. class CleanReturnPathTests(TestCase):
  93. def test_get_request(self):
  94. """clean_return_path works for GET requests"""
  95. bad_request = MockRequest('GET', {
  96. 'HTTP_REFERER': 'http://cookies.com',
  97. 'HTTP_HOST': 'misago-project.org'
  98. })
  99. self.assertIsNone(clean_return_path(bad_request))
  100. bad_request = MockRequest('GET', {
  101. 'HTTP_REFERER': 'https://misago-project.org/',
  102. 'HTTP_HOST': 'misago-project.org/'
  103. })
  104. self.assertIsNone(clean_return_path(bad_request))
  105. bad_request = MockRequest('GET', {
  106. 'HTTP_REFERER': 'https://misago-project.org/',
  107. 'HTTP_HOST': 'misago-project.org/assadsa/'
  108. })
  109. self.assertIsNone(clean_return_path(bad_request))
  110. ok_request = MockRequest('GET', {
  111. 'HTTP_REFERER': 'http://misago-project.org/',
  112. 'HTTP_HOST': 'misago-project.org/'
  113. })
  114. self.assertEqual(clean_return_path(ok_request), '/')
  115. ok_request = MockRequest('GET', {
  116. 'HTTP_REFERER': 'http://misago-project.org/register/',
  117. 'HTTP_HOST': 'misago-project.org/'
  118. })
  119. self.assertEqual(clean_return_path(ok_request), '/register/')
  120. def test_post_request(self):
  121. """clean_return_path works for POST requests"""
  122. bad_request = MockRequest('POST', {
  123. 'HTTP_REFERER': 'http://misago-project.org/',
  124. 'HTTP_HOST': 'misago-project.org/'
  125. }, {'return_path': '/sdasdsa/'})
  126. self.assertIsNone(clean_return_path(bad_request))
  127. ok_request = MockRequest('POST', {
  128. 'HTTP_REFERER': 'http://misago-project.org/',
  129. 'HTTP_HOST': 'misago-project.org/'
  130. }, {'return_path': '/register/'})
  131. self.assertEqual(clean_return_path(ok_request), '/register/')
  132. class IsRefererLocalTests(TestCase):
  133. def test_local_referers(self):
  134. """local referers return true"""
  135. ok_request = MockRequest('GET', {
  136. 'HTTP_REFERER': 'http://misago-project.org/',
  137. 'HTTP_HOST': 'misago-project.org/'
  138. })
  139. self.assertTrue(is_referer_local(ok_request))
  140. ok_request = MockRequest('GET', {
  141. 'HTTP_REFERER': 'http://misago-project.org/',
  142. 'HTTP_HOST': 'misago-project.org/'
  143. })
  144. self.assertTrue(is_referer_local(ok_request))
  145. ok_request = MockRequest('GET', {
  146. 'HTTP_REFERER': 'http://misago-project.org/register/',
  147. 'HTTP_HOST': 'misago-project.org/'
  148. })
  149. self.assertTrue(is_referer_local(ok_request))
  150. def test_foreign_referers(self):
  151. """non-local referers return false"""
  152. bad_request = MockRequest('GET', {
  153. 'HTTP_REFERER': 'http://else-project.org/',
  154. 'HTTP_HOST': 'misago-project.org/'
  155. })
  156. self.assertFalse(is_referer_local(bad_request))
  157. bad_request = MockRequest('GET', {
  158. 'HTTP_REFERER': 'https://misago-project.org/',
  159. 'HTTP_HOST': 'misago-project.org/'
  160. })
  161. self.assertFalse(is_referer_local(bad_request))
  162. bad_request = MockRequest('GET', {
  163. 'HTTP_REFERER': 'http://misago-project.org/',
  164. 'HTTP_HOST': 'misago-project.org/assadsa/'
  165. })
  166. self.assertFalse(is_referer_local(bad_request))
  167. class TimeAmountTests(TestCase):
  168. def test_single_units(self):
  169. """time_amount return correct amount of time for 1 precision"""
  170. self.assertEqual(time_amount(1), "1 second")
  171. self.assertEqual(time_amount(5), "5 seconds")
  172. self.assertEqual(time_amount(35), "35 seconds")
  173. self.assertEqual(time_amount(60), "1 minute")
  174. self.assertEqual(time_amount(120), "2 minutes")
  175. self.assertEqual(time_amount(240), "4 minutes")
  176. self.assertEqual(time_amount(3600), "1 hour")
  177. self.assertEqual(time_amount(7200), "2 hours")
  178. self.assertEqual(time_amount(24 * 3600), "1 day")
  179. self.assertEqual(time_amount(5 * 24 * 3600), "5 days")
  180. def test_double_units(self):
  181. """time_amount return correct amount of time for double precision"""
  182. self.assertEqual(time_amount(61), "1 minute and 1 second")
  183. self.assertEqual(time_amount(90), "1 minute and 30 seconds")
  184. self.assertEqual(time_amount(121), "2 minutes and 1 second")
  185. self.assertEqual(time_amount(150), "2 minutes and 30 seconds")
  186. self.assertEqual(time_amount(3660), "1 hour and 1 minute")
  187. self.assertEqual(time_amount(3720), "1 hour and 2 minutes")
  188. self.assertEqual(time_amount(24 * 3600 + 1), "1 day and 1 second")
  189. self.assertEqual(time_amount(2 * 24 * 3600 + 1), "2 days and 1 second")
  190. self.assertEqual(time_amount(2 * 24 * 3600 + 5),
  191. "2 days and 5 seconds")
  192. self.assertEqual(time_amount(2 * 24 * 3600 + 3 * 3600),
  193. "2 days and 3 hours")
  194. def test_triple_units(self):
  195. """time_amount return correct amount of time for triple precision"""
  196. self.assertEqual(time_amount(3661), "1 hour, 1 minute and 1 second")
  197. self.assertEqual(time_amount(2 * 3661),
  198. "2 hours, 2 minutes and 2 seconds")
  199. class DateFormatTests(TestCase):
  200. def test_format_datetime(self):
  201. """no crash on datetime format"""
  202. date_format(timezone.now())
  203. date_format(timezone.now(), "H:i")
  204. def test_format_date(self):
  205. """no crash on date format"""
  206. date_format(timezone.now().date())
  207. date_format(timezone.now().date(), 'm.Y')