test(email): контактный адрес, Reply-To и тестовая отправка письма
Покрытие валидации/сохранения contact_email, простановки Reply-To в письмах регистрации/приглашений/саммари при включённом и выключенном контактном адресе, и эндпоинта тестовой отправки (успех, дефолтный получатель, сбой транспорта без утечки логина/пароля).
This commit is contained in:
@@ -48,6 +48,7 @@ from services.instance_settings import (
|
||||
BootstrapOverrides,
|
||||
InstanceSettingsService,
|
||||
InvalidAiLevelError,
|
||||
InvalidContactEmailError,
|
||||
InvalidEmailDomainError,
|
||||
InvalidTimezoneError,
|
||||
SettingsUpdateIn,
|
||||
@@ -69,6 +70,7 @@ _MANAGED_KEYS = (
|
||||
"display_timezone",
|
||||
"registration_team_choice",
|
||||
"registration_email_domain",
|
||||
"contact_email",
|
||||
)
|
||||
|
||||
|
||||
@@ -123,6 +125,7 @@ async def test_ensure_bootstrapped_imports_yaml_defaults(
|
||||
"display_timezone",
|
||||
"registration_team_choice",
|
||||
"registration_email_domain",
|
||||
"contact_email",
|
||||
}
|
||||
cfg = await service.get()
|
||||
assert cfg.transcriber.provider == "faster_whisper_cpu"
|
||||
@@ -132,6 +135,8 @@ async def test_ensure_bootstrapped_imports_yaml_defaults(
|
||||
assert cfg.registration_team_choice is False
|
||||
assert cfg.registration_email_domain_enabled is False
|
||||
assert cfg.registration_email_domain is None
|
||||
assert cfg.contact_email_enabled is False
|
||||
assert cfg.contact_email is None
|
||||
|
||||
|
||||
async def test_ensure_bootstrapped_is_idempotent_and_keeps_admin_edits(
|
||||
@@ -384,6 +389,68 @@ async def test_registration_email_domain_can_be_disabled_keeping_stored_domain(
|
||||
assert cfg.registration_email_domain == "acme.io"
|
||||
|
||||
|
||||
async def test_contact_email_enable_without_email_rejected(
|
||||
db_session: AsyncSession, clean_instance_settings: None
|
||||
) -> None:
|
||||
"""Включение контактного адреса без email (ни в патче, ни ранее сохранённого) → 400."""
|
||||
service = InstanceSettingsService(db_session)
|
||||
await service.ensure_bootstrapped(PLUGINS_YAML)
|
||||
|
||||
with pytest.raises(InvalidContactEmailError):
|
||||
await service.update(SettingsUpdateIn(contact_email_enabled=True))
|
||||
|
||||
cfg = await service.get()
|
||||
assert cfg.contact_email_enabled is False
|
||||
assert cfg.contact_email is None
|
||||
|
||||
|
||||
async def test_contact_email_rejects_invalid_format(
|
||||
db_session: AsyncSession, clean_instance_settings: None
|
||||
) -> None:
|
||||
service = InstanceSettingsService(db_session)
|
||||
await service.ensure_bootstrapped(PLUGINS_YAML)
|
||||
|
||||
with pytest.raises(InvalidContactEmailError):
|
||||
await service.update(SettingsUpdateIn(contact_email="not an email"))
|
||||
|
||||
cfg = await service.get()
|
||||
assert cfg.contact_email is None
|
||||
|
||||
|
||||
async def test_contact_email_normalizes_input(
|
||||
db_session: AsyncSession, clean_instance_settings: None
|
||||
) -> None:
|
||||
"""` Contact@VidConf.RU ` нормализуется в `contact@vidconf.ru` (strip, lower)."""
|
||||
service = InstanceSettingsService(db_session)
|
||||
await service.ensure_bootstrapped(PLUGINS_YAML)
|
||||
|
||||
cfg = await service.update(
|
||||
SettingsUpdateIn(contact_email_enabled=True, contact_email=" Contact@VidConf.RU ")
|
||||
)
|
||||
|
||||
assert cfg.contact_email_enabled is True
|
||||
assert cfg.contact_email == "contact@vidconf.ru"
|
||||
|
||||
reloaded = await service.get()
|
||||
assert reloaded.contact_email == "contact@vidconf.ru"
|
||||
|
||||
|
||||
async def test_contact_email_can_be_disabled_keeping_stored_email(
|
||||
db_session: AsyncSession, clean_instance_settings: None
|
||||
) -> None:
|
||||
"""Выключение контактного адреса без передачи email не требует его и не роняет валидацию."""
|
||||
service = InstanceSettingsService(db_session)
|
||||
await service.ensure_bootstrapped(PLUGINS_YAML)
|
||||
await service.update(
|
||||
SettingsUpdateIn(contact_email_enabled=True, contact_email="contact@acme.io")
|
||||
)
|
||||
|
||||
cfg = await service.update(SettingsUpdateIn(contact_email_enabled=False))
|
||||
|
||||
assert cfg.contact_email_enabled is False
|
||||
assert cfg.contact_email == "contact@acme.io"
|
||||
|
||||
|
||||
async def test_transcription_enabled_flag_toggles_both_transcriber_and_summarizer(
|
||||
db_session: AsyncSession, clean_instance_settings: None
|
||||
) -> None:
|
||||
|
||||
Reference in New Issue
Block a user