| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- from unittest.mock import MagicMock, patch
-
- import pytest
-
- from libs.smtp import SMTPClient
-
-
- def _mail() -> dict:
- return {"to": "user@example.com", "subject": "Hi", "html": "<b>Hi</b>"}
-
-
- @patch("libs.smtp.smtplib.SMTP")
- def test_smtp_plain_success(mock_smtp_cls: MagicMock):
- mock_smtp = MagicMock()
- mock_smtp_cls.return_value = mock_smtp
-
- client = SMTPClient(server="smtp.example.com", port=25, username="", password="", _from="noreply@example.com")
- client.send(_mail())
-
- mock_smtp_cls.assert_called_once_with("smtp.example.com", 25, timeout=10)
- mock_smtp.sendmail.assert_called_once()
- mock_smtp.quit.assert_called_once()
-
-
- @patch("libs.smtp.smtplib.SMTP")
- def test_smtp_tls_opportunistic_success(mock_smtp_cls: MagicMock):
- mock_smtp = MagicMock()
- mock_smtp_cls.return_value = mock_smtp
-
- client = SMTPClient(
- server="smtp.example.com",
- port=587,
- username="user",
- password="pass",
- _from="noreply@example.com",
- use_tls=True,
- opportunistic_tls=True,
- )
- client.send(_mail())
-
- mock_smtp_cls.assert_called_once_with("smtp.example.com", 587, timeout=10)
- assert mock_smtp.ehlo.call_count == 2
- mock_smtp.starttls.assert_called_once()
- mock_smtp.login.assert_called_once_with("user", "pass")
- mock_smtp.sendmail.assert_called_once()
- mock_smtp.quit.assert_called_once()
-
-
- @patch("libs.smtp.smtplib.SMTP_SSL")
- def test_smtp_tls_ssl_branch_and_timeout(mock_smtp_ssl_cls: MagicMock):
- # Cover SMTP_SSL branch and TimeoutError handling
- mock_smtp = MagicMock()
- mock_smtp.sendmail.side_effect = TimeoutError("timeout")
- mock_smtp_ssl_cls.return_value = mock_smtp
-
- client = SMTPClient(
- server="smtp.example.com",
- port=465,
- username="",
- password="",
- _from="noreply@example.com",
- use_tls=True,
- opportunistic_tls=False,
- )
- with pytest.raises(TimeoutError):
- client.send(_mail())
- mock_smtp.quit.assert_called_once()
-
-
- @patch("libs.smtp.smtplib.SMTP")
- def test_smtp_generic_exception_propagates(mock_smtp_cls: MagicMock):
- mock_smtp = MagicMock()
- mock_smtp.sendmail.side_effect = RuntimeError("oops")
- mock_smtp_cls.return_value = mock_smtp
-
- client = SMTPClient(server="smtp.example.com", port=25, username="", password="", _from="noreply@example.com")
- with pytest.raises(RuntimeError):
- client.send(_mail())
- mock_smtp.quit.assert_called_once()
-
-
- @patch("libs.smtp.smtplib.SMTP")
- def test_smtp_smtplib_exception_in_login(mock_smtp_cls: MagicMock):
- # Ensure we hit the specific SMTPException except branch
- import smtplib
-
- mock_smtp = MagicMock()
- mock_smtp.login.side_effect = smtplib.SMTPException("login-fail")
- mock_smtp_cls.return_value = mock_smtp
-
- client = SMTPClient(
- server="smtp.example.com",
- port=25,
- username="user", # non-empty to trigger login
- password="pass",
- _from="noreply@example.com",
- )
- with pytest.raises(smtplib.SMTPException):
- client.send(_mail())
- mock_smtp.quit.assert_called_once()
|