Newer
Older
gnexus-tasks / backend / tests / test_settings.py
"""Тесты глобальных настроек: валюта, язык 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