fix: persist account language changes

This commit is contained in:
3252a8
2026-05-28 22:07:43 +03:00
parent e998b9ddd1
commit bea62d75a9
2 changed files with 73 additions and 0 deletions
+1
View File
@@ -482,6 +482,7 @@ async def account_avatar_route(request: web.Request) -> web.Response:
async def account_language_route(request: web.Request) -> web.Response:
user_id = _require_user_id(request)
settings: Settings = request.app["settings"]
payload = await _read_json(request)
language_payload, validation_error = _validate_model_payload(WebAppLanguagePayload, payload)
if validation_error:
+72
View File
@@ -0,0 +1,72 @@
import json
from types import SimpleNamespace
from unittest import IsolatedAsyncioTestCase
from unittest.mock import AsyncMock, Mock, patch
import bot.app.web.subscription_webapp # noqa: F401
from bot.app.web.webapp import account as account_module
class _JsonRequest(SimpleNamespace):
async def json(self):
return self.payload
class _SessionFactory:
def __init__(self, session):
self.session = session
def __call__(self):
return self
async def __aenter__(self):
return self.session
async def __aexit__(self, exc_type, exc, tb):
return False
class WebAppAccountLanguageTests(IsolatedAsyncioTestCase):
async def test_account_language_route_updates_language_and_invalidates_cache(self):
settings = SimpleNamespace()
session = SimpleNamespace(
flush=AsyncMock(),
commit=AsyncMock(),
rollback=AsyncMock(),
)
user = SimpleNamespace(user_id=42, language_code="ru", is_banned=False)
i18n = SimpleNamespace(
locales_data={"ru": {}, "en": {}},
reload_overrides_from_file=Mock(),
)
request = _JsonRequest(
app={
"settings": settings,
"async_session_factory": _SessionFactory(session),
"i18n": i18n,
},
payload={"language": "en"},
)
with (
patch.object(account_module, "_require_user_id", return_value=42),
patch.object(
account_module.user_dal,
"get_user_by_id",
AsyncMock(return_value=user),
),
patch.object(
account_module,
"_invalidate_webapp_user_caches",
AsyncMock(),
) as invalidate_cache,
):
response = await account_module.account_language_route(request)
self.assertEqual(response.status, 200)
self.assertEqual(json.loads(response.text), {"ok": True, "language": "en"})
self.assertEqual(user.language_code, "en")
i18n.reload_overrides_from_file.assert_called_once_with()
session.flush.assert_awaited_once()
session.commit.assert_awaited_once()
invalidate_cache.assert_awaited_once_with(settings, 42)