def setUp(self): super(TestCollectionNoConnect, self).setUp() if sys.version_info[0] == 2: self._original_encoding = sys.getdefaultencoding() def tearDown(self): super(TestCollectionNoConnect, self).tearDown() if sys.version_info[0] == 2: # Restore back the original encoding sys.setdefaultencoding(self._original_encoding) @unittest.skipIf(sys.version_info[0] == 3, 'Skipping tests under Python 3') def test_error_message_as_as_string_and_unicode_python2(self): msg1 = 'E11000 duplicate key error index: foo.$uid_1 dup key: { : "žfooćšžži💩" }' msg2 = u'E11000 duplicate key error index: foo.$uid_1 dup key: { : "žfooćšžži💩" }' err1 = DuplicateKeyError(msg1) err2 = DuplicateKeyError(msg2) # 1. Test with ascii encoding reload(sys) sys.setdefaultencoding('ascii') self.assertEqual(sys.getdefaultencoding(), 'ascii') err_1_str = str(err1) err_1_unicode = unicode(err1) err_2_str = str(err2) err_2_unicode = unicode(err2) self.assertEqual(err_1_str, msg1) self.assertEqual(err_1_unicode, unicode(msg1, 'utf-8')) self.assertEqual(err_2_str, msg2.encode('utf-8', errors='replace')) self.assertEqual(err_2_unicode, msg2) # 2. Test with utf-8 encoding reload(sys) sys.setdefaultencoding('utf8') self.assertEqual(sys.getdefaultencoding(), 'utf8') err_1_str = str(err1) err_1_unicode = unicode(err1) err_2_str = str(err2) err_2_unicode = unicode(err2) self.assertEqual(err_1_str, msg1) self.assertEqual(err_1_unicode, unicode(msg1, 'utf-8')) # Here casting to unicode works out of the box because default encoding # is utf8 self.assertEqual(err_1_unicode, msg1) self.assertEqual(err_2_str, msg2.encode('utf-8', errors='replace')) self.assertEqual(err_2_unicode, msg2) @unittest.skipIf(sys.version_info[0] == 2, 'Skipping tests under Python 2') def test_error_message_as_as_string_and_unicode_python3(self): msg = 'E11000 duplicate key error index: foo.$uid_1 dup key: { : "žfooćšžži💩" }' err = DuplicateKeyError(msg) err_unicode = str(err) self.assertEqual(err_unicode, msg)