test(email): контактный адрес, Reply-To и тестовая отправка письма
Покрытие валидации/сохранения contact_email, простановки Reply-To в письмах регистрации/приглашений/саммари при включённом и выключенном контактном адресе, и эндпоинта тестовой отправки (успех, дефолтный получатель, сбой транспорта без утечки логина/пароля).
This commit is contained in:
@@ -60,6 +60,7 @@ class _FakeEmailBackend:
|
||||
|
||||
def __init__(self, *, fail_for: set[str] | None = None, retryable: bool = True) -> None:
|
||||
self.sent: list[str] = []
|
||||
self.reply_to: list[str | None] = []
|
||||
self._fail_for = fail_for or set()
|
||||
self._retryable = retryable
|
||||
|
||||
@@ -71,10 +72,12 @@ class _FakeEmailBackend:
|
||||
body: str,
|
||||
html_body: str | None = None,
|
||||
attachments: Any = (),
|
||||
reply_to: str | None = None,
|
||||
) -> None:
|
||||
if to in self._fail_for:
|
||||
raise EmailSendError(f"сбой отправки для {to}", retryable=self._retryable)
|
||||
self.sent.append(to)
|
||||
self.reply_to.append(reply_to)
|
||||
|
||||
|
||||
class _Fixture:
|
||||
@@ -221,12 +224,19 @@ async def fx() -> AsyncGenerator[_Fixture, None]:
|
||||
await conn.commit()
|
||||
|
||||
|
||||
def _cfg(*, summary_recipients: str = "all") -> InstanceConfig:
|
||||
def _cfg(
|
||||
*,
|
||||
summary_recipients: str = "all",
|
||||
contact_email_enabled: bool = False,
|
||||
contact_email: str | None = None,
|
||||
) -> InstanceConfig:
|
||||
return InstanceConfig(
|
||||
transcriber=TranscriberConfig(),
|
||||
summarizer=SummarizerConfig(),
|
||||
chat=ChatConfig(),
|
||||
summary_recipients=cast("Any", summary_recipients),
|
||||
contact_email_enabled=contact_email_enabled,
|
||||
contact_email=contact_email,
|
||||
)
|
||||
|
||||
|
||||
@@ -291,6 +301,40 @@ async def test_notify_session_mode_owner_sends_only_to_owner(
|
||||
assert await _fetch_session_status(fx.session_id) == "notified"
|
||||
|
||||
|
||||
async def test_notify_session_sets_reply_to_when_contact_email_enabled(
|
||||
fx: _Fixture, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
"""Включённый контактный адрес инстанса — саммари-письмо несёт `Reply-To`."""
|
||||
backend = _FakeEmailBackend()
|
||||
monkeypatch.setattr(notify_module, "create_email_backend", lambda settings: backend)
|
||||
|
||||
await notify_session_async(
|
||||
_FakeTask(),
|
||||
fx.session_id,
|
||||
plugins_config=_cfg(
|
||||
summary_recipients="owner",
|
||||
contact_email_enabled=True,
|
||||
contact_email="contact@vidconf.example",
|
||||
),
|
||||
)
|
||||
|
||||
assert backend.reply_to == ["contact@vidconf.example"]
|
||||
|
||||
|
||||
async def test_notify_session_no_reply_to_when_contact_email_disabled(
|
||||
fx: _Fixture, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
"""Контактный адрес выключен (дефолт) — `Reply-To` не проставляется."""
|
||||
backend = _FakeEmailBackend()
|
||||
monkeypatch.setattr(notify_module, "create_email_backend", lambda settings: backend)
|
||||
|
||||
await notify_session_async(
|
||||
_FakeTask(), fx.session_id, plugins_config=_cfg(summary_recipients="owner")
|
||||
)
|
||||
|
||||
assert backend.reply_to == [None]
|
||||
|
||||
|
||||
async def test_notify_session_conference_override_wins_over_instance_default(
|
||||
fx: _Fixture, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
|
||||
Reference in New Issue
Block a user