from HTMLParser import HTMLParseError import unittest from trac.util import Markup, unescape class MarkupTestCase(unittest.TestCase): def test_escape(self): markup = Markup.escape('"&"') assert isinstance(markup, Markup) self.assertEquals('<b>"&"</b>', markup) def test_escape_noquotes(self): markup = Markup.escape('"&"', quotes=False) assert isinstance(markup, Markup) self.assertEquals('<b>"&"</b>', markup) def test_unescape_markup(self): string = '"&"' markup = Markup.escape(string) assert isinstance(markup, Markup) self.assertEquals(string, unescape(markup)) def test_add_str(self): markup = Markup('foo') + '
' assert isinstance(markup, Markup) self.assertEquals('foo<br/>', markup) def test_add_markup(self): markup = Markup('foo') + Markup('
') assert isinstance(markup, Markup) self.assertEquals('foo
', markup) def test_add_reverse(self): markup = 'foo' + Markup('bar') assert isinstance(markup, str) self.assertEquals('foobar', markup) def test_mul(self): markup = Markup('foo') * 2 assert isinstance(markup, Markup) self.assertEquals('foofoo', markup) def test_join(self): markup = Markup('
').join(['foo', '', Markup('')]) assert isinstance(markup, Markup) self.assertEquals('foo
<bar />
', markup) def test_striptags_empty(self): markup = Markup('
').striptags() assert isinstance(markup, Markup) self.assertEquals('', markup) def test_striptags_mid(self): markup = Markup('fo
o
').striptags() assert isinstance(markup, Markup) self.assertEquals('foo', markup) def test_sanitize_unchanged(self): markup = Markup('fo
o
') self.assertEquals('fo
o
', markup.sanitize()) def test_sanitize_escape_text(self): markup = Markup('fo&') self.assertEquals('fo&', markup.sanitize()) markup = Markup('<foo>') self.assertEquals('<foo>', markup.sanitize()) def test_sanitize_entityref_text(self): markup = Markup('foö') self.assertEquals('fo\xc3\xb6', markup.sanitize()) def test_sanitize_escape_attr(self): markup = Markup('
') self.assertEquals('
', markup.sanitize()) def test_sanitize_close_empty_tag(self): markup = Markup('fo
o
') self.assertEquals('fo
o
', markup.sanitize()) def test_sanitize_invalid_entity(self): markup = Markup('&junk;') self.assertEquals('&junk;', markup.sanitize()) def test_sanitize_remove_script_elem(self): markup = Markup('') self.assertEquals('', markup.sanitize()) markup = Markup('') self.assertEquals('', markup.sanitize()) markup = Markup('alert("foo")') self.assertRaises(HTMLParseError, markup.sanitize) markup = Markup('') self.assertRaises(HTMLParseError, markup.sanitize) def test_sanitize_remove_onclick_attr(self): markup = Markup('
') self.assertEquals('
', markup.sanitize()) def test_sanitize_remove_style_scripts(self): # Inline style with url() using javascript: scheme markup = Markup('
') self.assertEquals('
', markup.sanitize()) # Inline style with url() using javascript: scheme, using control char markup = Markup('
') self.assertEquals('
', markup.sanitize()) # Inline style with url() using javascript: scheme, in quotes markup = Markup('
') self.assertEquals('
', markup.sanitize()) # IE expressions in CSS not allowed markup = Markup('
') self.assertEquals('
', markup.sanitize()) markup = Markup('
') self.assertEquals('
', markup.sanitize()) def test_sanitize_remove_src_javascript(self): markup = Markup('') self.assertEquals('', markup.sanitize()) # Case-insensitive protocol matching markup = Markup('') self.assertEquals('', markup.sanitize()) # Grave accents (not parsed) markup = Markup('') self.assertRaises(HTMLParseError, markup.sanitize) # Protocol encoded using UTF-8 numeric entities markup = Markup('') self.assertEquals('', markup.sanitize()) # Protocol encoded using UTF-8 numeric entities without a semicolon # (which is allowed because the max number of digits is used) markup = Markup('') self.assertEquals('', markup.sanitize()) # Protocol encoded using UTF-8 numeric hex entities without a semicolon # (which is allowed because the max number of digits is used) markup = Markup('') self.assertEquals('', markup.sanitize()) # Embedded tab character in protocol markup = Markup('') self.assertEquals('', markup.sanitize()) # Embedded tab character in protocol, but encoded this time markup = Markup('') self.assertEquals('', markup.sanitize()) def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(MarkupTestCase, 'test')) return suite if __name__ == '__main__': unittest.main()