"""Тесты глобальных настроек: валюта, язык UI и тихие часы напоминаний."""
from fastapi.testclient import TestClient
def test_default_settings(client: TestClient) -> None:
# по умолчанию UAH, язык не переопределён (следует SSO locale),
# тихие часы не заданы (0.89)
assert client.get("/api/settings").json() == {
"currency": "UAH",
"language": "",
"quiet_hours": "",
}
def test_update_currency_and_language(client: TestClient) -> None:
body = client.put("/api/settings", json={"currency": "EUR", "language": "en"}).json()
assert body == {"currency": "EUR", "language": "en", "quiet_hours": ""}
assert client.get("/api/settings").json() == body
def test_partial_put_keeps_other_fields(client: TestClient) -> None:
client.put("/api/settings", json={"currency": "USD", "language": "uk"})
# PUT только языка не затирает валюту
body = client.put("/api/settings", json={"language": "ru"}).json()
assert body == {"currency": "USD", "language": "ru", "quiet_hours": ""}
# PUT только валюты не затирает язык
body = client.put("/api/settings", json={"currency": "GBP"}).json()
assert body == {"currency": "GBP", "language": "ru", "quiet_hours": ""}
def test_quiet_hours_round_trip(client: TestClient) -> None:
"""Окно 22:00–09:00 переживает запись и чтение: по нему молчит планировщик."""
assert client.put("/api/settings", json={"quiet_hours": "22:00-09:00"}).json() == {
"currency": "UAH",
"language": "",
"quiet_hours": "22:00-09:00",
}
assert client.get("/api/settings").json()["quiet_hours"] == "22:00-09:00"
# пустая строка — «тихих часов нет»
assert client.put("/api/settings", json={"quiet_hours": ""}).json()["quiet_hours"] == ""
def test_broken_quiet_hours_read_as_not_set(client: TestClient) -> None:
"""Битое значение в базе наружу не отдаём: планировщик его всё равно не разберёт,
а интерфейс не должен показывать окно, по которому ничего не молчит."""
from app.models import AppSetting
from tests.conftest import _test_session_factory # type: ignore[attr-defined]
session = _test_session_factory()
try:
session.add(AppSetting(user_id="1", key="quiet_hours", value="вечер-утро"))
session.commit()
finally:
session.close()
assert client.get("/api/settings").json()["quiet_hours"] == ""
def test_invalid_quiet_hours_422(client: TestClient) -> None:
assert client.put("/api/settings", json={"quiet_hours": "вечер-утро"}).status_code == 422
assert client.put("/api/settings", json={"quiet_hours": "25:00-09:00"}).status_code == 422
assert client.put("/api/settings", json={"quiet_hours": "22:00"}).status_code == 422
def test_clear_language_override(client: TestClient) -> None:
# '' сбрасывает переопределение → снова «как в аккаунте»
client.put("/api/settings", json={"language": "en"})
assert client.put("/api/settings", json={"language": ""}).json()["language"] == ""
def test_invalid_language_422(client: TestClient) -> None:
assert client.put("/api/settings", json={"language": "xx"}).status_code == 422