Mercurial > repos > bcclaywell > argo_navis
comparison venv/lib/python2.7/site-packages/markupsafe/tests.py @ 0:d67268158946 draft
planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
| author | bcclaywell |
|---|---|
| date | Mon, 12 Oct 2015 17:43:33 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:d67268158946 |
|---|---|
| 1 # -*- coding: utf-8 -*- | |
| 2 import gc | |
| 3 import sys | |
| 4 import unittest | |
| 5 from markupsafe import Markup, escape, escape_silent | |
| 6 from markupsafe._compat import text_type | |
| 7 | |
| 8 | |
| 9 class MarkupTestCase(unittest.TestCase): | |
| 10 | |
| 11 def test_adding(self): | |
| 12 # adding two strings should escape the unsafe one | |
| 13 unsafe = '<script type="application/x-some-script">alert("foo");</script>' | |
| 14 safe = Markup('<em>username</em>') | |
| 15 assert unsafe + safe == text_type(escape(unsafe)) + text_type(safe) | |
| 16 | |
| 17 def test_string_interpolation(self): | |
| 18 # string interpolations are safe to use too | |
| 19 assert Markup('<em>%s</em>') % '<bad user>' == \ | |
| 20 '<em><bad user></em>' | |
| 21 assert Markup('<em>%(username)s</em>') % { | |
| 22 'username': '<bad user>' | |
| 23 } == '<em><bad user></em>' | |
| 24 | |
| 25 assert Markup('%i') % 3.14 == '3' | |
| 26 assert Markup('%.2f') % 3.14 == '3.14' | |
| 27 | |
| 28 def test_type_behavior(self): | |
| 29 # an escaped object is markup too | |
| 30 assert type(Markup('foo') + 'bar') is Markup | |
| 31 | |
| 32 # and it implements __html__ by returning itself | |
| 33 x = Markup("foo") | |
| 34 assert x.__html__() is x | |
| 35 | |
| 36 def test_html_interop(self): | |
| 37 # it also knows how to treat __html__ objects | |
| 38 class Foo(object): | |
| 39 def __html__(self): | |
| 40 return '<em>awesome</em>' | |
| 41 def __unicode__(self): | |
| 42 return 'awesome' | |
| 43 __str__ = __unicode__ | |
| 44 assert Markup(Foo()) == '<em>awesome</em>' | |
| 45 assert Markup('<strong>%s</strong>') % Foo() == \ | |
| 46 '<strong><em>awesome</em></strong>' | |
| 47 | |
| 48 def test_tuple_interpol(self): | |
| 49 self.assertEqual(Markup('<em>%s:%s</em>') % ( | |
| 50 '<foo>', | |
| 51 '<bar>', | |
| 52 ), Markup(u'<em><foo>:<bar></em>')) | |
| 53 | |
| 54 def test_dict_interpol(self): | |
| 55 self.assertEqual(Markup('<em>%(foo)s</em>') % { | |
| 56 'foo': '<foo>', | |
| 57 }, Markup(u'<em><foo></em>')) | |
| 58 self.assertEqual(Markup('<em>%(foo)s:%(bar)s</em>') % { | |
| 59 'foo': '<foo>', | |
| 60 'bar': '<bar>', | |
| 61 }, Markup(u'<em><foo>:<bar></em>')) | |
| 62 | |
| 63 def test_escaping(self): | |
| 64 # escaping and unescaping | |
| 65 assert escape('"<>&\'') == '"<>&'' | |
| 66 assert Markup("<em>Foo & Bar</em>").striptags() == "Foo & Bar" | |
| 67 assert Markup("<test>").unescape() == "<test>" | |
| 68 | |
| 69 def test_formatting(self): | |
| 70 for actual, expected in ( | |
| 71 (Markup('%i') % 3.14, '3'), | |
| 72 (Markup('%.2f') % 3.14159, '3.14'), | |
| 73 (Markup('%s %s %s') % ('<', 123, '>'), '< 123 >'), | |
| 74 (Markup('<em>{awesome}</em>').format(awesome='<awesome>'), | |
| 75 '<em><awesome></em>'), | |
| 76 (Markup('{0[1][bar]}').format([0, {'bar': '<bar/>'}]), | |
| 77 '<bar/>'), | |
| 78 (Markup('{0[1][bar]}').format([0, {'bar': Markup('<bar/>')}]), | |
| 79 '<bar/>')): | |
| 80 assert actual == expected, "%r should be %r!" % (actual, expected) | |
| 81 | |
| 82 # This is new in 2.7 | |
| 83 if sys.version_info >= (2, 7): | |
| 84 def test_formatting_empty(self): | |
| 85 formatted = Markup('{}').format(0) | |
| 86 assert formatted == Markup('0') | |
| 87 | |
| 88 def test_custom_formatting(self): | |
| 89 class HasHTMLOnly(object): | |
| 90 def __html__(self): | |
| 91 return Markup('<foo>') | |
| 92 | |
| 93 class HasHTMLAndFormat(object): | |
| 94 def __html__(self): | |
| 95 return Markup('<foo>') | |
| 96 def __html_format__(self, spec): | |
| 97 return Markup('<FORMAT>') | |
| 98 | |
| 99 assert Markup('{0}').format(HasHTMLOnly()) == Markup('<foo>') | |
| 100 assert Markup('{0}').format(HasHTMLAndFormat()) == Markup('<FORMAT>') | |
| 101 | |
| 102 def test_complex_custom_formatting(self): | |
| 103 class User(object): | |
| 104 def __init__(self, id, username): | |
| 105 self.id = id | |
| 106 self.username = username | |
| 107 def __html_format__(self, format_spec): | |
| 108 if format_spec == 'link': | |
| 109 return Markup('<a href="/user/{0}">{1}</a>').format( | |
| 110 self.id, | |
| 111 self.__html__(), | |
| 112 ) | |
| 113 elif format_spec: | |
| 114 raise ValueError('Invalid format spec') | |
| 115 return self.__html__() | |
| 116 def __html__(self): | |
| 117 return Markup('<span class=user>{0}</span>').format(self.username) | |
| 118 | |
| 119 user = User(1, 'foo') | |
| 120 assert Markup('<p>User: {0:link}').format(user) == \ | |
| 121 Markup('<p>User: <a href="/user/1"><span class=user>foo</span></a>') | |
| 122 | |
| 123 def test_all_set(self): | |
| 124 import markupsafe as markup | |
| 125 for item in markup.__all__: | |
| 126 getattr(markup, item) | |
| 127 | |
| 128 def test_escape_silent(self): | |
| 129 assert escape_silent(None) == Markup() | |
| 130 assert escape(None) == Markup(None) | |
| 131 assert escape_silent('<foo>') == Markup(u'<foo>') | |
| 132 | |
| 133 def test_splitting(self): | |
| 134 self.assertEqual(Markup('a b').split(), [ | |
| 135 Markup('a'), | |
| 136 Markup('b') | |
| 137 ]) | |
| 138 self.assertEqual(Markup('a b').rsplit(), [ | |
| 139 Markup('a'), | |
| 140 Markup('b') | |
| 141 ]) | |
| 142 self.assertEqual(Markup('a\nb').splitlines(), [ | |
| 143 Markup('a'), | |
| 144 Markup('b') | |
| 145 ]) | |
| 146 | |
| 147 def test_mul(self): | |
| 148 self.assertEqual(Markup('a') * 3, Markup('aaa')) | |
| 149 | |
| 150 | |
| 151 class MarkupLeakTestCase(unittest.TestCase): | |
| 152 | |
| 153 def test_markup_leaks(self): | |
| 154 counts = set() | |
| 155 for count in range(20): | |
| 156 for item in range(1000): | |
| 157 escape("foo") | |
| 158 escape("<foo>") | |
| 159 escape(u"foo") | |
| 160 escape(u"<foo>") | |
| 161 counts.add(len(gc.get_objects())) | |
| 162 assert len(counts) == 1, 'ouch, c extension seems to leak objects' | |
| 163 | |
| 164 | |
| 165 def suite(): | |
| 166 suite = unittest.TestSuite() | |
| 167 suite.addTest(unittest.makeSuite(MarkupTestCase)) | |
| 168 | |
| 169 # this test only tests the c extension | |
| 170 if not hasattr(escape, 'func_code'): | |
| 171 suite.addTest(unittest.makeSuite(MarkupLeakTestCase)) | |
| 172 | |
| 173 return suite | |
| 174 | |
| 175 | |
| 176 if __name__ == '__main__': | |
| 177 unittest.main(defaultTest='suite') | |
| 178 | |
| 179 # vim:sts=4:sw=4:et: |
