fix(backend): resolve timezone mismatch in accept_tos causing database error (#13155)

This commit is contained in:
Hiep Le
2026-03-03 17:08:11 +07:00
committed by GitHub
parent a7a4eb2664
commit 2d057bb7b4
2 changed files with 49 additions and 1 deletions

View File

@@ -610,7 +610,7 @@ async def accept_tos(request: Request):
redirect_url = body.get('redirect_url', str(request.base_url))
# Update user settings with TOS acceptance
accepted_tos: datetime = datetime.now(timezone.utc)
accepted_tos: datetime = datetime.now(timezone.utc).replace(tzinfo=None)
async with a_session_maker() as session:
result = await session.execute(
select(User).where(User.id == uuid.UUID(user_id))

View File

@@ -11,6 +11,7 @@ from server.auth.auth_error import AuthError
from server.auth.saas_user_auth import SaasUserAuth
from server.routes.auth import (
_extract_recaptcha_state,
accept_tos,
authenticate,
keycloak_callback,
keycloak_offline_callback,
@@ -1996,3 +1997,50 @@ async def test_keycloak_callback_calls_backfill_user_email_for_existing_user(
mock_user_store.backfill_user_email.assert_called_once_with(
'test_user_id', user_info
)
@pytest.mark.asyncio
async def test_accept_tos_stores_timezone_naive_datetime(mock_request):
"""Test that accept_tos stores a timezone-naive datetime for database compatibility."""
# Arrange
test_user_id = '12345678-1234-5678-1234-567812345678'
mock_user = MagicMock()
mock_user.id = test_user_id
mock_result = MagicMock()
mock_result.scalar_one_or_none.return_value = mock_user
mock_session = AsyncMock()
mock_session.execute.return_value = mock_result
mock_session.commit = AsyncMock()
mock_session_context = AsyncMock()
mock_session_context.__aenter__.return_value = mock_session
mock_session_context.__aexit__.return_value = None
mock_user_auth = MagicMock(spec=SaasUserAuth)
mock_user_auth.get_access_token = AsyncMock(
return_value=SecretStr('test_access_token')
)
mock_user_auth.refresh_token = SecretStr('test_refresh_token')
mock_user_auth.get_user_id = AsyncMock(return_value=test_user_id)
mock_request.json = AsyncMock(return_value={'redirect_url': 'http://example.com'})
with (
patch(
'server.routes.auth.get_user_auth', AsyncMock(return_value=mock_user_auth)
),
patch('server.routes.auth.a_session_maker', return_value=mock_session_context),
patch('server.routes.auth.set_response_cookie'),
):
# Act
result = await accept_tos(mock_request)
# Assert
assert isinstance(result, JSONResponse)
assert result.status_code == status.HTTP_200_OK
# The datetime assigned to user.accepted_tos must be timezone-naive
# (compatible with TIMESTAMP WITHOUT TIME ZONE database column)
assert mock_user.accepted_tos.tzinfo is None