diff options
| author | Anubhav Joshi <anubhav9042@gmail.com> | 2014-07-22 17:55:22 +0530 |
|---|---|---|
| committer | Loic Bistuer <loic.bistuer@gmail.com> | 2014-10-16 02:31:17 +0700 |
| commit | 10b17a22bec2eaf44c3315614aea87c127caee46 (patch) | |
| tree | 39145c16ca06aa33050e1642076db4216d663a10 /tests/utils_tests/test_encoding.py | |
| parent | 3af5af1a61d73c533aca4fb0ea1f53e4f6300b17 (diff) | |
Fixed #19508 -- Implemented uri_to_iri as per RFC.
Thanks Loic Bistuer for helping in shaping the patch and Claude Paroz
for the review.
Diffstat (limited to 'tests/utils_tests/test_encoding.py')
| -rw-r--r-- | tests/utils_tests/test_encoding.py | 72 |
1 files changed, 55 insertions, 17 deletions
diff --git a/tests/utils_tests/test_encoding.py b/tests/utils_tests/test_encoding.py index 526fb709ce..1685c82def 100644 --- a/tests/utils_tests/test_encoding.py +++ b/tests/utils_tests/test_encoding.py @@ -5,8 +5,8 @@ import unittest import datetime from django.utils import six -from django.utils.encoding import (filepath_to_uri, force_bytes, - force_text, iri_to_uri, python_2_unicode_compatible) +from django.utils.encoding import (filepath_to_uri, force_bytes, force_text, + iri_to_uri, uri_to_iri) from django.utils.http import urlquote_plus @@ -40,6 +40,9 @@ class TestEncodingUtils(unittest.TestCase): today = datetime.date.today() self.assertEqual(force_bytes(today, strings_only=True), today) + +class TestRFC3987IEncodingUtils(unittest.TestCase): + 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') @@ -47,22 +50,57 @@ class TestEncodingUtils(unittest.TestCase): 'upload/%D1%87%D1%83%D0%B1%D0%B0%D0%BA%D0%B0.mp4') def test_iri_to_uri(self): - self.assertEqual(iri_to_uri('red%09ros\xe9#red'), - 'red%09ros%C3%A9#red') + cases = [ + # Valid UTF-8 sequences are encoded. + ('red%09rosé#red', 'red%09ros%C3%A9#red'), + ('/blog/for/Jürgen Münster/', '/blog/for/J%C3%BCrgen%20M%C3%BCnster/'), + ('locations/%s' % urlquote_plus('Paris & Orléans'), 'locations/Paris+%26+Orl%C3%A9ans'), + + # Reserved chars remain unescaped. + ('%&', '%&'), + ('red&♥ros%#red', 'red&%E2%99%A5ros%#red'), + ] + + for iri, uri in cases: + self.assertEqual(iri_to_uri(iri), uri) + + # Test idempotency. + self.assertEqual(iri_to_uri(iri_to_uri(iri)), uri) + + def test_uri_to_iri(self): + cases = [ + # Valid UTF-8 sequences are decoded. + ('/%E2%99%A5%E2%99%A5/', '/♥♥/'), + ('/%E2%99%A5%E2%99%A5/?utf8=%E2%9C%93', '/♥♥/?utf8=✓'), + + # Broken UTF-8 sequences remain escaped. + ('/%AAd%AAj%AAa%AAn%AAg%AAo%AA/', '/%AAd%AAj%AAa%AAn%AAg%AAo%AA/'), + ('/%E2%99%A5%E2%E2%99%A5/', '/♥%E2♥/'), + ('/%E2%99%A5%E2%99%E2%99%A5/', '/♥%E2%99♥/'), + ('/%E2%E2%99%A5%E2%99%A5%99/', '/%E2♥♥%99/'), + ('/%E2%99%A5%E2%99%A5/?utf8=%9C%93%E2%9C%93%9C%93', '/♥♥/?utf8=%9C%93✓%9C%93'), + ] - self.assertEqual(iri_to_uri('/blog/for/J\xfcrgen M\xfcnster/'), - '/blog/for/J%C3%BCrgen%20M%C3%BCnster/') + for uri, iri in cases: + self.assertEqual(uri_to_iri(uri), iri) - self.assertEqual(iri_to_uri('locations/%s' % urlquote_plus('Paris & Orl\xe9ans')), - 'locations/Paris+%26+Orl%C3%A9ans') + # Test idempotency. + self.assertEqual(uri_to_iri(uri_to_iri(uri)), iri) - def test_iri_to_uri_idempotent(self): - self.assertEqual(iri_to_uri(iri_to_uri('red%09ros\xe9#red')), - 'red%09ros%C3%A9#red') + def test_complementarity(self): + cases = [ + ('/blog/for/J%C3%BCrgen%20M%C3%BCnster/', '/blog/for/J\xfcrgen M\xfcnster/'), + ('%&', '%&'), + ('red&%E2%99%A5ros%#red', 'red&♥ros%#red'), + ('/%E2%99%A5%E2%99%A5/', '/♥♥/'), + ('/%E2%99%A5%E2%99%A5/?utf8=%E2%9C%93', '/♥♥/?utf8=✓'), + ('/%AAd%AAj%AAa%AAn%AAg%AAo%AA/', '/%AAd%AAj%AAa%AAn%AAg%AAo%AA/'), + ('/%E2%99%A5%E2%E2%99%A5/', '/♥%E2♥/'), + ('/%E2%99%A5%E2%99%E2%99%A5/', '/♥%E2%99♥/'), + ('/%E2%E2%99%A5%E2%99%A5%99/', '/%E2♥♥%99/'), + ('/%E2%99%A5%E2%99%A5/?utf8=%9C%93%E2%9C%93%9C%93', '/♥♥/?utf8=%9C%93✓%9C%93'), + ] - @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 + for uri, iri in cases: + self.assertEqual(iri_to_uri(uri_to_iri(uri)), uri) + self.assertEqual(uri_to_iri(iri_to_uri(iri)), iri) |
