This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
python-emails/emails/testsuite/message/test_message.py

179 lines
4.6 KiB
Python

# coding: utf-8
from __future__ import unicode_literals, print_function
import datetime
from email.utils import parseaddr
from dateutil.parser import parse as dateutil_parse
import pytest
import emails
from emails import Message
import emails.exc
from emails.compat import to_unicode, StringIO, is_py2, is_py34_plus
from emails.utils import decode_header, MessageID
from .helpers import common_email_data
def test_message_types():
if is_py2:
bytes_types = (str, )
native_string = (unicode, )
else:
bytes_types = (bytes, )
native_string = (str, )
m = emails.Message(**common_email_data())
print(type(m.as_string()))
#assert isinstance(m.as_message().as_string(), native_string)
assert isinstance(m.as_string(), bytes_types)
def test_message_build():
# Test simple build
m = emails.Message(**common_email_data())
assert m.as_string()
# If no html or text - raises ValueError
with pytest.raises(ValueError):
emails.Message().as_string()
# Test file-like html and text
m = emails.Message(html=StringIO('X'), text=StringIO('Y'))
assert m.html == 'X'
assert m.text == 'Y'
def test_date():
# default date is "current timestamp"
m = emails.Message()
assert dateutil_parse(m.date).replace(tzinfo=None) >= datetime.datetime.utcnow() - datetime.timedelta(seconds=3)
# check date as constant
m.date = '2015-01-01'
assert m.date == '2015-01-01'
assert m.message_date == m.date # message_date is legacy
# check date as func with string result
m.date = lambda **kw: 'D'
assert m.date == 'D'
# check date as func with time result
m.date = lambda **kw: 1426339147.572459
assert 'Mar 2015' in m.date
# check date as func with datetime result
m.date = lambda **kw: datetime.datetime(2015, 1, 1)
assert m.date.startswith('Thu, 01 Jan 2015 00:00:00')
def test_after_build():
AFTER_BUILD_HEADER = 'X-After-Build'
def my_after_build(original_message, built_message):
built_message[AFTER_BUILD_HEADER] = '1'
kwargs = common_email_data()
m = emails.Message(**kwargs)
m.after_build = my_after_build
s = m.as_string()
print("type of message.as_string() is {0}".format(type(s)))
assert AFTER_BUILD_HEADER in to_unicode(s, 'utf-8')
def test_before_build():
def my_before_build(message):
message.render_data['x-before-build'] = 1
m = emails.Message(**common_email_data())
m.before_build = my_before_build
s = m.as_string()
assert m.render_data['x-before-build'] == 1
def test_sanitize_header():
for header, value in (
('subject', 'test\n'),
('headers', {'X-Header': 'test\r'}),
):
with pytest.raises(emails.exc.BadHeaderError):
print('header {0}'.format(header))
emails.Message(html='...', **{header: value}).as_message()
def test_headers_not_double_encoded():
TEXT = ''
m = Message()
m.mail_from = (TEXT, 'a@b.c')
m.mail_to = (TEXT, 'a@b.c')
m.subject = TEXT
m.html = '...'
msg = m.as_message()
assert decode_header(parseaddr(msg['From'])[0]) == TEXT
assert decode_header(parseaddr(msg['To'])[0]) == TEXT
assert decode_header(msg['Subject']) == TEXT
def test_message_addresses():
m = Message()
m.mail_from = "웃 <b@c.d>"
assert m.mail_from == ("", "b@c.d")
m.mail_from = ["", "b@c.d"]
assert m.mail_from == ("", "b@c.d")
m.mail_to = ("", "b@c.d")
assert m.mail_to == [("", "b@c.d"), ]
m.mail_to = [("", "b@c.d"), "e@f.g"]
assert m.mail_to == [("", "b@c.d"), (None, "e@f.g")]
def test_message_policy():
if is_py34_plus:
def gen_policy(**kw):
import email.policy
return email.policy.SMTP.clone(**kw)
# Generate without policy
m1 = emails.Message(**common_email_data())
m1.policy = None
# Just generate without policy
m1.as_string()
# Generate with policy
m1 = emails.Message(**common_email_data())
m1.policy = gen_policy(max_line_length=60)
# WTF: This check fails.
# assert max([len(l) for l in m1.as_string().split(b'\n')]) <= 60
# TODO: another policy checks
def test_message_id():
params = dict(html='...', mail_from='a@b.c', mail_to='d@e.f')
# Check message-id not exists by default
m = Message(**params)
assert not m.as_message()['Message-ID']
# Check message-id exists when argument specified
m = Message(message_id=MessageID(), **params)
assert m.as_message()['Message-ID']
m = Message(message_id='XXX', **params)
assert m.as_message()['Message-ID'] == 'XXX'