Files
disknext/tests/unit/models/test_user.py
于小丘 69f852a4ce
Some checks failed
Test / test (push) Failing after 1m4s
fix: align all 212 tests with current API and add CI workflows
Update integration tests to match actual endpoint responses: remove
data wrappers, use snake_case fields, correct HTTP methods (PUT→POST
for directory create), status codes (200→204 for mutations), and
request formats (params→json for 2FA). Fix root-level and unit tests
for DatabaseManager migration, model CRUD patterns, and JWT setup.
Add GitHub Actions and Gitea CI configs with ubuntu-latest + Python 3.13.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:21:40 +08:00

192 lines
4.7 KiB
Python

"""
User 模型的单元测试
"""
import pytest
from sqlalchemy.exc import IntegrityError
from sqlmodel.ext.asyncio.session import AsyncSession
from sqlmodels.user import User, UserPublic, UserStatus
from sqlmodels.group import Group
@pytest.mark.asyncio
async def test_user_create(db_session: AsyncSession):
"""测试创建用户"""
# 先创建用户组
group = Group(name="默认组")
group = await group.save(db_session)
# 创建用户
user = User(
email="testuser@test.local",
nickname="测试用户",
group_id=group.id
)
user = await user.save(db_session)
assert user.id is not None
assert user.email == "testuser@test.local"
assert user.nickname == "测试用户"
assert user.status == UserStatus.ACTIVE
assert user.storage == 0
assert user.score == 0
@pytest.mark.asyncio
async def test_user_unique_email(db_session: AsyncSession):
"""测试邮箱唯一约束"""
# 创建用户组
group = Group(name="默认组")
group = await group.save(db_session)
# 创建第一个用户
user1 = User(
email="duplicate@test.local",
group_id=group.id
)
await user1.save(db_session)
# 尝试创建同名用户
user2 = User(
email="duplicate@test.local",
group_id=group.id
)
with pytest.raises(IntegrityError):
await user2.save(db_session)
@pytest.mark.asyncio
async def test_user_to_public(db_session: AsyncSession):
"""测试 to_public() DTO 转换"""
# 创建用户组
group = Group(name="测试组")
group = await group.save(db_session)
# 创建用户
user = User(
email="publicuser@test.local",
nickname="公开用户",
storage=1024,
avatar="avatar.jpg",
group_id=group.id
)
user = await user.save(db_session)
# to_public() 需要预加载 group 关系
loaded_user = await User.get(
db_session,
User.id == user.id,
load=User.group
)
# 转换为公开 DTO
public_user = loaded_user.to_public()
assert isinstance(public_user, UserPublic)
assert public_user.id == loaded_user.id
assert public_user.email == "publicuser@test.local"
assert public_user.nickname == "公开用户"
assert public_user.storage == 1024
@pytest.mark.asyncio
async def test_user_group_relationship(db_session: AsyncSession):
"""测试用户与用户组关系"""
# 创建用户组
group = Group(name="VIP组")
group = await group.save(db_session)
# 创建用户
user = User(
email="vipuser@test.local",
group_id=group.id
)
user = await user.save(db_session)
# 加载关系
loaded_user = await User.get(
db_session,
User.id == user.id,
load=User.group
)
assert loaded_user.group.name == "VIP组"
assert loaded_user.group.id == group.id
@pytest.mark.asyncio
async def test_user_status_default(db_session: AsyncSession):
"""测试 status 默认值"""
group = Group(name="默认组")
group = await group.save(db_session)
user = User(
email="defaultuser@test.local",
group_id=group.id
)
user = await user.save(db_session)
assert user.status == UserStatus.ACTIVE
@pytest.mark.asyncio
async def test_user_storage_default(db_session: AsyncSession):
"""测试 storage 默认值"""
group = Group(name="默认组")
group = await group.save(db_session)
user = User(
email="storageuser@test.local",
group_id=group.id
)
user = await user.save(db_session)
assert user.storage == 0
@pytest.mark.asyncio
async def test_user_theme_preset(db_session: AsyncSession):
"""测试 theme_preset_id 字段默认为 None"""
group = Group(name="默认组")
group = await group.save(db_session)
user = User(
email="user1@test.local",
group_id=group.id
)
user = await user.save(db_session)
assert user.theme_preset_id is None
@pytest.mark.asyncio
async def test_user_email_optional(db_session: AsyncSession):
"""测试 email 可以为空(支持社交登录用户)"""
group = Group(name="默认组")
group = await group.save(db_session)
user = User(
nickname="社交用户",
group_id=group.id
)
user = await user.save(db_session)
assert user.id is not None
assert user.email is None
@pytest.mark.asyncio
async def test_user_phone_field(db_session: AsyncSession):
"""测试 phone 字段"""
group = Group(name="默认组")
group = await group.save(db_session)
user = User(
email="phoneuser@test.local",
phone="13800138000",
group_id=group.id
)
user = await user.save(db_session)
assert user.phone == "13800138000"