from textwrap import dedent from redmail import EmailSender import pytest from convert import remove_extra_lines, payloads_to_dict from getpass import getpass, getuser from platform import node from convert import remove_email_extra, remove_email_content_id import platform PYTHON_VERSION = platform.sys.version_info IS_PY36 = PYTHON_VERSION.major == 3 and PYTHON_VERSION.minor == 6 def test_text_message(): sender = EmailSender(host=None, port=1234) msg = sender.get_message( sender="me@example.com", receivers="you@example.com", subject="Some news", text="Hi, nice to meet you.", ) assert str(msg) == dedent(""" from: me@example.com subject: Some news to: you@example.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 Hi, nice to meet you. """)[1:] def test_html_message(): sender = EmailSender(host=None, port=1234) msg = sender.get_message( sender="me@example.com", receivers="you@example.com", subject="Some news", html="
Nice to meet you
", ) assert remove_email_content_id(str(msg)) == dedent(""" from: me@example.com subject: Some news to: you@example.com Content-Type: multipart/mixed; boundary="===============Nice to meet you
--===============nice to meet you.
", text="Hi, nice to meet you.", ) assert remove_email_content_id(str(msg)) == dedent(""" from: me@example.com subject: Some news to: you@example.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============nice to meet you.
--===============This is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.
", f"This is {getuser()} from {node()}. I'm really Me.
\n", "Hi, \nThis is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.", f"Hi, \nThis is {getuser()} from {node()}. I'm really Me.\n", None, id="With default extras" ), pytest.param( "This is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.
", f"This is overridden from {node()}. I'm really Me.
\n", "Hi {{ receiver }}, This is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.", f"Hi you, This is overridden from {node()}. I'm really Me.\n", {"user": "overridden", "receiver": "you"}, id="Custom extra" ), ] ) def test_with_jinja_params(html, text, extra, expected_html, expected_text): sender = EmailSender(host=None, port=1234) msg = sender.get_message( sender="me@gmail.com", receivers="you@gmail.com", subject="Some news", text=text, html=html, body_params=extra ) # Validate structure structure = payloads_to_dict(msg) assert structure == { 'multipart/mixed': { 'multipart/alternative': { 'text/plain': structure["multipart/mixed"]["multipart/alternative"]["text/plain"], 'text/html': structure["multipart/mixed"]["multipart/alternative"]["text/html"], } } } assert "multipart/mixed" == msg.get_content_type() alternative = msg.get_payload()[0] text_part, html_part = alternative.get_payload() text = remove_email_extra(text_part.get_payload()) html = remove_email_extra(html_part.get_payload()) assert expected_html == html assert expected_text == text @pytest.mark.parametrize("use_jinja_obj,use_jinja", [ pytest.param(None, False, id="Use arg"), pytest.param(False, None, id="Use attr"), pytest.param(True, False, id="Override"), ]) def test_without_jinja(use_jinja_obj, use_jinja): html = "This is {{ user }} from { node }. I'm really {{ sender.full_name }}.
" text = "Hi, \nThis is {{ user }} from { node }. I'm really {{ sender.full_name }}." sender = EmailSender(host=None, port=1234) sender.use_jinja = use_jinja_obj msg = sender.get_message( sender="me@example.com", receivers="you@example.com", subject="Some news", text=text, html=html, use_jinja=use_jinja, ) encoding = '7bit' if IS_PY36 else 'quoted-printable' expected = dedent(""" from: me@example.com subject: Some news to: you@example.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============This is {{ user }} from { node }. I'm really {{ sender.full_n= ame }}.
--=============== File "')
assert html.endswith(', in test_with_error\nraise RuntimeError("Deliberate failure")\n Deliberate failure: RuntimeError\n