fix: persist account language changes
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user