Files
disknext/tests/fixtures/users.py
于小丘 6c96c43bea
Some checks failed
Test / test (push) Failing after 3m47s
refactor: 统一 sqlmodel_ext 用法至官方推荐模式
- 替换 Field(max_length=X) 为 StrX/TextX 类型别名(21 个 sqlmodels 文件)
- 替换 get + 404 检查为 get_exist_one()(17 个路由文件,约 50 处)
- 替换 save + session.refresh 为 save(load=...)
- 替换 session.add + commit 为 save()(dav/provider.py)
- 更新所有依赖至最新版本

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 11:13:16 +08:00

225 lines
6.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
用户测试数据工厂
提供创建测试用户的便捷方法。
用户密码凭证通过 AuthIdentity 管理,不再存储在 User 表中。
"""
from uuid import UUID
from sqlmodel.ext.asyncio.session import AsyncSession
from sqlmodels.auth_identity import AuthIdentity, AuthProviderType
from sqlmodels.user import User, UserStatus
from utils.password.pwd import Password
class UserFactory:
"""用户工厂类,用于创建各种类型的测试用户"""
@staticmethod
async def create(
session: AsyncSession,
group_id: UUID,
email: str | None = None,
password: str | None = None,
**kwargs,
) -> User:
"""
创建普通用户
参数:
session: 数据库会话
group_id: 用户组UUID
email: 用户邮箱(默认: test_user_{随机}@test.local
password: 明文密码(默认: password123若提供则同时创建 AuthIdentity
**kwargs: 其他用户字段
返回:
User: 创建的用户实例
"""
import uuid
if email is None:
email = f"test_user_{uuid.uuid4().hex[:8]}@test.local"
if password is None:
password = "password123"
user = User(
email=email,
nickname=kwargs.get("nickname", email),
status=kwargs.get("status", UserStatus.ACTIVE),
storage=kwargs.get("storage", 0),
score=kwargs.get("score", 100),
group_id=group_id,
avatar=kwargs.get("avatar", "default"),
group_expires=kwargs.get("group_expires"),
theme=kwargs.get("theme", "system"),
language=kwargs.get("language", "zh-CN"),
timezone=kwargs.get("timezone", 8),
previous_group_id=kwargs.get("previous_group_id"),
)
user = await user.save(session)
# 创建邮箱密码认证身份
identity = AuthIdentity(
provider=AuthProviderType.EMAIL_PASSWORD,
identifier=email,
credential=Password.hash(password),
is_primary=True,
is_verified=True,
user_id=user.id,
)
identity = await identity.save(session)
return user
@staticmethod
async def create_admin(
session: AsyncSession,
admin_group_id: UUID,
email: str | None = None,
password: str | None = None,
) -> User:
"""
创建管理员用户
参数:
session: 数据库会话
admin_group_id: 管理员组UUID
email: 用户邮箱(默认: admin_{随机}@disknext.local
password: 明文密码(默认: admin_password
返回:
User: 创建的管理员用户实例
"""
import uuid
if email is None:
email = f"admin_{uuid.uuid4().hex[:8]}@disknext.local"
if password is None:
password = "admin_password"
admin = User(
email=email,
nickname=f"管理员 {email}",
status=UserStatus.ACTIVE,
storage=0,
score=9999,
group_id=admin_group_id,
avatar="default",
)
admin = await admin.save(session)
# 创建邮箱密码认证身份
identity = AuthIdentity(
provider=AuthProviderType.EMAIL_PASSWORD,
identifier=email,
credential=Password.hash(password),
is_primary=True,
is_verified=True,
user_id=admin.id,
)
identity = await identity.save(session)
return admin
@staticmethod
async def create_banned(
session: AsyncSession,
group_id: UUID,
email: str | None = None,
) -> User:
"""
创建被封禁用户
参数:
session: 数据库会话
group_id: 用户组UUID
email: 用户邮箱(默认: banned_user_{随机}@test.local
返回:
User: 创建的被封禁用户实例
"""
import uuid
if email is None:
email = f"banned_user_{uuid.uuid4().hex[:8]}@test.local"
banned_user = User(
email=email,
nickname=f"封禁用户 {email}",
status=UserStatus.ADMIN_BANNED,
storage=0,
score=0,
group_id=group_id,
avatar="default",
)
banned_user = await banned_user.save(session)
# 创建邮箱密码认证身份
identity = AuthIdentity(
provider=AuthProviderType.EMAIL_PASSWORD,
identifier=email,
credential=Password.hash("banned_password"),
is_primary=True,
is_verified=True,
user_id=banned_user.id,
)
identity = await identity.save(session)
return banned_user
@staticmethod
async def create_with_storage(
session: AsyncSession,
group_id: UUID,
storage_bytes: int,
email: str | None = None,
) -> User:
"""
创建已使用指定存储空间的用户
参数:
session: 数据库会话
group_id: 用户组UUID
storage_bytes: 已使用的存储空间(字节)
email: 用户邮箱(默认: storage_user_{随机}@test.local
返回:
User: 创建的用户实例
"""
import uuid
if email is None:
email = f"storage_user_{uuid.uuid4().hex[:8]}@test.local"
user = User(
email=email,
nickname=email,
status=UserStatus.ACTIVE,
storage=storage_bytes,
score=100,
group_id=group_id,
avatar="default",
)
user = await user.save(session)
# 创建邮箱密码认证身份
identity = AuthIdentity(
provider=AuthProviderType.EMAIL_PASSWORD,
identifier=email,
credential=Password.hash("password123"),
is_primary=True,
is_verified=True,
user_id=user.id,
)
identity = await identity.save(session)
return user