PageRenderTime 43ms CodeModel.GetById 10ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/utils_tests/test_encoding.py

https://gitlab.com/asmjahid/django
Python | 151 lines | 107 code | 28 blank | 16 comment | 10 complexity | f6239df8cf0375b6e66188ada64489c1 MD5 | raw file
  1. # -*- encoding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import datetime
  4. import unittest
  5. from django.utils import six
  6. from django.utils.encoding import (
  7. escape_uri_path, filepath_to_uri, force_bytes, force_text, iri_to_uri,
  8. smart_text, uri_to_iri,
  9. )
  10. from django.utils.functional import SimpleLazyObject
  11. from django.utils.http import urlquote_plus
  12. class TestEncodingUtils(unittest.TestCase):
  13. def test_force_text_exception(self):
  14. """
  15. Check that broken __unicode__/__str__ actually raises an error.
  16. """
  17. class MyString(object):
  18. def __str__(self):
  19. return b'\xc3\xb6\xc3\xa4\xc3\xbc'
  20. __unicode__ = __str__
  21. # str(s) raises a TypeError on python 3 if the result is not a text type.
  22. # python 2 fails when it tries converting from str to unicode (via ASCII).
  23. exception = TypeError if six.PY3 else UnicodeError
  24. with self.assertRaises(exception):
  25. force_text(MyString())
  26. def test_force_text_lazy(self):
  27. s = SimpleLazyObject(lambda: 'x')
  28. self.assertTrue(issubclass(type(force_text(s)), six.text_type))
  29. def test_force_bytes_exception(self):
  30. """
  31. Test that force_bytes knows how to convert to bytes an exception
  32. containing non-ASCII characters in its args.
  33. """
  34. error_msg = "This is an exception, voilà"
  35. exc = ValueError(error_msg)
  36. result = force_bytes(exc)
  37. self.assertEqual(result, error_msg.encode('utf-8'))
  38. def test_force_bytes_strings_only(self):
  39. today = datetime.date.today()
  40. self.assertEqual(force_bytes(today, strings_only=True), today)
  41. def test_smart_text(self):
  42. class Test:
  43. if six.PY3:
  44. def __str__(self):
  45. return 'ŠĐĆŽćžšđ'
  46. else:
  47. def __str__(self):
  48. return 'ŠĐĆŽćžšđ'.encode('utf-8')
  49. class TestU:
  50. if six.PY3:
  51. def __str__(self):
  52. return 'ŠĐĆŽćžšđ'
  53. def __bytes__(self):
  54. return b'Foo'
  55. else:
  56. def __str__(self):
  57. return b'Foo'
  58. def __unicode__(self):
  59. return '\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111'
  60. self.assertEqual(smart_text(Test()), '\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111')
  61. self.assertEqual(smart_text(TestU()), '\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111')
  62. self.assertEqual(smart_text(1), '1')
  63. self.assertEqual(smart_text('foo'), 'foo')
  64. class TestRFC3987IEncodingUtils(unittest.TestCase):
  65. def test_filepath_to_uri(self):
  66. self.assertEqual(filepath_to_uri('upload\\чубака.mp4'), 'upload/%D1%87%D1%83%D0%B1%D0%B0%D0%BA%D0%B0.mp4')
  67. self.assertEqual(
  68. filepath_to_uri('upload\\чубака.mp4'.encode('utf-8')),
  69. 'upload/%D1%87%D1%83%D0%B1%D0%B0%D0%BA%D0%B0.mp4'
  70. )
  71. def test_iri_to_uri(self):
  72. cases = [
  73. # Valid UTF-8 sequences are encoded.
  74. ('red%09rosé#red', 'red%09ros%C3%A9#red'),
  75. ('/blog/for/Jürgen Münster/', '/blog/for/J%C3%BCrgen%20M%C3%BCnster/'),
  76. ('locations/%s' % urlquote_plus('Paris & Orléans'), 'locations/Paris+%26+Orl%C3%A9ans'),
  77. # Reserved chars remain unescaped.
  78. ('%&', '%&'),
  79. ('red&♥ros%#red', 'red&%E2%99%A5ros%#red'),
  80. ]
  81. for iri, uri in cases:
  82. self.assertEqual(iri_to_uri(iri), uri)
  83. # Test idempotency.
  84. self.assertEqual(iri_to_uri(iri_to_uri(iri)), uri)
  85. def test_uri_to_iri(self):
  86. cases = [
  87. # Valid UTF-8 sequences are decoded.
  88. ('/%E2%99%A5%E2%99%A5/', '/♥♥/'),
  89. ('/%E2%99%A5%E2%99%A5/?utf8=%E2%9C%93', '/♥♥/?utf8=✓'),
  90. # Broken UTF-8 sequences remain escaped.
  91. ('/%AAd%AAj%AAa%AAn%AAg%AAo%AA/', '/%AAd%AAj%AAa%AAn%AAg%AAo%AA/'),
  92. ('/%E2%99%A5%E2%E2%99%A5/', '/♥%E2♥/'),
  93. ('/%E2%99%A5%E2%99%E2%99%A5/', '/♥%E2%99♥/'),
  94. ('/%E2%E2%99%A5%E2%99%A5%99/', '/%E2♥♥%99/'),
  95. ('/%E2%99%A5%E2%99%A5/?utf8=%9C%93%E2%9C%93%9C%93', '/♥♥/?utf8=%9C%93✓%9C%93'),
  96. ]
  97. for uri, iri in cases:
  98. self.assertEqual(uri_to_iri(uri), iri)
  99. # Test idempotency.
  100. self.assertEqual(uri_to_iri(uri_to_iri(uri)), iri)
  101. def test_complementarity(self):
  102. cases = [
  103. ('/blog/for/J%C3%BCrgen%20M%C3%BCnster/', '/blog/for/J\xfcrgen M\xfcnster/'),
  104. ('%&', '%&'),
  105. ('red&%E2%99%A5ros%#red', 'red&♥ros%#red'),
  106. ('/%E2%99%A5%E2%99%A5/', '/♥♥/'),
  107. ('/%E2%99%A5%E2%99%A5/?utf8=%E2%9C%93', '/♥♥/?utf8=✓'),
  108. ('/%AAd%AAj%AAa%AAn%AAg%AAo%AA/', '/%AAd%AAj%AAa%AAn%AAg%AAo%AA/'),
  109. ('/%E2%99%A5%E2%E2%99%A5/', '/♥%E2♥/'),
  110. ('/%E2%99%A5%E2%99%E2%99%A5/', '/♥%E2%99♥/'),
  111. ('/%E2%E2%99%A5%E2%99%A5%99/', '/%E2♥♥%99/'),
  112. ('/%E2%99%A5%E2%99%A5/?utf8=%9C%93%E2%9C%93%9C%93', '/♥♥/?utf8=%9C%93✓%9C%93'),
  113. ]
  114. for uri, iri in cases:
  115. self.assertEqual(iri_to_uri(uri_to_iri(uri)), uri)
  116. self.assertEqual(uri_to_iri(iri_to_uri(iri)), iri)
  117. def test_escape_uri_path(self):
  118. self.assertEqual(
  119. escape_uri_path('/;some/=awful/?path/:with/@lots/&of/+awful/chars'),
  120. '/%3Bsome/%3Dawful/%3Fpath/:with/@lots/&of/+awful/chars'
  121. )
  122. self.assertEqual(escape_uri_path('/foo#bar'), '/foo%23bar')
  123. self.assertEqual(escape_uri_path('/foo?bar'), '/foo%3Fbar')