| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460 |
- from redmail import EmailSender
- import base64
- from pathlib import Path
- import pytest
- from resources import get_mpl_fig, get_pil_image
- from convert import remove_extra_lines
- def to_encoded(s:str):
- return str(base64.b64encode(s.encode()), 'ascii')
- def test_with_text():
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- text="Hi, this is an email",
- attachments={'data.txt': "Some content"}
- )
- assert msg.get_content_type() == "multipart/mixed"
- text, attachment = msg.get_payload()
- assert text.get_content_type() == 'text/plain'
- assert attachment.get_content_type() == 'application/octet-stream'
- assert text.get_payload() == "Hi, this is an email\n"
- filename = attachment.get_filename()
- data = attachment.get_payload()
- assert filename == 'data.txt'
- assert to_encoded("Some content") == data.replace('\n', '')
- def test_with_html():
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- html="<h1>Hi, this is an email.</h1>",
- attachments={'data.txt': "Some content"}
- )
- assert msg.get_content_type() == "multipart/alternative"
- html, attachment = msg.get_payload()
- assert html.get_content_type() == 'text/html'
- assert attachment.get_content_type() == 'application/octet-stream'
- assert html.get_payload() == "<h1>Hi, this is an email.</h1>\n"
- filename = attachment.get_filename()
- data = attachment.get_payload()
- assert attachment.get_content_type() == 'application/octet-stream'
- assert filename == 'data.txt'
- assert to_encoded("Some content") == data.replace('\n', '')
- def test_with_text_and_html():
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- text="Hi, this is an email.",
- html="<h1>Hi, this is an email.</h1>",
- attachments={'data.txt': "Some content"}
- )
- assert msg.get_content_type() == "multipart/alternative"
- text, html, attachment = msg.get_payload()
- assert text.get_content_type() == "text/plain"
- assert html.get_content_type() == "text/html"
- assert attachment.get_content_type() == 'application/octet-stream'
- assert text.get_payload() == 'Hi, this is an email.\n'
- assert html.get_payload() == '<h1>Hi, this is an email.</h1>\n'
- filename = attachment.get_filename()
- data = attachment.get_payload()
- assert filename == 'data.txt'
- assert to_encoded("Some content") == data.replace('\n', '')
- def test_no_body():
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'data.txt': 'Some content'}
- )
- assert msg.get_content_type() == "multipart/mixed"
- assert len(msg.get_payload()) == 1
- attachment = msg.get_payload(0)
- assert attachment.get_content_type() == 'application/octet-stream'
- filename = attachment.get_filename()
- data = attachment.get_payload()
- assert filename == 'data.txt'
- assert to_encoded("Some content") == data.replace('\n', '')
- def test_dict_string():
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'data.txt': 'Some content'}
- )
- assert msg.get_content_type() == "multipart/mixed"
- attachment = msg.get_payload(0)
- filename = attachment.get_filename()
- data = attachment.get_payload()
- assert filename == 'data.txt'
- assert to_encoded("Some content") == data.replace('\n', '')
- def test_dict_bytes():
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'data.bin': bytes(10)}
- )
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == 'data.bin'
- assert base64.b64encode(bytes(10)).decode() == data.replace('\n', '')
- def test_dict_path(tmpdir):
- file = tmpdir.join("data.txt")
- file.write("Some content")
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'myfile.txt': Path(str(file))}
- )
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == 'myfile.txt'
- assert to_encoded("Some content") == data.replace('\n', '')
- def test_dict_dataframe_txt():
- pytest.importorskip("pandas")
- import pandas as pd
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'myfile.txt': pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})}
- )
- expected = str(pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']}))
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == 'myfile.txt'
- assert to_encoded(expected) == data.replace('\n', '')
- def test_dict_dataframe_csv():
- pytest.importorskip("pandas")
- import pandas as pd
- df = pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'myfile.csv': df}
- )
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == 'myfile.csv'
- assert to_encoded(df.to_csv()) == data.replace('\n', '')
- def test_dict_dataframe_html():
- pytest.importorskip("pandas")
- import pandas as pd
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'myfile.html': pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})}
- )
- expected = '<table border="1" class="dataframe">\n <thead>\n <tr style="text-align: right;">\n <th></th>\n <th>a</th>\n <th>b</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>1</th>\n <td>2</td>\n <td>2</td>\n </tr>\n <tr>\n <th>2</th>\n <td>3</td>\n <td>3</td>\n </tr>\n </tbody>\n</table>'
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload().replace('\n', '')
- assert filename == 'myfile.html'
- assert to_encoded(expected) == data
- def test_dict_dataframe_invalid():
- pytest.importorskip("pandas")
- import pandas as pd
- sender = EmailSender(host=None, port=1234)
- with pytest.raises(ValueError):
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'myfile.something': pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})}
- )
- def test_dict_dataframe_excel_no_error():
- pytest.importorskip("pandas")
- pytest.importorskip("openpyxl")
- import pandas as pd
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'myfile.xlsx': pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})}
- )
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == 'myfile.xlsx'
- # Excels are harder to verify
- def test_dict_pil_no_error():
- pil, bytes_img = get_pil_image()
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'myimg.png': pil}
- )
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == 'myimg.png'
- assert str(base64.b64encode(bytes_img), 'ascii') == data.replace('\n', '')
- def test_dict_matplotlib_no_error():
- fig, bytes_fig = get_mpl_fig()
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'myimg.png': fig}
- )
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == 'myimg.png'
- assert str(base64.b64encode(bytes_fig), 'ascii') == data.replace('\n', '')
- def test_dict_invalid():
- sender = EmailSender(host=None, port=1234)
- with pytest.raises(TypeError):
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'myimg.png': sender}
- )
- def test_dict_invalid_key():
- fig, bytes_fig = get_mpl_fig()
- sender = EmailSender(host=None, port=1234)
- with pytest.raises(TypeError):
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={sender: 'something'}
- )
- def test_dict_multiple(tmpdir):
- file1 = tmpdir.join("file_1.txt")
- file1.write("Some content 1")
- file2 = tmpdir.join("file_2.txt")
- file2.write("Some content 2")
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments={'data_1.txt': Path(file1), 'data_2.txt': Path(file2)}
- )
- assert msg.get_content_type() == "multipart/mixed"
- expected = [('data_1.txt', 'Some content 1'), ('data_2.txt', 'Some content 2')]
- for payload, expected in zip(msg.iter_attachments(), expected):
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == expected[0]
- assert to_encoded(expected[1]) == data.replace('\n', '')
- # List attachments
- # ----------------
- def test_list_path(tmpdir):
- file = tmpdir.join("data.txt")
- file.write("Some content")
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments=[Path(str(file))]
- )
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == 'data.txt'
- assert to_encoded("Some content") == data.replace('\n', '')
- def test_list_string_path(tmpdir):
- file = tmpdir.join("data.txt")
- file.write("Some content")
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments=[str(file)]
- )
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == 'data.txt'
- assert to_encoded("Some content") == data.replace('\n', '')
- def test_list_string_error():
- sender = EmailSender(host=None, port=1234)
- with pytest.raises(ValueError):
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments=['just something']
- )
- def test_list_multiple(tmpdir):
- file1 = tmpdir.join("data_1.txt")
- file1.write("Some content 1")
- file2 = tmpdir.join("data_2.txt")
- file2.write("Some content 2")
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments=[Path(str(file1)), Path(str(file2))]
- )
- assert msg.get_content_type() == "multipart/mixed"
- expected = [('data_1.txt', 'Some content 1'), ('data_2.txt', 'Some content 2')]
- for payload, expected in zip(msg.iter_attachments(), expected):
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == expected[0]
- assert to_encoded(expected[1]) == data.replace('\n', '')
- def test_list_invalid():
- sender = EmailSender(host=None, port=1234)
- with pytest.raises(TypeError):
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments=[sender]
- )
- def test_string_path(tmpdir):
- file = tmpdir.join("data.txt")
- file.write("Some content")
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments=str(file)
- )
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == 'data.txt'
- assert to_encoded("Some content") == data.replace('\n', '')
- def test_string_error():
- sender = EmailSender(host=None, port=1234)
- with pytest.raises(ValueError):
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments="just something"
- )
- def test_path(tmpdir):
- file = tmpdir.join("data.txt")
- file.write("Some content")
- sender = EmailSender(host=None, port=1234)
- msg = sender.get_message(
- sender="me@gmail.com",
- receivers="you@gmail.com",
- subject="Some news",
- attachments=Path(file)
- )
- assert msg.get_content_type() == "multipart/mixed"
- payload = msg.get_payload(0)
- filename = payload.get_filename()
- data = payload.get_payload()
- assert filename == 'data.txt'
- assert to_encoded("Some content") == data.replace('\n', '')
|