Law/tests/test_email_service.py
2026-03-01 17:31:09 +03:00

62 lines
2.6 KiB
Python

import os
import unittest
from unittest.mock import Mock, patch
os.environ.setdefault("DATABASE_URL", "sqlite+pysqlite:///:memory:")
os.environ.setdefault("REDIS_URL", "redis://localhost:6379/0")
os.environ.setdefault("S3_ENDPOINT", "http://localhost:9000")
os.environ.setdefault("S3_ACCESS_KEY", "test")
os.environ.setdefault("S3_SECRET_KEY", "test")
os.environ.setdefault("S3_BUCKET", "test")
from app.core.config import settings
from app.services.email_service import EmailDeliveryError, send_otp_email_message
class EmailServiceTests(unittest.TestCase):
def setUp(self):
self._backup = {
"EMAIL_PROVIDER": settings.EMAIL_PROVIDER,
"EMAIL_SERVICE_URL": settings.EMAIL_SERVICE_URL,
"INTERNAL_SERVICE_TOKEN": settings.INTERNAL_SERVICE_TOKEN,
"OTP_DEV_MODE": settings.OTP_DEV_MODE,
}
def tearDown(self):
for key, value in self._backup.items():
setattr(settings, key, value)
def test_dev_mode_forces_mock_send(self):
settings.EMAIL_PROVIDER = "smtp"
settings.OTP_DEV_MODE = True
payload = send_otp_email_message(email="user@example.com", code="123456", purpose="CREATE_REQUEST")
self.assertEqual(payload.get("provider"), "mock_email")
self.assertTrue(bool(payload.get("dev_mode")))
self.assertEqual(payload.get("debug_code"), "123456")
def test_service_provider_calls_internal_email_service(self):
settings.OTP_DEV_MODE = False
settings.EMAIL_PROVIDER = "service"
settings.EMAIL_SERVICE_URL = "http://email-service:8010"
settings.INTERNAL_SERVICE_TOKEN = "token"
mock_response = Mock()
mock_response.status_code = 200
mock_response.content = b'{"status":"sent"}'
mock_response.json.return_value = {"status": "sent"}
mock_client = Mock()
mock_client.__enter__ = Mock(return_value=mock_client)
mock_client.__exit__ = Mock(return_value=False)
mock_client.post.return_value = mock_response
with patch("app.services.email_service.httpx.Client", return_value=mock_client):
payload = send_otp_email_message(email="user@example.com", code="654321", purpose="VIEW_REQUEST")
self.assertEqual(payload.get("provider"), "email-service")
self.assertTrue(bool(payload.get("sent")))
def test_unknown_provider_raises(self):
settings.OTP_DEV_MODE = False
settings.EMAIL_PROVIDER = "unknown"
with self.assertRaises(EmailDeliveryError):
send_otp_email_message(email="user@example.com", code="111111", purpose="CREATE_REQUEST")