2012-09-04 15:24:39 +08:00
|
|
|
# -*- encoding: utf-8 -*-
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
2013-07-01 20:22:27 +08:00
|
|
|
import unittest
|
2013-09-06 23:28:28 +08:00
|
|
|
import datetime
|
2013-07-01 20:22:27 +08:00
|
|
|
|
2013-09-07 01:16:06 +08:00
|
|
|
from django.utils import six
|
2014-09-23 20:45:59 +08:00
|
|
|
from django.utils.encoding import (filepath_to_uri, force_bytes,
|
|
|
|
force_text, iri_to_uri, python_2_unicode_compatible)
|
|
|
|
from django.utils.http import urlquote_plus
|
2012-09-04 15:24:39 +08:00
|
|
|
|
|
|
|
|
|
|
|
class TestEncodingUtils(unittest.TestCase):
|
2013-09-07 01:16:06 +08:00
|
|
|
def test_force_text_exception(self):
|
|
|
|
"""
|
|
|
|
Check that broken __unicode__/__str__ actually raises an error.
|
|
|
|
"""
|
|
|
|
class MyString(object):
|
|
|
|
def __str__(self):
|
|
|
|
return b'\xc3\xb6\xc3\xa4\xc3\xbc'
|
|
|
|
|
|
|
|
__unicode__ = __str__
|
|
|
|
|
|
|
|
# str(s) raises a TypeError on python 3 if the result is not a text type.
|
|
|
|
# python 2 fails when it tries converting from str to unicode (via ASCII).
|
|
|
|
exception = TypeError if six.PY3 else UnicodeError
|
|
|
|
self.assertRaises(exception, force_text, MyString())
|
2013-09-06 23:28:28 +08:00
|
|
|
|
2012-09-04 15:24:39 +08:00
|
|
|
def test_force_bytes_exception(self):
|
|
|
|
"""
|
|
|
|
Test that force_bytes knows how to convert to bytes an exception
|
|
|
|
containing non-ASCII characters in its args.
|
|
|
|
"""
|
|
|
|
error_msg = "This is an exception, voilà"
|
|
|
|
exc = ValueError(error_msg)
|
|
|
|
result = force_bytes(exc)
|
|
|
|
self.assertEqual(result, error_msg.encode('utf-8'))
|
2013-03-23 00:55:12 +08:00
|
|
|
|
2013-09-06 23:28:28 +08:00
|
|
|
def test_force_bytes_strings_only(self):
|
|
|
|
today = datetime.date.today()
|
|
|
|
self.assertEqual(force_bytes(today, strings_only=True), today)
|
|
|
|
|
2013-03-23 00:55:12 +08:00
|
|
|
def test_filepath_to_uri(self):
|
|
|
|
self.assertEqual(filepath_to_uri('upload\\чубака.mp4'),
|
|
|
|
'upload/%D1%87%D1%83%D0%B1%D0%B0%D0%BA%D0%B0.mp4')
|
|
|
|
self.assertEqual(filepath_to_uri('upload\\чубака.mp4'.encode('utf-8')),
|
|
|
|
'upload/%D1%87%D1%83%D0%B1%D0%B0%D0%BA%D0%B0.mp4')
|
2013-10-14 00:06:58 +08:00
|
|
|
|
2014-09-23 20:45:59 +08:00
|
|
|
def test_iri_to_uri(self):
|
|
|
|
self.assertEqual(iri_to_uri('red%09ros\xe9#red'),
|
|
|
|
'red%09ros%C3%A9#red')
|
|
|
|
|
|
|
|
self.assertEqual(iri_to_uri('/blog/for/J\xfcrgen M\xfcnster/'),
|
|
|
|
'/blog/for/J%C3%BCrgen%20M%C3%BCnster/')
|
|
|
|
|
|
|
|
self.assertEqual(iri_to_uri('locations/%s' % urlquote_plus('Paris & Orl\xe9ans')),
|
|
|
|
'locations/Paris+%26+Orl%C3%A9ans')
|
|
|
|
|
|
|
|
def test_iri_to_uri_idempotent(self):
|
|
|
|
self.assertEqual(iri_to_uri(iri_to_uri('red%09ros\xe9#red')),
|
|
|
|
'red%09ros%C3%A9#red')
|
|
|
|
|
2013-10-14 00:06:58 +08:00
|
|
|
@unittest.skipIf(six.PY3, "tests a class not defining __str__ under Python 2")
|
|
|
|
def test_decorated_class_without_str(self):
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
@python_2_unicode_compatible
|
|
|
|
class NoStr(object):
|
|
|
|
pass
|