Files
eryao/backend/tests/unit/test_parse_profile_settings.py
T

138 lines
4.9 KiB
Python

from __future__ import annotations
import pytest
from schemas.shared.user import (
NotificationSettings,
PreferenceSettings,
ProfileSettingsV1,
parse_profile_settings,
)
class TestParseProfileSettings:
def test_parse_profile_settings_with_full_settings(self) -> None:
raw = {
"version": 1,
"preferences": {
"interface_language": "en-US",
"ai_language": "en-US",
"timezone": "America/New_York",
"country": "US",
},
"privacy": {"profile_visibility": "private"},
"notification": {
"allow_notifications": True,
"allow_vibration": False,
},
}
result = parse_profile_settings(raw)
assert isinstance(result, ProfileSettingsV1)
assert result.version == 1
assert isinstance(result.preferences, PreferenceSettings)
assert result.preferences.interface_language == "en-US"
assert result.preferences.ai_language == "en-US"
assert result.preferences.timezone == "America/New_York"
assert result.preferences.country == "US"
assert isinstance(result.notification, NotificationSettings)
assert result.notification.allow_notifications is True
assert result.notification.allow_vibration is False
def test_parse_profile_settings_with_empty_settings(self) -> None:
result = parse_profile_settings(None)
assert isinstance(result, ProfileSettingsV1)
assert result.version == 1
assert isinstance(result.preferences, PreferenceSettings)
assert result.preferences.interface_language == "zh-CN"
assert result.preferences.ai_language == "zh-CN"
assert result.preferences.timezone == "Asia/Shanghai"
assert result.preferences.country == "CN"
assert isinstance(result.notification, NotificationSettings)
assert result.notification.allow_notifications is True
assert result.notification.allow_vibration is True
def test_parse_profile_settings_with_partial_preferences(self) -> None:
raw = {
"preferences": {
"interface_language": "en-US",
},
}
result = parse_profile_settings(raw)
assert result.preferences.interface_language == "en-US"
assert result.preferences.ai_language == "zh-CN"
assert result.preferences.timezone == "Asia/Shanghai"
assert result.preferences.country == "CN"
def test_parse_profile_settings_with_partial_notification(self) -> None:
raw = {
"notification": {
"allow_notifications": False,
},
}
result = parse_profile_settings(raw)
assert isinstance(result.notification, NotificationSettings)
assert result.notification.allow_notifications is False
assert result.notification.allow_vibration is True
def test_parse_profile_settings_with_legacy_notification_format(self) -> None:
raw = {
"notification": {
"push_enabled": True,
},
}
result = parse_profile_settings(raw)
assert isinstance(result.notification, NotificationSettings)
assert result.notification.allow_notifications is True
assert result.notification.allow_vibration is True
def test_parse_profile_settings_invalid_language_uses_default(self) -> None:
raw = {
"preferences": {
"interface_language": "invalid-language",
},
}
with pytest.raises(ValueError, match="language must be a valid BCP-47 tag"):
parse_profile_settings(raw)
def test_parse_profile_settings_invalid_timezone_uses_default(self) -> None:
raw = {
"preferences": {
"timezone": "Invalid/Timezone",
},
}
with pytest.raises(ValueError, match="timezone must be a valid IANA timezone"):
parse_profile_settings(raw)
def test_parse_profile_settings_country_normalized_to_uppercase(self) -> None:
raw = {
"preferences": {
"country": "us",
},
}
result = parse_profile_settings(raw)
assert result.preferences.country == "US"
def test_profile_settings_v1_model_dump(self) -> None:
settings = ProfileSettingsV1(
preferences=PreferenceSettings(
interface_language="en-US",
ai_language="en-US",
timezone="UTC",
country="US",
),
notification=NotificationSettings(
allow_notifications=True,
allow_vibration=False,
),
)
dumped = settings.model_dump(mode="json")
assert dumped["preferences"]["interface_language"] == "en-US"
assert dumped["notification"]["allow_notifications"] is True
assert dumped["notification"]["allow_vibration"] is False