106 lines
3.5 KiB
Python
106 lines
3.5 KiB
Python
import os
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
_tmp_data = Path(tempfile.mkdtemp(prefix="odysseus-email-smtp-test-"))
|
|
os.environ.setdefault("DATA_DIR", str(_tmp_data))
|
|
os.environ.setdefault("DATABASE_URL", f"sqlite:///{_tmp_data / 'app.db'}")
|
|
|
|
from routes.email_helpers import _send_smtp_message
|
|
|
|
|
|
class _FakeSMTP:
|
|
calls = []
|
|
|
|
def __init__(self, host, port, timeout=None):
|
|
self.host = host
|
|
self.port = port
|
|
self.timeout = timeout
|
|
self.starttls_called = False
|
|
_FakeSMTP.calls.append(("connect", self.__class__.__name__, host, port))
|
|
|
|
def __enter__(self):
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc, tb):
|
|
return False
|
|
|
|
def starttls(self):
|
|
self.starttls_called = True
|
|
_FakeSMTP.calls.append(("starttls", self.host, self.port))
|
|
|
|
def login(self, user, password):
|
|
_FakeSMTP.calls.append(("login", user, password))
|
|
|
|
def sendmail(self, from_addr, recipients, message):
|
|
_FakeSMTP.calls.append(("sendmail", from_addr, tuple(recipients), message, self.starttls_called))
|
|
|
|
|
|
class _FakeSMTPSSL(_FakeSMTP):
|
|
pass
|
|
|
|
|
|
def _cfg(security, port=2525):
|
|
return {
|
|
"smtp_host": "smtp.local",
|
|
"smtp_port": port,
|
|
"smtp_security": security,
|
|
"smtp_user": "user",
|
|
"smtp_password": "pw",
|
|
}
|
|
|
|
|
|
def test_send_smtp_message_supports_plain_smtp(monkeypatch):
|
|
import routes.email_helpers as helpers
|
|
|
|
_FakeSMTP.calls = []
|
|
monkeypatch.setattr(helpers.smtplib, "SMTP", _FakeSMTP)
|
|
monkeypatch.setattr(helpers.smtplib, "SMTP_SSL", _FakeSMTPSSL)
|
|
|
|
_send_smtp_message(_cfg("none"), "from@example.com", ["to@example.com"], "hello")
|
|
|
|
assert _FakeSMTP.calls[0] == ("connect", "_FakeSMTP", "smtp.local", 2525)
|
|
assert not any(call[0] == "starttls" for call in _FakeSMTP.calls)
|
|
assert _FakeSMTP.calls[-1] == ("sendmail", "from@example.com", ("to@example.com",), "hello", False)
|
|
|
|
|
|
def test_send_smtp_message_supports_explicit_starttls(monkeypatch):
|
|
import routes.email_helpers as helpers
|
|
|
|
_FakeSMTP.calls = []
|
|
monkeypatch.setattr(helpers.smtplib, "SMTP", _FakeSMTP)
|
|
monkeypatch.setattr(helpers.smtplib, "SMTP_SSL", _FakeSMTPSSL)
|
|
|
|
_send_smtp_message(_cfg("starttls", port=2525), "from@example.com", ["to@example.com"], "hello")
|
|
|
|
assert _FakeSMTP.calls[0] == ("connect", "_FakeSMTP", "smtp.local", 2525)
|
|
assert ("starttls", "smtp.local", 2525) in _FakeSMTP.calls
|
|
assert _FakeSMTP.calls[-1] == ("sendmail", "from@example.com", ("to@example.com",), "hello", True)
|
|
|
|
|
|
def test_send_smtp_message_defaults_587_to_starttls(monkeypatch):
|
|
import routes.email_helpers as helpers
|
|
|
|
_FakeSMTP.calls = []
|
|
monkeypatch.setattr(helpers.smtplib, "SMTP", _FakeSMTP)
|
|
monkeypatch.setattr(helpers.smtplib, "SMTP_SSL", _FakeSMTPSSL)
|
|
|
|
cfg = _cfg("", port=587)
|
|
_send_smtp_message(cfg, "from@example.com", ["to@example.com"], "hello")
|
|
|
|
assert _FakeSMTP.calls[0] == ("connect", "_FakeSMTP", "smtp.local", 587)
|
|
assert ("starttls", "smtp.local", 587) in _FakeSMTP.calls
|
|
|
|
|
|
def test_send_smtp_message_uses_ssl_when_configured(monkeypatch):
|
|
import routes.email_helpers as helpers
|
|
|
|
_FakeSMTP.calls = []
|
|
monkeypatch.setattr(helpers.smtplib, "SMTP", _FakeSMTP)
|
|
monkeypatch.setattr(helpers.smtplib, "SMTP_SSL", _FakeSMTPSSL)
|
|
|
|
_send_smtp_message(_cfg("ssl", port=465), "from@example.com", ["to@example.com"], "hello")
|
|
|
|
assert _FakeSMTP.calls[0] == ("connect", "_FakeSMTPSSL", "smtp.local", 465)
|
|
assert not any(call[0] == "starttls" for call in _FakeSMTP.calls)
|