# -*- coding: utf-8 -*- """Tests of Beautiful Soup as a whole.""" import unittest from helpers import SoupTest from beautifulsoup.dammit import UnicodeDammit class TestEncodingConversion(SoupTest): # Test Beautiful Soup's ability to decode and encode from various # encodings. def setUp(self): super(TestEncodingConversion, self).setUp() self.unicode_data = u"\xe9" self.utf8_data = self.unicode_data.encode("utf-8") self.assertEqual( self.utf8_data, "\xc3\xa9") def test_ascii_in_unicode_out(self): # ASCII input is converted to Unicode. The originalEncoding # attribute is set. ascii = "a" soup_from_ascii = self.soup(ascii) unicode_output = soup_from_ascii.decode() self.assertTrue(isinstance(unicode_output, unicode)) self.assertEquals(unicode_output, self.document_for(ascii)) self.assertEquals(soup_from_ascii.originalEncoding, "ascii") def test_unicode_in_unicode_out(self): # Unicode input is left alone. The originalEncoding attribute # is not set. soup_from_unicode = self.soup(self.unicode_data) self.assertEquals(soup_from_unicode.decode(), self.unicode_data) self.assertEquals(soup_from_unicode.foo.string, u'\xe9') self.assertEquals(soup_from_unicode.originalEncoding, None) def test_utf8_in_unicode_out(self): # UTF-8 input is converted to Unicode. The originalEncoding # attribute is set. soup_from_utf8 = self.soup(self.utf8_data) self.assertEquals(soup_from_utf8.decode(), self.unicode_data) self.assertEquals(soup_from_utf8.foo.string, u'\xe9') def test_utf8_out(self): # The internal data structures can be encoded as UTF-8. soup_from_unicode = self.soup(self.unicode_data) self.assertEquals(soup_from_unicode.encode('utf-8'), self.utf8_data) class TestUnicodeDammit(unittest.TestCase): """Standalone tests of Unicode, Dammit.""" def test_smart_quote_replacement(self): markup = "\x92" dammit = UnicodeDammit(markup) self.assertEquals(dammit.unicode, "") def test_detect_utf8(self): utf8 = "\xc3\xa9" dammit = UnicodeDammit(utf8) self.assertEquals(dammit.unicode, u'\xe9') self.assertEquals(dammit.originalEncoding, 'utf-8') def test_convert_hebrew(self): hebrew = "\xed\xe5\xec\xf9" dammit = UnicodeDammit(hebrew, ["iso-8859-8"]) self.assertEquals(dammit.originalEncoding, 'iso-8859-8') self.assertEquals(dammit.unicode, u'\u05dd\u05d5\u05dc\u05e9') def test_dont_see_smart_quotes_where_there_are_none(self): utf_8 = "\343\202\261\343\203\274\343\202\277\343\202\244 Watch" dammit = UnicodeDammit(utf_8) self.assertEquals(dammit.originalEncoding, 'utf-8') self.assertEquals(dammit.unicode.encode("utf-8"), utf_8) def test_ignore_inappropriate_codecs(self): utf8_data = u"Räksmörgås".encode("utf-8") dammit = UnicodeDammit(utf8_data, ["iso-8859-1"]) self.assertEquals(dammit.originalEncoding, 'utf-8') def test_ignore_invalid_codecs(self): utf8_data = u"Räksmörgås".encode("utf-8") for bad_encoding in ['.utf8', '...', 'utF---16.!']: dammit = UnicodeDammit(utf8_data, [bad_encoding]) self.assertEquals(dammit.originalEncoding, 'utf-8')