def test_address_compare(): a = EmailAddress("*****@*****.**") b = EmailAddress("*****@*****.**") also_a = EmailAddress("*****@*****.**") ok_(a == also_a) #eq_(False, a != "I am also A <*****@*****.**>") ok_(a != 'crap') ok_(a != None) ok_(a != b) u = UrlAddress("http://hello.com") ok_(u == "http://hello.com") # make sure it works for sets: s = set() s.add(a) s.add(also_a) eq_(1, len(s)) s.add(u) s.add(u) eq_(2, len(s)) # test string comparison ok_(a == a.address) ok_(not (a != a.address)) ok_(b != a.address) ok_(not (b == a.address))
def test_address_full_spec_smart_quote_display_name(): eq_(EmailAddress('foo', '*****@*****.**').full_spec(), 'foo <*****@*****.**>') eq_( EmailAddress('()<>[]:;@,.', '*****@*****.**').full_spec(), '"()<>[]:;@,." <*****@*****.**>') eq_(EmailAddress('"', '*****@*****.**').full_spec(), '"\\"" <*****@*****.**>') eq_(EmailAddress('\\', '*****@*****.**').full_spec(), '"\\\\" <*****@*****.**>')
def test_angle_addr(): "Grammar: angle-addr -> [ whitespace ] < addr-spec > [ whitespace ]" # pass angle-addr run_mailbox_test('<*****@*****.**>', '*****@*****.**') run_full_mailbox_test('Steve Jobs <*****@*****.**>', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('Steve Jobs < *****@*****.**>', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('Steve Jobs <*****@*****.** >', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('Steve Jobs < *****@*****.** >', EmailAddress('Steve Jobs', '*****@*****.**')) # fail angle-addr run_full_mailbox_test('<*****@*****.**', None) run_full_mailbox_test('Steve Jobs [email protected]>', None) run_full_mailbox_test('*****@*****.**>', None) run_full_mailbox_test('Steve Jobs <*****@*****.**', None) run_full_mailbox_test('Steve Jobs <@[email protected]>', None) run_full_mailbox_test('<Steve Jobs <*****@*****.**>>', None) run_full_mailbox_test('<Steve Jobs <*****@*****.**>', None) run_full_mailbox_test('Steve Jobs <*****@*****.**>>', None) run_full_mailbox_test('<Steve Jobs> <*****@*****.**>', None) run_full_mailbox_test('<Steve Jobs <*****@*****.**>', None) run_full_mailbox_test('Steve Jobs> <*****@*****.**>', None) run_full_mailbox_test('Steve Jobs <<*****@*****.**>>', None) run_full_mailbox_test('Steve Jobs <<*****@*****.**>', None)
def test_local_part(): "Grammar: local-part -> dot-atom | quoted-string" # test length limits run_mailbox_test(''.join(['a'*128, '@b']), ''.join(['a'*128, '@b'])) run_mailbox_test(''.join(['a'*1025, '@b']), None) # because qtext and quoted-pair are longer than 64 bytes (limit on local-part) # we use a sample in testing, every other for qtext and every fifth for quoted-pair sample_qtext = FULL_QTEXT[::2] sample_qpair = FULL_QUOTED_PAIR[::5] sample_qpair_without_slashes = sample_qpair[1::2] # pass dot-atom run_mailbox_test('*****@*****.**', '*****@*****.**') run_mailbox_test('*****@*****.**', '*****@*****.**') run_mailbox_test('*****@*****.**', '*****@*****.**') run_mailbox_test('!#$%&\'*+-/=?^_`{|}[email protected]', '!#$%&\'*+-/=?^_`{|}[email protected]') run_mailbox_test('AZaz09!#$%&\'*+-/=?^_`{|}[email protected]', 'AZaz09!#$%&\'*+-/=?^_`{|}[email protected]') run_mailbox_test('*****@*****.**', '*****@*****.**') run_mailbox_test(' [email protected]', '*****@*****.**') run_mailbox_test(' [email protected]', '*****@*****.**') # fail dot-atom run_mailbox_test(', [email protected]', None) run_mailbox_test(';;[email protected]', None) run_mailbox_test('"*****@*****.**', None) run_mailbox_test('steve"@apple.com', None) run_mailbox_test('*****@*****.**', None) # pass qtext for cnk in chunks(FULL_QTEXT, len(FULL_QTEXT) // 2): run_mailbox_test('"{0}"@b'.format(cnk), '"{0}"@b'.format(cnk)) run_mailbox_test('" {0}"@b'.format(sample_qtext), '" {0}"@b'.format(sample_qtext)) run_mailbox_test('"{0} "@b'.format(sample_qtext), '"{0} "@b'.format(sample_qtext)) run_mailbox_test('" {0} "@b'.format(sample_qtext), '" {0} "@b'.format(sample_qtext)) run_full_mailbox_test('"{0}" <"{0}"@b>'.format(sample_qtext), EmailAddress(sample_qtext, '"{0}"@b'.format(sample_qtext))) # fail qtext run_mailbox_test('"{0}@b'.format(sample_qtext), None) run_mailbox_test('{0}"@b'.format(sample_qtext), None) run_mailbox_test('{0}@b'.format(sample_qtext), None) run_mailbox_test('"{0}@b"'.format(sample_qtext), None) # pass quoted-pair for cnk in chunks(FULL_QUOTED_PAIR, len(FULL_QUOTED_PAIR) // 3): run_mailbox_test('"{0}"@b'.format(cnk), '"{0}"@b'.format(cnk)) run_mailbox_test('" {0}"@b'.format(sample_qpair), '" {0}"@b'.format(sample_qpair)) run_mailbox_test('"{0} "@b'.format(sample_qpair), '"{0} "@b'.format(sample_qpair)) run_mailbox_test('" {0} "@b'.format(sample_qpair), '" {0} "@b'.format(sample_qpair)) run_full_mailbox_test('"{0}" <"{0}"@b>'.format(sample_qpair), EmailAddress(sample_qpair_without_slashes, '"{0}"@b'.format(sample_qpair))) # fail quoted-pair run_mailbox_test('"{0}@b'.format(sample_qpair), None) run_mailbox_test('{0}"@b'.format(sample_qpair), None) run_mailbox_test('{0}@b'.format(sample_qpair), None) run_mailbox_test('"{0}@b"'.format(sample_qpair), None)
def test_mailbox(): "Grammar: mailbox -> name-addr | addr-spec" # sanity run_full_mailbox_test('Steve Jobs <*****@*****.**>', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('"Steve Jobs" <*****@*****.**>', EmailAddress('Steve Jobs', '*****@*****.**')) run_mailbox_test('*****@*****.**', '*****@*****.**')
def test_display_name__to_full_spec(): eq_('"foo (\\"bar\\") blah" <*****@*****.**>', EmailAddress('foo ("bar") blah', '*****@*****.**').full_spec()) eq_('"foo. bar" <*****@*****.**>', EmailAddress('foo. bar', '*****@*****.**').full_spec()) eq_('"\\"\\"" <*****@*****.**>', EmailAddress('""', '*****@*****.**').full_spec()), eq_('=?utf-8?b?0J/RgNC40LLQtdGCINCc0LXQtNCy0LXQtA==?= <*****@*****.**>', EmailAddress(u'Привет Медвед', '*****@*****.**').full_spec())
def test_display_name__update(): # Given a = EmailAddress('foo bar', '*****@*****.**') eq_('foo bar <*****@*****.**>', a.full_spec()) # When a.display_name = u'Привет Медвед' # Then eq_('=?utf-8?b?0J/RgNC40LLQtdGCINCc0LXQtNCy0LXQtA==?= <*****@*****.**>', a.full_spec())
def test_comments(): run_full_mailbox_test('(comment) Steve Jobs <*****@*****.**>', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('Steve Jobs (comment) <*****@*****.**>', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('Steve Jobs <(comment) [email protected]>', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('Steve Jobs <[email protected] (comment)>', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('Steve Jobs <*****@*****.**> (comment)', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('(comment)"Steve Jobs"<*****@*****.**>', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('"Steve Jobs"(comment)<*****@*****.**>', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('"Steve Jobs"<(comment)[email protected]>', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('"Steve Jobs"<[email protected](comment)>', EmailAddress('Steve Jobs', '*****@*****.**')) run_full_mailbox_test('"Steve Jobs"<*****@*****.**>(comment)', EmailAddress('Steve Jobs', '*****@*****.**'))
def test_name_addr(): "Grammar: name-addr -> [ display-name ] angle-addr" # sanity run_full_mailbox_test('Linus Torvalds [email protected]', EmailAddress('Linus Torvalds', '*****@*****.**')) run_full_mailbox_test('Linus Torvalds <*****@*****.**>', EmailAddress('Linus Torvalds', '*****@*****.**')) run_mailbox_test('Linus Torvalds', None) run_mailbox_test('Linus Torvalds <>', None) run_mailbox_test('*****@*****.**', '*****@*****.**') run_mailbox_test('<*****@*****.**>', '*****@*****.**') try: run_mailbox_test(' ', None) except ParserException: pass
def test_addresslist_address_obj_list_input(): al = [EmailAddress(u'Aurélien Berger <*****@*****.**>'), UrlAddress('https://www.example.com')] lst = parse_list(al) eq_(2, len(lst)) eq_('=?utf-8?q?Aur=C3=A9lien_Berger?= <*****@*****.**>', lst[0].full_spec()) eq_('https://www.example.com', lst[1].full_spec())
def test_misspelled_email(self, mock_validate, mock_suggest): """Should correct a misspelled domain and pass it back.""" email2 = '*****@*****.**' mock_suggest.return_value = email2 mock_validate.return_value = EmailAddress('', email2) result, is_suggestion = get_valid_email(self.email) ok_(is_suggestion) # should return a string, not the EmailAddress instance ok_(isinstance(result, basestring)) eq_(result, email2)
def test_address_unicode_smart_quote_display_name(): eq_(EmailAddress('foo', '*****@*****.**').to_unicode(), u'foo <*****@*****.**>') eq_(EmailAddress('()<>[]:;@,.', '*****@*****.**').to_unicode(), u'"()<>[]:;@,." <*****@*****.**>') eq_(EmailAddress('"', '*****@*****.**').to_unicode(), u'"\\"" <*****@*****.**>') eq_(EmailAddress('\\', '*****@*****.**').to_unicode(), u'"\\\\" <*****@*****.**>') eq_(EmailAddress('Федот', '*****@*****.**').to_unicode(), u'Федот <*****@*****.**>') eq_(EmailAddress('<Федот>', '*****@*****.**').to_unicode(), u'"<Федот>" <*****@*****.**>')
def test_requires_non_ascii(): eq_(EmailAddress(None, '*****@*****.**').requires_non_ascii(), False) eq_(EmailAddress(None, 'foo@экзампл.рус').requires_non_ascii(), False) eq_(EmailAddress(None, '*****@*****.**').requires_non_ascii(), False) eq_(EmailAddress(None, 'foo@日本語。JP').requires_non_ascii(), True) eq_(EmailAddress(None, 'аджай@bar.com').requires_non_ascii(), True) eq_(EmailAddress(None, 'аджай@экзампл.рус').requires_non_ascii(), True)
def test_display_name(): "Grammar: display-name -> word { [ whitespace ] word }" # pass atom display-name rfc run_full_mailbox_test('ABCDEFGHIJKLMNOPQRSTUVWXYZ <a@b>', EmailAddress('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'a@b')) run_full_mailbox_test('abcdefghijklmnopqrstuvwzyz <a@b>', EmailAddress('abcdefghijklmnopqrstuvwzyz', 'a@b')) run_full_mailbox_test('0123456789 <a@b>', EmailAddress('0123456789', 'a@b')) run_full_mailbox_test('!#$%&\'*+-/=?^_`{|}~ <a@b>', EmailAddress('!#$%&\'*+-/=?^_`{|}~', 'a@b')) run_full_mailbox_test('Bill <*****@*****.**>', EmailAddress('Bill', '*****@*****.**')) run_full_mailbox_test('Bill Gates <*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test(' Bill Gates <*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test(' Bill Gates <*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test('Bill Gates<*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test(' Bill Gates<*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test(' Bill<*****@*****.**>', EmailAddress('Bill', '*****@*****.**')) # pass atom display-name lax run_full_mailbox_test('ABCDEFGHIJKLMNOPQRSTUVWXYZ a@b', EmailAddress('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'a@b')) run_full_mailbox_test('abcdefghijklmnopqrstuvwzyz a@b', EmailAddress('abcdefghijklmnopqrstuvwzyz', 'a@b')) run_full_mailbox_test('0123456789 a@b', EmailAddress('0123456789', 'a@b')) run_full_mailbox_test('!#$%&\'*+-/=?^_`{|}~ a@b', EmailAddress('!#$%&\'*+-/=?^_`{|}~', 'a@b')) run_full_mailbox_test('Bill [email protected]', EmailAddress('Bill', '*****@*****.**')) run_full_mailbox_test('Bill Gates [email protected]', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test(' Bill Gates [email protected]', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test(' Bill Gates [email protected]', EmailAddress('Bill Gates', '*****@*****.**')) # fail atom display-name rfc run_full_mailbox_test('< <*****@*****.**>', None) run_full_mailbox_test('< bill <*****@*****.**>', None) run_full_mailbox_test(' < bill <*****@*****.**>', None) # fail atom display-name lax run_full_mailbox_test('< *****@*****.**', None) run_full_mailbox_test('< bill [email protected]', None) run_full_mailbox_test(' < bill @microsoft.com', None) # pass display-name quoted-string rfc run_full_mailbox_test('"{0}" <a@b>'.format(FULL_QTEXT), EmailAddress(FULL_QTEXT, 'a@b')) run_full_mailbox_test('"{0}" <a@b>'.format(FULL_QUOTED_PAIR), EmailAddress(''.join(VALID_QUOTED_PAIR), 'a@b')) run_full_mailbox_test('"<a@b>" <a@b>', EmailAddress('<a@b>', 'a@b')) run_full_mailbox_test('"Bill" <*****@*****.**>', EmailAddress('Bill', '*****@*****.**')) run_full_mailbox_test('"Bill Gates" <*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test('" Bill Gates" <*****@*****.**>', EmailAddress(' Bill Gates', '*****@*****.**')) run_full_mailbox_test('"Bill Gates " <*****@*****.**>', EmailAddress('Bill Gates ', '*****@*****.**')) run_full_mailbox_test('" Bill Gates " <*****@*****.**>', EmailAddress(' Bill Gates ', '*****@*****.**')) run_full_mailbox_test(' " Bill Gates "<*****@*****.**>', EmailAddress(' Bill Gates ', '*****@*****.**')) # fail display-name quoted-string rfc run_mailbox_test('"{0} <a@b>"'.format(FULL_QUOTED_PAIR), None) run_mailbox_test('"{0} <a@b>'.format(FULL_QTEXT), None) run_mailbox_test('{0}" <a@b>'.format(FULL_QUOTED_PAIR), None) run_mailbox_test('{0} <a@b>'.format(FULL_QUOTED_PAIR), None) run_mailbox_test(u'{0} <a@b>'.format(''.join(CONTROL_CHARS)), None) run_mailbox_test(u'"{0}" <a@b>'.format(''.join(CONTROL_CHARS)), None) for cc in CONTROL_CHARS: run_mailbox_test(u'"{0}" <a@b>'.format(cc), None) run_mailbox_test(u'{0} <a@b>'.format(cc), None) # pass display-name quoted-string lax run_full_mailbox_test('"{0}" a@b'.format(FULL_QTEXT), EmailAddress(FULL_QTEXT, 'a@b')) run_full_mailbox_test('"{0}" a@b'.format(FULL_QUOTED_PAIR), EmailAddress(''.join(VALID_QUOTED_PAIR), 'a@b')) run_full_mailbox_test('"a@b" a@b', EmailAddress('a@b', 'a@b')) run_full_mailbox_test('"Bill" [email protected]', EmailAddress('Bill', '*****@*****.**')) run_full_mailbox_test('"Bill Gates" [email protected]', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test('" Bill Gates" [email protected]', EmailAddress(' Bill Gates', '*****@*****.**')) run_full_mailbox_test('"Bill Gates " [email protected]', EmailAddress('Bill Gates ', '*****@*****.**')) run_full_mailbox_test('" Bill Gates " [email protected]', EmailAddress(' Bill Gates ', '*****@*****.**')) # fail display-name quoted-string lax run_mailbox_test('"Bill Gates"*****@*****.**', None) run_mailbox_test('"{0} a@b"'.format(FULL_QUOTED_PAIR), None) run_mailbox_test('"{0} a@b'.format(FULL_QTEXT), None) run_mailbox_test('{0}" a@b'.format(FULL_QUOTED_PAIR), None) run_mailbox_test('{0} a@b'.format(FULL_QUOTED_PAIR), None) run_mailbox_test(u'{0} a@b'.format(''.join(CONTROL_CHARS)), None) run_mailbox_test(u'"{0}" a@b'.format(''.join(CONTROL_CHARS)), None) for cc in CONTROL_CHARS: run_mailbox_test(u'{0} a@b'.format(cc), None) run_mailbox_test(u'"{0}" a@b'.format(cc), None) # pass unicode display-name sanity run_full_mailbox_test(u'Bill <*****@*****.**>', EmailAddress(u'Bill', '*****@*****.**')) run_full_mailbox_test(u'ϐill <*****@*****.**>', EmailAddress(u'ϐill', '*****@*****.**')) run_full_mailbox_test(u'ϐΙλλ <*****@*****.**>', EmailAddress(u'ϐΙλλ', '*****@*****.**')) run_full_mailbox_test(u'ϐΙλλ Γαθεσ <*****@*****.**>', EmailAddress(u'ϐΙλλ Γαθεσ', '*****@*****.**')) run_full_mailbox_test(u'BΙλλ Γαθεσ <*****@*****.**>', EmailAddress(u'BΙλλ Γαθεσ', '*****@*****.**')) run_full_mailbox_test(u'Bill Γαθεσ <*****@*****.**>', EmailAddress(u'Bill Γαθεσ', '*****@*****.**')) # fail unicode display-name, sanity run_mailbox_test('ϐΙλλ Γαθεσ <*****@*****.**>', None)
def test_display_name(): "Grammar: display-name -> word { [ whitespace ] word }" # pass atom display-name rfc run_full_mailbox_test('ABCDEFGHIJKLMNOPQRSTUVWXYZ <a@b>', EmailAddress('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'a@b')) run_full_mailbox_test('abcdefghijklmnopqrstuvwzyz <a@b>', EmailAddress('abcdefghijklmnopqrstuvwzyz', 'a@b')) run_full_mailbox_test('0123456789 <a@b>', EmailAddress('0123456789', 'a@b')) run_full_mailbox_test('!#$%&\'*+-/=?^_`{|}~ <a@b>', EmailAddress('!#$%&\'*+-/=?^_`{|}~', 'a@b')) run_full_mailbox_test('Bill <*****@*****.**>', EmailAddress('Bill', '*****@*****.**')) run_full_mailbox_test('Bill Gates <*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test(' Bill Gates <*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test(' Bill Gates <*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test('Bill Gates<*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test(' Bill Gates<*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test(' Bill<*****@*****.**>', EmailAddress('Bill', '*****@*****.**')) # fail atom display-name rfc run_full_mailbox_test('< <*****@*****.**>', None) run_full_mailbox_test('< bill <*****@*****.**>', None) run_full_mailbox_test(' < bill <*****@*****.**>', None) # pass display-name quoted-string rfc run_full_mailbox_test('"{0}" <a@b>'.format(FULL_QTEXT), EmailAddress(FULL_QTEXT, 'a@b')) run_full_mailbox_test('"{0}" <a@b>'.format(FULL_QUOTED_PAIR), EmailAddress(''.join(VALID_QUOTED_PAIR), 'a@b')) run_full_mailbox_test('"<a@b>" <a@b>', EmailAddress('<a@b>', 'a@b')) run_full_mailbox_test('"Bill" <*****@*****.**>', EmailAddress('Bill', '*****@*****.**')) run_full_mailbox_test('"Bill Gates" <*****@*****.**>', EmailAddress('Bill Gates', '*****@*****.**')) run_full_mailbox_test('" Bill Gates" <*****@*****.**>', EmailAddress(' Bill Gates', '*****@*****.**')) run_full_mailbox_test('"Bill Gates " <*****@*****.**>', EmailAddress('Bill Gates ', '*****@*****.**')) run_full_mailbox_test('" Bill Gates " <*****@*****.**>', EmailAddress(' Bill Gates ', '*****@*****.**')) run_full_mailbox_test(' " Bill Gates "<*****@*****.**>', EmailAddress(' Bill Gates ', '*****@*****.**')) # fail display-name quoted-string rfc run_mailbox_test('"{0} <a@b>"'.format(FULL_QUOTED_PAIR), None) run_mailbox_test('"{0} <a@b>'.format(FULL_QTEXT), None) run_mailbox_test('{0}" <a@b>'.format(FULL_QUOTED_PAIR), None) run_mailbox_test('{0} <a@b>'.format(FULL_QUOTED_PAIR), None) run_mailbox_test(u'{0} <a@b>'.format(''.join(CONTROL_CHARS)), None) run_mailbox_test(u'"{0}" <a@b>'.format(''.join(CONTROL_CHARS)), None) for cc in CONTROL_CHARS: # FIXME: In Python 3 subgroup of separator symbols is treated as # FIXME: allowed. We need to figure out why. if six.PY3 and ord(cc) in [0x1c, 0x1d, 0x1e, 0x1f]: continue run_mailbox_test(u'"{0}" <a@b>'.format(cc), None) run_mailbox_test(u'{0} <a@b>'.format(cc), None) # pass unicode display-name sanity run_full_mailbox_test(u'Bill <*****@*****.**>', EmailAddress(u'Bill', '*****@*****.**')) run_full_mailbox_test(u'ϐill <*****@*****.**>', EmailAddress(u'ϐill', '*****@*****.**')) run_full_mailbox_test(u'ϐΙλλ <*****@*****.**>', EmailAddress(u'ϐΙλλ', '*****@*****.**')) run_full_mailbox_test(u'ϐΙλλ Γαθεσ <*****@*****.**>', EmailAddress(u'ϐΙλλ Γαθεσ', '*****@*****.**')) run_full_mailbox_test(u'BΙλλ Γαθεσ <*****@*****.**>', EmailAddress(u'BΙλλ Γαθεσ', '*****@*****.**')) run_full_mailbox_test(u'Bill Γαθεσ <*****@*****.**>', EmailAddress(u'Bill Γαθεσ', '*****@*****.**')) # period in display name run_full_mailbox_test(u'Bill. Gates. <*****@*****.**>', EmailAddress(u'Bill. Gates.', '*****@*****.**')) # name addr without display name run_full_mailbox_test(u'<*****@*****.**>', EmailAddress(None, '*****@*****.**'))
def test_unicode_special_chars(): # unicode, special chars, no quotes run_full_mailbox_test(u'foo © bar <*****@*****.**>', EmailAddress(u'foo © bar', '*****@*****.**'), '=?utf-8?q?foo_=C2=A9_bar?= <*****@*****.**>') run_full_mailbox_test(u'foo œ bar <*****@*****.**>', EmailAddress(u'foo œ bar', '*****@*****.**'), '=?utf-8?q?foo_=C5=93_bar?= <*****@*****.**>') run_full_mailbox_test(u'foo – bar <*****@*****.**>', EmailAddress(u'foo – bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKAkyBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo Ǽ bar <*****@*****.**>', EmailAddress(u'foo Ǽ bar', '*****@*****.**'), '=?utf-8?q?foo_=C7=BC_bar?= <*****@*****.**>') run_full_mailbox_test(u'foo ₤ bar <*****@*****.**>', EmailAddress(u'foo ₤ bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKCpCBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo Ω bar <*****@*****.**>', EmailAddress(u'foo Ω bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKEpiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo ↵ bar <*****@*****.**>', EmailAddress(u'foo ↵ bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKGtSBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo ∑ bar <*****@*****.**>', EmailAddress(u'foo ∑ bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKIkSBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo ⏲ bar <*****@*****.**>', EmailAddress(u'foo ⏲ bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKPsiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo Ⓐ bar <*****@*****.**>', EmailAddress(u'foo Ⓐ bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKStiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo ▒ bar <*****@*****.**>', EmailAddress(u'foo ▒ bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKWkiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo ▲ bar <*****@*****.**>', EmailAddress(u'foo ▲ bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKWsiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo ⚔ bar <*****@*****.**>', EmailAddress(u'foo ⚔ bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKalCBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo ✎ bar <*****@*****.**>', EmailAddress(u'foo ✎ bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKcjiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo ⠂ bar <*****@*****.**>', EmailAddress(u'foo ⠂ bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKggiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo ⬀ bar <*****@*****.**>', EmailAddress(u'foo ⬀ bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKsgCBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'foo 💩 bar <*****@*****.**>', EmailAddress(u'foo 💩 bar', '*****@*****.**'), '=?utf-8?b?Zm9vIPCfkqkgYmFy?= <*****@*****.**>') # unicode, special chars, quotes # Note that quotes are removed from the parsed display name run_full_mailbox_test(u'"foo © bar" <*****@*****.**>', EmailAddress(u'foo © bar', u'*****@*****.**'), '=?utf-8?q?foo_=C2=A9_bar?= <*****@*****.**>') run_full_mailbox_test(u'"foo œ bar" <*****@*****.**>', EmailAddress(u'foo œ bar', u'*****@*****.**'), '=?utf-8?q?foo_=C5=93_bar?= <*****@*****.**>') run_full_mailbox_test(u'"foo – bar" <*****@*****.**>', EmailAddress(u'foo – bar', '*****@*****.**'), '=?utf-8?b?Zm9vIOKAkyBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo Ǽ bar" <*****@*****.**>', EmailAddress(u'foo Ǽ bar', u'*****@*****.**'), '=?utf-8?q?foo_=C7=BC_bar?= <*****@*****.**>') run_full_mailbox_test(u'"foo Ω bar" <*****@*****.**>', EmailAddress(u'foo Ω bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIOKEpiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo ↵ bar" <*****@*****.**>', EmailAddress(u'foo ↵ bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIOKGtSBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo ∑ bar" <*****@*****.**>', EmailAddress(u'foo ∑ bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIOKIkSBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo ⏲ bar" <*****@*****.**>', EmailAddress(u'foo ⏲ bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIOKPsiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo Ⓐ bar" <*****@*****.**>', EmailAddress(u'foo Ⓐ bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIOKStiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo ▒ bar" <*****@*****.**>', EmailAddress(u'foo ▒ bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIOKWkiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo ▲ bar" <*****@*****.**>', EmailAddress(u'foo ▲ bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIOKWsiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo ⚔ bar" <*****@*****.**>', EmailAddress(u'foo ⚔ bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIOKalCBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo ✎ bar" <*****@*****.**>', EmailAddress(u'foo ✎ bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIOKcjiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo ⠂ bar" <*****@*****.**>', EmailAddress(u'foo ⠂ bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIOKggiBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo ⬀ bar" <*****@*****.**>', EmailAddress(u'foo ⬀ bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIOKsgCBiYXI=?= <*****@*****.**>') run_full_mailbox_test(u'"foo 💩 bar" <*****@*****.**>', EmailAddress(u'foo 💩 bar', u'*****@*****.**'), '=?utf-8?b?Zm9vIPCfkqkgYmFy?= <*****@*****.**>') # unicode, language specific punctuation, just test with ! run_full_mailbox_test(u'fooǃ [email protected]', EmailAddress(u'fooǃ', u'*****@*****.**'), '=?utf-8?b?Zm9vx4M=?= <*****@*****.**>') run_full_mailbox_test(u'foo‼ [email protected]', EmailAddress(u'foo‼', u'*****@*****.**'), '=?utf-8?b?Zm9v4oC8?= <*****@*****.**>') run_full_mailbox_test(u'foo⁈ [email protected]', EmailAddress(u'foo⁈', u'*****@*****.**'), '=?utf-8?b?Zm9v4oGI?= <*****@*****.**>') run_full_mailbox_test(u'foo⁉ [email protected]', EmailAddress(u'foo⁉', u'*****@*****.**'), '=?utf-8?b?Zm9v4oGJ?= <*****@*****.**>') run_full_mailbox_test(u'foo❕ [email protected]', EmailAddress(u'foo❕', u'*****@*****.**'), '=?utf-8?b?Zm9v4p2V?= <*****@*****.**>') run_full_mailbox_test(u'foo❗ [email protected]', EmailAddress(u'foo❗', u'*****@*****.**'), '=?utf-8?b?Zm9v4p2X?= <*****@*****.**>') run_full_mailbox_test(u'foo❢ [email protected]', EmailAddress(u'foo❢', u'*****@*****.**'), '=?utf-8?b?Zm9v4p2i?= <*****@*****.**>') run_full_mailbox_test(u'foo❣ [email protected]', EmailAddress(u'foo❣', u'*****@*****.**'), '=?utf-8?b?Zm9v4p2j?= <*****@*****.**>') run_full_mailbox_test(u'fooꜝ [email protected]', EmailAddress(u'fooꜝ', u'*****@*****.**'), '=?utf-8?b?Zm9v6pyd?= <*****@*****.**>') run_full_mailbox_test(u'fooꜞ [email protected]', EmailAddress(u'fooꜞ', u'*****@*****.**'), '=?utf-8?b?Zm9v6pye?= <*****@*****.**>') run_full_mailbox_test(u'fooꜟ [email protected]', EmailAddress(u'fooꜟ', u'*****@*****.**'), '=?utf-8?b?Zm9v6pyf?= <*****@*****.**>') run_full_mailbox_test(u'foo﹗ [email protected]', EmailAddress(u'foo﹗', u'*****@*****.**'), '=?utf-8?b?Zm9v77mX?= <*****@*****.**>') run_full_mailbox_test(u'foo! [email protected]', EmailAddress(u'foo!', u'*****@*****.**'), '=?utf-8?b?Zm9v77yB?= <*****@*****.**>') run_full_mailbox_test(u'foo՜ [email protected]', EmailAddress(u'foo՜', u'*****@*****.**'), '=?utf-8?b?Zm9v1Zw=?= <*****@*****.**>') run_full_mailbox_test(u'foo߹ [email protected]', EmailAddress(u'foo߹', u'*****@*****.**'), '=?utf-8?b?Zm9v37k=?= <*****@*****.**>') run_full_mailbox_test(u'foo႟ [email protected]', EmailAddress(u'foo႟', u'*****@*****.**'), '=?utf-8?b?Zm9v4YKf?= <*****@*****.**>') run_full_mailbox_test(u'foo᥄ [email protected]', EmailAddress(u'foo᥄', u'*****@*****.**'), '=?utf-8?b?Zm9v4aWE?= <*****@*****.**>') run_full_mailbox_test(u'foo ()[]@\\ bar <*****@*****.**>', EmailAddress(u'foo ()[]@\\ bar', u'*****@*****.**'), '"foo ()[]@\\\\ bar" <*****@*****.**>')
def test_unicode_display_name(): # unicode, no quotes, display-name rfc run_full_mailbox_test(u'ö <{0}>'.format(u'*****@*****.**'), EmailAddress(u'ö', '*****@*****.**'), '=?utf-8?b?w7Y=?= <*****@*****.**>') run_full_mailbox_test(u'Föö <{0}>'.format(u'*****@*****.**'), EmailAddress(u'Föö', '*****@*****.**'), '=?utf-8?b?RsO2w7Y=?= <*****@*****.**>') run_full_mailbox_test(u'Foo ö <{0}>'.format(u'*****@*****.**'), EmailAddress(u'Foo ö', '*****@*****.**'), '=?utf-8?b?Rm9vIMO2?= <*****@*****.**>') run_full_mailbox_test(u'Foo Föö <{0}>'.format(u'*****@*****.**'), EmailAddress(u'Foo Föö', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2?= <*****@*****.**>') run_full_mailbox_test( u'Foo Föö Foo <{0}>'.format(u'*****@*****.**'), EmailAddress(u'Foo Föö Foo', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2IEZvbw==?= <*****@*****.**>') run_full_mailbox_test( u'Foo Föö Foo Föö <{0}>'.format(u'*****@*****.**'), EmailAddress(u'Foo Föö Foo Föö', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2IEZvbyBGw7bDtg==?= <*****@*****.**>') # unicode, no quotes, display-name lax run_full_mailbox_test(u'ö {0}'.format(u'*****@*****.**'), EmailAddress(u'ö', '*****@*****.**'), '=?utf-8?b?w7Y=?= <*****@*****.**>') run_full_mailbox_test(u'Föö {0}'.format(u'*****@*****.**'), EmailAddress(u'Föö', '*****@*****.**'), '=?utf-8?b?RsO2w7Y=?= <*****@*****.**>') run_full_mailbox_test(u'Foo ö {0}'.format(u'*****@*****.**'), EmailAddress(u'Foo ö', '*****@*****.**'), '=?utf-8?b?Rm9vIMO2?= <*****@*****.**>') run_full_mailbox_test(u'Foo Föö {0}'.format(u'*****@*****.**'), EmailAddress(u'Foo Föö', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2?= <*****@*****.**>') run_full_mailbox_test( u'Foo Föö Foo {0}'.format(u'*****@*****.**'), EmailAddress(u'Foo Föö Foo', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2IEZvbw==?= <*****@*****.**>') run_full_mailbox_test( u'Foo Föö Foo Föö {0}'.format(u'*****@*****.**'), EmailAddress(u'Foo Föö Foo Föö', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2IEZvbyBGw7bDtg==?= <*****@*****.**>') # unicode, quotes, display-name rfc # Note that redundant quotes are removed from the parsed address run_full_mailbox_test(u'"ö" <*****@*****.**>', EmailAddress(u'ö', '*****@*****.**'), '=?utf-8?b?w7Y=?= <*****@*****.**>') run_full_mailbox_test(u'"Föö" <*****@*****.**>', EmailAddress(u'Föö', '*****@*****.**'), '=?utf-8?b?RsO2w7Y=?= <*****@*****.**>') run_full_mailbox_test(u'"Foo ö" <*****@*****.**>', EmailAddress(u'Foo ö', '*****@*****.**'), '=?utf-8?b?Rm9vIMO2?= <*****@*****.**>') run_full_mailbox_test(u'"Foo Föö" <*****@*****.**>', EmailAddress(u'Foo Föö', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2?= <*****@*****.**>') run_full_mailbox_test( u'"Foo Föö Foo" <*****@*****.**>', EmailAddress(u'Foo Föö Foo', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2IEZvbw==?= <*****@*****.**>') run_full_mailbox_test( u'"Foo Föö Foo Föö" <*****@*****.**>', EmailAddress(u'Foo Föö Foo Föö', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2IEZvbyBGw7bDtg==?= <*****@*****.**>') # unicode, quotes, display-name lax # Note that the quotes are removed from the parsed address run_full_mailbox_test(u'"ö" [email protected]', EmailAddress(u'ö', '*****@*****.**'), '=?utf-8?b?w7Y=?= <*****@*****.**>') run_full_mailbox_test(u'"Föö" [email protected]', EmailAddress(u'Föö', '*****@*****.**'), '=?utf-8?b?RsO2w7Y=?= <*****@*****.**>') run_full_mailbox_test(u'"Foo ö" [email protected]', EmailAddress(u'Foo ö', '*****@*****.**'), '=?utf-8?b?Rm9vIMO2?= <*****@*****.**>') run_full_mailbox_test(u'"Foo Föö" [email protected]', EmailAddress(u'Foo Föö', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2?= <*****@*****.**>') run_full_mailbox_test( u'"Foo Föö Foo" [email protected]', EmailAddress(u'Foo Föö Foo', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2IEZvbw==?= <*****@*****.**>') run_full_mailbox_test( u'"Foo Föö Foo Föö" [email protected]', EmailAddress(u'Foo Föö Foo Föö', '*****@*****.**'), '=?utf-8?b?Rm9vIEbDtsO2IEZvbyBGw7bDtg==?= <*****@*****.**>') # unicode, random language sampling, see: http://www.columbia.edu/~fdc/utf8/index.html run_full_mailbox_test( u'나는 유리를 먹을 수 있어요 <*****@*****.**>', EmailAddress(u'나는 유리를 먹을 수 있어요', '*****@*****.**'), '=?utf-8?b?64KY64qUIOycoOumrOulvCDrqLnsnYQg7IiYIOyeiOyWtOyalA==?= <*****@*****.**>' ) run_full_mailbox_test( u'私はガラスを食べられます <*****@*****.**>', EmailAddress(u'私はガラスを食べられます', '*****@*****.**'), '=?utf-8?b?56eB44Gv44Ks44Op44K544KS6aOf44G544KJ44KM44G+44GZ?= <*****@*****.**>' ) run_full_mailbox_test( u'ᛖᚴ ᚷᛖᛏ ᛖᛏᛁ <*****@*****.**>', EmailAddress(u'ᛖᚴ ᚷᛖᛏ ᛖᛏᛁ', '*****@*****.**'), '=?utf-8?b?4ZuW4Zq0IOGat+GbluGbjyDhm5bhm4/hm4E=?= <*****@*****.**>') run_full_mailbox_test( u'Falsches Üben von Xylophonmusik <*****@*****.**>', EmailAddress(u'Falsches Üben von Xylophonmusik', '*****@*****.**'), '=?utf-8?q?Falsches_=C3=9Cben_von_Xylophonmusik?= <*****@*****.**>') run_full_mailbox_test( u'Съешь же ещё этих <*****@*****.**>', EmailAddress(u'Съешь же ещё этих', '*****@*****.**'), '=?utf-8?b?0KHRitC10YjRjCDQttC1INC10YnRkSDRjdGC0LjRhQ==?= <*****@*****.**>' ) run_full_mailbox_test( u'ξεσκεπάζω την <*****@*****.**>', EmailAddress(u'ξεσκεπάζω την', '*****@*****.**'), '=?utf-8?b?zr7Otc+DzrrOtc+AzqzOts+JIM+EzrfOvQ==?= <*****@*****.**>') # unicode + punctuation for i in u'''.!#$%&*+-/=?^_`{|}~''': run_full_mailbox_test( u'"ö {0}" <*****@*****.**>'.format(i), EmailAddress(u'ö {0}'.format(i), '*****@*****.**'))
@nottest def powerset(iterable): "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" s = list(iterable) return chain.from_iterable(combinations(s, r) for r in range(len(s) + 1)) @nottest def run_test(string, expected_mlist): mlist = parse_list(string) assert_equal(mlist, expected_mlist) BILL_AS = EmailAddress(None, '*****@*****.**') STEVE_AS = EmailAddress(None, '*****@*****.**') LINUS_AS = EmailAddress(None, '*****@*****.**') BILL_MBX = EmailAddress('Bill Gates', '*****@*****.**') STEVE_MBX = EmailAddress('Steve Jobs', '*****@*****.**') LINUS_MBX = EmailAddress('Linus Torvalds', '*****@*****.**') def test_sanity(): addr_string = 'Bill Gates <*****@*****.**>, Steve Jobs <*****@*****.**>; [email protected]' run_test(addr_string, [BILL_MBX, STEVE_MBX, LINUS_AS]) def test_simple_valid(): s = '''http://foo.com:8080; "Ev K." <*****@*****.**>, "Alex K" <*****@*****.**>, "Tom, S" <"tom+[a]"@s.com>'''
def test_edge_cases(): email = EmailAddress('"foo.bar@"@example.com') eq_('"foo.bar@"@example.com', email.address)
def test_contains_non_ascii(): eq_(EmailAddress(None, '*****@*****.**').contains_non_ascii(), False) eq_(EmailAddress(None, 'foo@экзампл.рус').contains_non_ascii(), True) eq_(EmailAddress(None, 'аджай@bar.com').contains_non_ascii(), True) eq_(EmailAddress(None, 'аджай@экзампл.рус').contains_non_ascii(), True)
def test_contains_domain_literal(): eq_(EmailAddress(None, '*****@*****.**').contains_domain_literal(), False) eq_(EmailAddress(None, 'foo@[1.2.3.4]').contains_domain_literal(), True)