17db96d56Sopenharmony_ciimport io 27db96d56Sopenharmony_ciimport types 37db96d56Sopenharmony_ciimport textwrap 47db96d56Sopenharmony_ciimport unittest 57db96d56Sopenharmony_ciimport email.errors 67db96d56Sopenharmony_ciimport email.policy 77db96d56Sopenharmony_ciimport email.parser 87db96d56Sopenharmony_ciimport email.generator 97db96d56Sopenharmony_ciimport email.message 107db96d56Sopenharmony_cifrom email import headerregistry 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_cidef make_defaults(base_defaults, differences): 137db96d56Sopenharmony_ci defaults = base_defaults.copy() 147db96d56Sopenharmony_ci defaults.update(differences) 157db96d56Sopenharmony_ci return defaults 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ciclass PolicyAPITests(unittest.TestCase): 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci longMessage = True 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_ci # Base default values. 227db96d56Sopenharmony_ci compat32_defaults = { 237db96d56Sopenharmony_ci 'max_line_length': 78, 247db96d56Sopenharmony_ci 'linesep': '\n', 257db96d56Sopenharmony_ci 'cte_type': '8bit', 267db96d56Sopenharmony_ci 'raise_on_defect': False, 277db96d56Sopenharmony_ci 'mangle_from_': True, 287db96d56Sopenharmony_ci 'message_factory': None, 297db96d56Sopenharmony_ci } 307db96d56Sopenharmony_ci # These default values are the ones set on email.policy.default. 317db96d56Sopenharmony_ci # If any of these defaults change, the docs must be updated. 327db96d56Sopenharmony_ci policy_defaults = compat32_defaults.copy() 337db96d56Sopenharmony_ci policy_defaults.update({ 347db96d56Sopenharmony_ci 'utf8': False, 357db96d56Sopenharmony_ci 'raise_on_defect': False, 367db96d56Sopenharmony_ci 'header_factory': email.policy.EmailPolicy.header_factory, 377db96d56Sopenharmony_ci 'refold_source': 'long', 387db96d56Sopenharmony_ci 'content_manager': email.policy.EmailPolicy.content_manager, 397db96d56Sopenharmony_ci 'mangle_from_': False, 407db96d56Sopenharmony_ci 'message_factory': email.message.EmailMessage, 417db96d56Sopenharmony_ci }) 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ci # For each policy under test, we give here what we expect the defaults to 447db96d56Sopenharmony_ci # be for that policy. The second argument to make defaults is the 457db96d56Sopenharmony_ci # difference between the base defaults and that for the particular policy. 467db96d56Sopenharmony_ci new_policy = email.policy.EmailPolicy() 477db96d56Sopenharmony_ci policies = { 487db96d56Sopenharmony_ci email.policy.compat32: make_defaults(compat32_defaults, {}), 497db96d56Sopenharmony_ci email.policy.default: make_defaults(policy_defaults, {}), 507db96d56Sopenharmony_ci email.policy.SMTP: make_defaults(policy_defaults, 517db96d56Sopenharmony_ci {'linesep': '\r\n'}), 527db96d56Sopenharmony_ci email.policy.SMTPUTF8: make_defaults(policy_defaults, 537db96d56Sopenharmony_ci {'linesep': '\r\n', 547db96d56Sopenharmony_ci 'utf8': True}), 557db96d56Sopenharmony_ci email.policy.HTTP: make_defaults(policy_defaults, 567db96d56Sopenharmony_ci {'linesep': '\r\n', 577db96d56Sopenharmony_ci 'max_line_length': None}), 587db96d56Sopenharmony_ci email.policy.strict: make_defaults(policy_defaults, 597db96d56Sopenharmony_ci {'raise_on_defect': True}), 607db96d56Sopenharmony_ci new_policy: make_defaults(policy_defaults, {}), 617db96d56Sopenharmony_ci } 627db96d56Sopenharmony_ci # Creating a new policy creates a new header factory. There is a test 637db96d56Sopenharmony_ci # later that proves this. 647db96d56Sopenharmony_ci policies[new_policy]['header_factory'] = new_policy.header_factory 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci def test_defaults(self): 677db96d56Sopenharmony_ci for policy, expected in self.policies.items(): 687db96d56Sopenharmony_ci for attr, value in expected.items(): 697db96d56Sopenharmony_ci with self.subTest(policy=policy, attr=attr): 707db96d56Sopenharmony_ci self.assertEqual(getattr(policy, attr), value, 717db96d56Sopenharmony_ci ("change {} docs/docstrings if defaults have " 727db96d56Sopenharmony_ci "changed").format(policy)) 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci def test_all_attributes_covered(self): 757db96d56Sopenharmony_ci for policy, expected in self.policies.items(): 767db96d56Sopenharmony_ci for attr in dir(policy): 777db96d56Sopenharmony_ci with self.subTest(policy=policy, attr=attr): 787db96d56Sopenharmony_ci if (attr.startswith('_') or 797db96d56Sopenharmony_ci isinstance(getattr(email.policy.EmailPolicy, attr), 807db96d56Sopenharmony_ci types.FunctionType)): 817db96d56Sopenharmony_ci continue 827db96d56Sopenharmony_ci else: 837db96d56Sopenharmony_ci self.assertIn(attr, expected, 847db96d56Sopenharmony_ci "{} is not fully tested".format(attr)) 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci def test_abc(self): 877db96d56Sopenharmony_ci with self.assertRaises(TypeError) as cm: 887db96d56Sopenharmony_ci email.policy.Policy() 897db96d56Sopenharmony_ci msg = str(cm.exception) 907db96d56Sopenharmony_ci abstract_methods = ('fold', 917db96d56Sopenharmony_ci 'fold_binary', 927db96d56Sopenharmony_ci 'header_fetch_parse', 937db96d56Sopenharmony_ci 'header_source_parse', 947db96d56Sopenharmony_ci 'header_store_parse') 957db96d56Sopenharmony_ci for method in abstract_methods: 967db96d56Sopenharmony_ci self.assertIn(method, msg) 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci def test_policy_is_immutable(self): 997db96d56Sopenharmony_ci for policy, defaults in self.policies.items(): 1007db96d56Sopenharmony_ci for attr in defaults: 1017db96d56Sopenharmony_ci with self.assertRaisesRegex(AttributeError, attr+".*read-only"): 1027db96d56Sopenharmony_ci setattr(policy, attr, None) 1037db96d56Sopenharmony_ci with self.assertRaisesRegex(AttributeError, 'no attribute.*foo'): 1047db96d56Sopenharmony_ci policy.foo = None 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ci def test_set_policy_attrs_when_cloned(self): 1077db96d56Sopenharmony_ci # None of the attributes has a default value of None, so we set them 1087db96d56Sopenharmony_ci # all to None in the clone call and check that it worked. 1097db96d56Sopenharmony_ci for policyclass, defaults in self.policies.items(): 1107db96d56Sopenharmony_ci testattrdict = {attr: None for attr in defaults} 1117db96d56Sopenharmony_ci policy = policyclass.clone(**testattrdict) 1127db96d56Sopenharmony_ci for attr in defaults: 1137db96d56Sopenharmony_ci self.assertIsNone(getattr(policy, attr)) 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci def test_reject_non_policy_keyword_when_called(self): 1167db96d56Sopenharmony_ci for policyclass in self.policies: 1177db96d56Sopenharmony_ci with self.assertRaises(TypeError): 1187db96d56Sopenharmony_ci policyclass(this_keyword_should_not_be_valid=None) 1197db96d56Sopenharmony_ci with self.assertRaises(TypeError): 1207db96d56Sopenharmony_ci policyclass(newtline=None) 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci def test_policy_addition(self): 1237db96d56Sopenharmony_ci expected = self.policy_defaults.copy() 1247db96d56Sopenharmony_ci p1 = email.policy.default.clone(max_line_length=100) 1257db96d56Sopenharmony_ci p2 = email.policy.default.clone(max_line_length=50) 1267db96d56Sopenharmony_ci added = p1 + p2 1277db96d56Sopenharmony_ci expected.update(max_line_length=50) 1287db96d56Sopenharmony_ci for attr, value in expected.items(): 1297db96d56Sopenharmony_ci self.assertEqual(getattr(added, attr), value) 1307db96d56Sopenharmony_ci added = p2 + p1 1317db96d56Sopenharmony_ci expected.update(max_line_length=100) 1327db96d56Sopenharmony_ci for attr, value in expected.items(): 1337db96d56Sopenharmony_ci self.assertEqual(getattr(added, attr), value) 1347db96d56Sopenharmony_ci added = added + email.policy.default 1357db96d56Sopenharmony_ci for attr, value in expected.items(): 1367db96d56Sopenharmony_ci self.assertEqual(getattr(added, attr), value) 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci def test_fold_zero_max_line_length(self): 1397db96d56Sopenharmony_ci expected = 'Subject: =?utf-8?q?=C3=A1?=\n' 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci msg = email.message.EmailMessage() 1427db96d56Sopenharmony_ci msg['Subject'] = 'á' 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci p1 = email.policy.default.clone(max_line_length=0) 1457db96d56Sopenharmony_ci p2 = email.policy.default.clone(max_line_length=None) 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci self.assertEqual(p1.fold('Subject', msg['Subject']), expected) 1487db96d56Sopenharmony_ci self.assertEqual(p2.fold('Subject', msg['Subject']), expected) 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci def test_register_defect(self): 1517db96d56Sopenharmony_ci class Dummy: 1527db96d56Sopenharmony_ci def __init__(self): 1537db96d56Sopenharmony_ci self.defects = [] 1547db96d56Sopenharmony_ci obj = Dummy() 1557db96d56Sopenharmony_ci defect = object() 1567db96d56Sopenharmony_ci policy = email.policy.EmailPolicy() 1577db96d56Sopenharmony_ci policy.register_defect(obj, defect) 1587db96d56Sopenharmony_ci self.assertEqual(obj.defects, [defect]) 1597db96d56Sopenharmony_ci defect2 = object() 1607db96d56Sopenharmony_ci policy.register_defect(obj, defect2) 1617db96d56Sopenharmony_ci self.assertEqual(obj.defects, [defect, defect2]) 1627db96d56Sopenharmony_ci 1637db96d56Sopenharmony_ci class MyObj: 1647db96d56Sopenharmony_ci def __init__(self): 1657db96d56Sopenharmony_ci self.defects = [] 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci class MyDefect(Exception): 1687db96d56Sopenharmony_ci pass 1697db96d56Sopenharmony_ci 1707db96d56Sopenharmony_ci def test_handle_defect_raises_on_strict(self): 1717db96d56Sopenharmony_ci foo = self.MyObj() 1727db96d56Sopenharmony_ci defect = self.MyDefect("the telly is broken") 1737db96d56Sopenharmony_ci with self.assertRaisesRegex(self.MyDefect, "the telly is broken"): 1747db96d56Sopenharmony_ci email.policy.strict.handle_defect(foo, defect) 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci def test_handle_defect_registers_defect(self): 1777db96d56Sopenharmony_ci foo = self.MyObj() 1787db96d56Sopenharmony_ci defect1 = self.MyDefect("one") 1797db96d56Sopenharmony_ci email.policy.default.handle_defect(foo, defect1) 1807db96d56Sopenharmony_ci self.assertEqual(foo.defects, [defect1]) 1817db96d56Sopenharmony_ci defect2 = self.MyDefect("two") 1827db96d56Sopenharmony_ci email.policy.default.handle_defect(foo, defect2) 1837db96d56Sopenharmony_ci self.assertEqual(foo.defects, [defect1, defect2]) 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ci class MyPolicy(email.policy.EmailPolicy): 1867db96d56Sopenharmony_ci defects = None 1877db96d56Sopenharmony_ci def __init__(self, *args, **kw): 1887db96d56Sopenharmony_ci super().__init__(*args, defects=[], **kw) 1897db96d56Sopenharmony_ci def register_defect(self, obj, defect): 1907db96d56Sopenharmony_ci self.defects.append(defect) 1917db96d56Sopenharmony_ci 1927db96d56Sopenharmony_ci def test_overridden_register_defect_still_raises(self): 1937db96d56Sopenharmony_ci foo = self.MyObj() 1947db96d56Sopenharmony_ci defect = self.MyDefect("the telly is broken") 1957db96d56Sopenharmony_ci with self.assertRaisesRegex(self.MyDefect, "the telly is broken"): 1967db96d56Sopenharmony_ci self.MyPolicy(raise_on_defect=True).handle_defect(foo, defect) 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci def test_overridden_register_defect_works(self): 1997db96d56Sopenharmony_ci foo = self.MyObj() 2007db96d56Sopenharmony_ci defect1 = self.MyDefect("one") 2017db96d56Sopenharmony_ci my_policy = self.MyPolicy() 2027db96d56Sopenharmony_ci my_policy.handle_defect(foo, defect1) 2037db96d56Sopenharmony_ci self.assertEqual(my_policy.defects, [defect1]) 2047db96d56Sopenharmony_ci self.assertEqual(foo.defects, []) 2057db96d56Sopenharmony_ci defect2 = self.MyDefect("two") 2067db96d56Sopenharmony_ci my_policy.handle_defect(foo, defect2) 2077db96d56Sopenharmony_ci self.assertEqual(my_policy.defects, [defect1, defect2]) 2087db96d56Sopenharmony_ci self.assertEqual(foo.defects, []) 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci def test_default_header_factory(self): 2117db96d56Sopenharmony_ci h = email.policy.default.header_factory('Test', 'test') 2127db96d56Sopenharmony_ci self.assertEqual(h.name, 'Test') 2137db96d56Sopenharmony_ci self.assertIsInstance(h, headerregistry.UnstructuredHeader) 2147db96d56Sopenharmony_ci self.assertIsInstance(h, headerregistry.BaseHeader) 2157db96d56Sopenharmony_ci 2167db96d56Sopenharmony_ci class Foo: 2177db96d56Sopenharmony_ci parse = headerregistry.UnstructuredHeader.parse 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci def test_each_Policy_gets_unique_factory(self): 2207db96d56Sopenharmony_ci policy1 = email.policy.EmailPolicy() 2217db96d56Sopenharmony_ci policy2 = email.policy.EmailPolicy() 2227db96d56Sopenharmony_ci policy1.header_factory.map_to_type('foo', self.Foo) 2237db96d56Sopenharmony_ci h = policy1.header_factory('foo', 'test') 2247db96d56Sopenharmony_ci self.assertIsInstance(h, self.Foo) 2257db96d56Sopenharmony_ci self.assertNotIsInstance(h, headerregistry.UnstructuredHeader) 2267db96d56Sopenharmony_ci h = policy2.header_factory('foo', 'test') 2277db96d56Sopenharmony_ci self.assertNotIsInstance(h, self.Foo) 2287db96d56Sopenharmony_ci self.assertIsInstance(h, headerregistry.UnstructuredHeader) 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci def test_clone_copies_factory(self): 2317db96d56Sopenharmony_ci policy1 = email.policy.EmailPolicy() 2327db96d56Sopenharmony_ci policy2 = policy1.clone() 2337db96d56Sopenharmony_ci policy1.header_factory.map_to_type('foo', self.Foo) 2347db96d56Sopenharmony_ci h = policy1.header_factory('foo', 'test') 2357db96d56Sopenharmony_ci self.assertIsInstance(h, self.Foo) 2367db96d56Sopenharmony_ci h = policy2.header_factory('foo', 'test') 2377db96d56Sopenharmony_ci self.assertIsInstance(h, self.Foo) 2387db96d56Sopenharmony_ci 2397db96d56Sopenharmony_ci def test_new_factory_overrides_default(self): 2407db96d56Sopenharmony_ci mypolicy = email.policy.EmailPolicy() 2417db96d56Sopenharmony_ci myfactory = mypolicy.header_factory 2427db96d56Sopenharmony_ci newpolicy = mypolicy + email.policy.strict 2437db96d56Sopenharmony_ci self.assertEqual(newpolicy.header_factory, myfactory) 2447db96d56Sopenharmony_ci newpolicy = email.policy.strict + mypolicy 2457db96d56Sopenharmony_ci self.assertEqual(newpolicy.header_factory, myfactory) 2467db96d56Sopenharmony_ci 2477db96d56Sopenharmony_ci def test_adding_default_policies_preserves_default_factory(self): 2487db96d56Sopenharmony_ci newpolicy = email.policy.default + email.policy.strict 2497db96d56Sopenharmony_ci self.assertEqual(newpolicy.header_factory, 2507db96d56Sopenharmony_ci email.policy.EmailPolicy.header_factory) 2517db96d56Sopenharmony_ci self.assertEqual(newpolicy.__dict__, {'raise_on_defect': True}) 2527db96d56Sopenharmony_ci 2537db96d56Sopenharmony_ci def test_non_ascii_chars_do_not_cause_inf_loop(self): 2547db96d56Sopenharmony_ci policy = email.policy.default.clone(max_line_length=20) 2557db96d56Sopenharmony_ci actual = policy.fold('Subject', 'ą' * 12) 2567db96d56Sopenharmony_ci self.assertEqual( 2577db96d56Sopenharmony_ci actual, 2587db96d56Sopenharmony_ci 'Subject: \n' + 2597db96d56Sopenharmony_ci 12 * ' =?utf-8?q?=C4=85?=\n') 2607db96d56Sopenharmony_ci 2617db96d56Sopenharmony_ci def test_short_maxlen_error(self): 2627db96d56Sopenharmony_ci # RFC 2047 chrome takes up 7 characters, plus the length of the charset 2637db96d56Sopenharmony_ci # name, so folding should fail if maxlen is lower than the minimum 2647db96d56Sopenharmony_ci # required length for a line. 2657db96d56Sopenharmony_ci 2667db96d56Sopenharmony_ci # Note: This is only triggered when there is a single word longer than 2677db96d56Sopenharmony_ci # max_line_length, hence the 1234567890 at the end of this whimsical 2687db96d56Sopenharmony_ci # subject. This is because when we encounter a word longer than 2697db96d56Sopenharmony_ci # max_line_length, it is broken down into encoded words to fit 2707db96d56Sopenharmony_ci # max_line_length. If the max_line_length isn't large enough to even 2717db96d56Sopenharmony_ci # contain the RFC 2047 chrome (`?=<charset>?q??=`), we fail. 2727db96d56Sopenharmony_ci subject = "Melt away the pounds with this one simple trick! 1234567890" 2737db96d56Sopenharmony_ci 2747db96d56Sopenharmony_ci for maxlen in [3, 7, 9]: 2757db96d56Sopenharmony_ci with self.subTest(maxlen=maxlen): 2767db96d56Sopenharmony_ci policy = email.policy.default.clone(max_line_length=maxlen) 2777db96d56Sopenharmony_ci with self.assertRaises(email.errors.HeaderParseError): 2787db96d56Sopenharmony_ci policy.fold("Subject", subject) 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci # XXX: Need subclassing tests. 2817db96d56Sopenharmony_ci # For adding subclassed objects, make sure the usual rules apply (subclass 2827db96d56Sopenharmony_ci # wins), but that the order still works (right overrides left). 2837db96d56Sopenharmony_ci 2847db96d56Sopenharmony_ci 2857db96d56Sopenharmony_ciclass TestException(Exception): 2867db96d56Sopenharmony_ci pass 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_ciclass TestPolicyPropagation(unittest.TestCase): 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci # The abstract methods are used by the parser but not by the wrapper 2917db96d56Sopenharmony_ci # functions that call it, so if the exception gets raised we know that the 2927db96d56Sopenharmony_ci # policy was actually propagated all the way to feedparser. 2937db96d56Sopenharmony_ci class MyPolicy(email.policy.Policy): 2947db96d56Sopenharmony_ci def badmethod(self, *args, **kw): 2957db96d56Sopenharmony_ci raise TestException("test") 2967db96d56Sopenharmony_ci fold = fold_binary = header_fetch_parser = badmethod 2977db96d56Sopenharmony_ci header_source_parse = header_store_parse = badmethod 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_ci def test_message_from_string(self): 3007db96d56Sopenharmony_ci with self.assertRaisesRegex(TestException, "^test$"): 3017db96d56Sopenharmony_ci email.message_from_string("Subject: test\n\n", 3027db96d56Sopenharmony_ci policy=self.MyPolicy) 3037db96d56Sopenharmony_ci 3047db96d56Sopenharmony_ci def test_message_from_bytes(self): 3057db96d56Sopenharmony_ci with self.assertRaisesRegex(TestException, "^test$"): 3067db96d56Sopenharmony_ci email.message_from_bytes(b"Subject: test\n\n", 3077db96d56Sopenharmony_ci policy=self.MyPolicy) 3087db96d56Sopenharmony_ci 3097db96d56Sopenharmony_ci def test_message_from_file(self): 3107db96d56Sopenharmony_ci f = io.StringIO('Subject: test\n\n') 3117db96d56Sopenharmony_ci with self.assertRaisesRegex(TestException, "^test$"): 3127db96d56Sopenharmony_ci email.message_from_file(f, policy=self.MyPolicy) 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci def test_message_from_binary_file(self): 3157db96d56Sopenharmony_ci f = io.BytesIO(b'Subject: test\n\n') 3167db96d56Sopenharmony_ci with self.assertRaisesRegex(TestException, "^test$"): 3177db96d56Sopenharmony_ci email.message_from_binary_file(f, policy=self.MyPolicy) 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci # These are redundant, but we need them for black-box completeness. 3207db96d56Sopenharmony_ci 3217db96d56Sopenharmony_ci def test_parser(self): 3227db96d56Sopenharmony_ci p = email.parser.Parser(policy=self.MyPolicy) 3237db96d56Sopenharmony_ci with self.assertRaisesRegex(TestException, "^test$"): 3247db96d56Sopenharmony_ci p.parsestr('Subject: test\n\n') 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci def test_bytes_parser(self): 3277db96d56Sopenharmony_ci p = email.parser.BytesParser(policy=self.MyPolicy) 3287db96d56Sopenharmony_ci with self.assertRaisesRegex(TestException, "^test$"): 3297db96d56Sopenharmony_ci p.parsebytes(b'Subject: test\n\n') 3307db96d56Sopenharmony_ci 3317db96d56Sopenharmony_ci # Now that we've established that all the parse methods get the 3327db96d56Sopenharmony_ci # policy in to feedparser, we can use message_from_string for 3337db96d56Sopenharmony_ci # the rest of the propagation tests. 3347db96d56Sopenharmony_ci 3357db96d56Sopenharmony_ci def _make_msg(self, source='Subject: test\n\n', policy=None): 3367db96d56Sopenharmony_ci self.policy = email.policy.default.clone() if policy is None else policy 3377db96d56Sopenharmony_ci return email.message_from_string(source, policy=self.policy) 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_ci def test_parser_propagates_policy_to_message(self): 3407db96d56Sopenharmony_ci msg = self._make_msg() 3417db96d56Sopenharmony_ci self.assertIs(msg.policy, self.policy) 3427db96d56Sopenharmony_ci 3437db96d56Sopenharmony_ci def test_parser_propagates_policy_to_sub_messages(self): 3447db96d56Sopenharmony_ci msg = self._make_msg(textwrap.dedent("""\ 3457db96d56Sopenharmony_ci Subject: mime test 3467db96d56Sopenharmony_ci MIME-Version: 1.0 3477db96d56Sopenharmony_ci Content-Type: multipart/mixed, boundary="XXX" 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci --XXX 3507db96d56Sopenharmony_ci Content-Type: text/plain 3517db96d56Sopenharmony_ci 3527db96d56Sopenharmony_ci test 3537db96d56Sopenharmony_ci --XXX 3547db96d56Sopenharmony_ci Content-Type: text/plain 3557db96d56Sopenharmony_ci 3567db96d56Sopenharmony_ci test2 3577db96d56Sopenharmony_ci --XXX-- 3587db96d56Sopenharmony_ci """)) 3597db96d56Sopenharmony_ci for part in msg.walk(): 3607db96d56Sopenharmony_ci self.assertIs(part.policy, self.policy) 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci def test_message_policy_propagates_to_generator(self): 3637db96d56Sopenharmony_ci msg = self._make_msg("Subject: test\nTo: foo\n\n", 3647db96d56Sopenharmony_ci policy=email.policy.default.clone(linesep='X')) 3657db96d56Sopenharmony_ci s = io.StringIO() 3667db96d56Sopenharmony_ci g = email.generator.Generator(s) 3677db96d56Sopenharmony_ci g.flatten(msg) 3687db96d56Sopenharmony_ci self.assertEqual(s.getvalue(), "Subject: testXTo: fooXX") 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ci def test_message_policy_used_by_as_string(self): 3717db96d56Sopenharmony_ci msg = self._make_msg("Subject: test\nTo: foo\n\n", 3727db96d56Sopenharmony_ci policy=email.policy.default.clone(linesep='X')) 3737db96d56Sopenharmony_ci self.assertEqual(msg.as_string(), "Subject: testXTo: fooXX") 3747db96d56Sopenharmony_ci 3757db96d56Sopenharmony_ci 3767db96d56Sopenharmony_ciclass TestConcretePolicies(unittest.TestCase): 3777db96d56Sopenharmony_ci 3787db96d56Sopenharmony_ci def test_header_store_parse_rejects_newlines(self): 3797db96d56Sopenharmony_ci instance = email.policy.EmailPolicy() 3807db96d56Sopenharmony_ci self.assertRaises(ValueError, 3817db96d56Sopenharmony_ci instance.header_store_parse, 3827db96d56Sopenharmony_ci 'From', 'spam\negg@foo.py') 3837db96d56Sopenharmony_ci 3847db96d56Sopenharmony_ci 3857db96d56Sopenharmony_ciif __name__ == '__main__': 3867db96d56Sopenharmony_ci unittest.main() 387