mirror of
https://github.com/cnlimiter/codex-register.git
synced 2026-05-06 20:02:51 +08:00
147 lines
5.2 KiB
Python
147 lines
5.2 KiB
Python
import asyncio
|
|
from contextlib import contextmanager
|
|
from pathlib import Path
|
|
|
|
from src.config.constants import EmailServiceType
|
|
from src.database.models import Base, EmailService
|
|
from src.database.session import DatabaseSessionManager
|
|
from src.services.base import EmailServiceFactory
|
|
from src.web.routes import email as email_routes
|
|
from src.web.routes import registration as registration_routes
|
|
|
|
|
|
class DummySettings:
|
|
custom_domain_base_url = ""
|
|
custom_domain_api_key = None
|
|
tempmail_base_url = "https://api.tempmail.lol/v2"
|
|
tempmail_timeout = 30
|
|
tempmail_max_retries = 3
|
|
|
|
|
|
def test_cloud_mail_service_registered():
|
|
service_type = EmailServiceType("cloud_mail")
|
|
service_class = EmailServiceFactory.get_service_class(service_type)
|
|
assert service_class is not None
|
|
assert service_class.__name__ == "CloudMailService"
|
|
|
|
|
|
def test_email_service_types_include_cloud_mail():
|
|
result = asyncio.run(email_routes.get_service_types())
|
|
cloud_mail_type = next(item for item in result["types"] if item["value"] == "cloud_mail")
|
|
|
|
assert cloud_mail_type["label"] == "Cloud Mail"
|
|
field_names = [field["name"] for field in cloud_mail_type["config_fields"]]
|
|
assert "base_url" in field_names
|
|
assert "admin_email" in field_names
|
|
assert "admin_password" in field_names
|
|
assert "default_domain" in field_names
|
|
|
|
|
|
def test_filter_sensitive_config_marks_cloud_mail_admin_password():
|
|
filtered = email_routes.filter_sensitive_config({
|
|
"base_url": "https://mail.example.com",
|
|
"admin_email": "admin@example.com",
|
|
"admin_password": "admin-secret",
|
|
"default_domain": "mail.example.com",
|
|
})
|
|
|
|
assert filtered["base_url"] == "https://mail.example.com"
|
|
assert filtered["admin_email"] == "admin@example.com"
|
|
assert filtered["default_domain"] == "mail.example.com"
|
|
assert filtered["has_admin_password"] is True
|
|
assert "admin_password" not in filtered
|
|
|
|
|
|
def test_registration_available_services_include_cloud_mail(monkeypatch):
|
|
runtime_dir = Path("tests_runtime")
|
|
runtime_dir.mkdir(exist_ok=True)
|
|
db_path = runtime_dir / "cloudmail_routes.db"
|
|
if db_path.exists():
|
|
db_path.unlink()
|
|
|
|
manager = DatabaseSessionManager(f"sqlite:///{db_path}")
|
|
Base.metadata.create_all(bind=manager.engine)
|
|
|
|
with manager.session_scope() as session:
|
|
session.add(
|
|
EmailService(
|
|
service_type="cloud_mail",
|
|
name="Cloud Mail 主服务",
|
|
config={
|
|
"base_url": "https://mail.example.com",
|
|
"admin_email": "admin@example.com",
|
|
"admin_password": "admin-secret",
|
|
"default_domain": "mail.example.com",
|
|
},
|
|
enabled=True,
|
|
priority=0,
|
|
)
|
|
)
|
|
|
|
@contextmanager
|
|
def fake_get_db():
|
|
session = manager.SessionLocal()
|
|
try:
|
|
yield session
|
|
finally:
|
|
session.close()
|
|
|
|
monkeypatch.setattr(registration_routes, "get_db", fake_get_db)
|
|
|
|
import src.config.settings as settings_module
|
|
|
|
monkeypatch.setattr(settings_module, "get_settings", lambda: DummySettings())
|
|
monkeypatch.setattr(registration_routes, "get_settings", lambda: DummySettings())
|
|
|
|
result = asyncio.run(registration_routes.get_available_email_services())
|
|
|
|
assert result["cloud_mail"]["available"] is True
|
|
assert result["cloud_mail"]["count"] == 1
|
|
assert result["cloud_mail"]["services"][0]["name"] == "Cloud Mail 主服务"
|
|
assert result["cloud_mail"]["services"][0]["type"] == "cloud_mail"
|
|
assert result["cloud_mail"]["services"][0]["default_domain"] == "mail.example.com"
|
|
|
|
|
|
def test_build_email_service_candidates_supports_cloud_mail(monkeypatch):
|
|
runtime_dir = Path("tests_runtime")
|
|
runtime_dir.mkdir(exist_ok=True)
|
|
db_path = runtime_dir / "cloudmail_candidates.db"
|
|
if db_path.exists():
|
|
db_path.unlink()
|
|
|
|
manager = DatabaseSessionManager(f"sqlite:///{db_path}")
|
|
Base.metadata.create_all(bind=manager.engine)
|
|
|
|
with manager.session_scope() as session:
|
|
session.add(
|
|
EmailService(
|
|
service_type="cloud_mail",
|
|
name="Cloud Mail 主服务",
|
|
config={
|
|
"base_url": "https://mail.example.com",
|
|
"admin_email": "admin@example.com",
|
|
"admin_password": "admin-secret",
|
|
"default_domain": "mail.example.com",
|
|
},
|
|
enabled=True,
|
|
priority=0,
|
|
)
|
|
)
|
|
|
|
registration_routes.email_service_circuit_breakers.clear()
|
|
monkeypatch.setattr(registration_routes, "get_settings", lambda: DummySettings())
|
|
|
|
with manager.session_scope() as session:
|
|
candidates = registration_routes._build_email_service_candidates(
|
|
db=session,
|
|
service_type=EmailServiceType("cloud_mail"),
|
|
actual_proxy_url=None,
|
|
email_service_id=None,
|
|
email_service_config=None,
|
|
)
|
|
|
|
assert len(candidates) == 1
|
|
assert candidates[0]["service_type"] == EmailServiceType("cloud_mail")
|
|
assert candidates[0]["config"]["base_url"] == "https://mail.example.com"
|
|
assert candidates[0]["db_service"].name == "Cloud Mail 主服务"
|