feat(phase6): 测试补全 + 集成测试 + repository 落地示范

- tests/unit/modules/test_repository.py:base_repository 在 SQLite 内存库的 CRUD 测试
- tests/integration/api/test_smoke.py:登录链路 / 只读接口 / 未授权拦截(标记 integration,默认跳过)
- conftest 提供 sqlite_db(隔离 DB)与 app/client/admin_headers(集成)fixture
- pytest.ini 默认跳过 integration,Makefile test-integration 可显式运行
- 修复 base_repository.get_by_id/get_by_ids 对字符串 ID 的兼容(URL 路径参数)
- 示范 modules/system/level service 改用 level_repo,CRUD 全链路实测通过

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Claude
2026-08-07 10:21:41 +08:00
co-authored by Claude
parent 63bebedf05
commit 13853daa4a
10 changed files with 174 additions and 27 deletions
+11 -22
View File
@@ -53,6 +53,7 @@ from sqlalchemy import and_
from shared.constants import PAGE_SIZE
from modules.system.level.schemas import LevelForm, LevelStatusForm
from modules.system.level.models import Level
from modules.system.level.repository import level_repo
from modules.upload import service as upload
from config import FASTAPI_TEMP_PATH, FASTAPI_UPLOAD_DIR, FASTAPI_IMAGE_URL
from core.database import get_db_session
@@ -66,13 +67,12 @@ from utils.request import like_contains
# 查询职级分页数据
def get_level_page(request):
db = get_db_session()
# 页码
page = int(request.query_params.get("pageNo", 1))
# 每页数
limit = int(request.query_params.get("pageSize", PAGE_SIZE))
# 查询数据
query = db.query(Level).filter(Level.is_delete == 0)
query = level_repo.filter(Level.is_delete == 0)
# 职级名称
name = request.query_params.get('name')
if name:
@@ -105,9 +105,8 @@ def get_level_page(request):
# 根据ID查询职级详情
def get_level_detail(level_id):
db = get_db_session()
# 根据ID查询职级
level = db.query(Level).filter(and_(Level.id == level_id, Level.is_delete == 0)).first()
level = level_repo.get_by_id(level_id)
# 查询结果为空判断
if not level:
return None
@@ -118,15 +117,11 @@ def get_level_detail(level_id):
# 添加职级
def add_level(request, data: LevelForm):
db = get_db_session()
# 唯一性校验
if db.query(Level).filter(and_(Level.name == data.name, Level.is_delete == 0)).first():
if level_repo.filter(Level.name == data.name, Level.is_delete == 0).first():
return R.failed("职级名称不能重复")
# 表单数据赋值给对象
level = Level(**data.model_dump(exclude={'id'}))
level.create_user = get_user_id(request)
# 插入数据
level.save()
# 表单数据赋值给对象并插入
level_repo.create(**data.model_dump(exclude={'id'}), create_user=get_user_id(request))
# 返回结果
return R.ok(msg="添加成功")
@@ -134,24 +129,21 @@ def add_level(request, data: LevelForm):
# 更新职级
def update_level(request, data: LevelForm):
db = get_db_session()
# 记录ID判空
if not data.id or data.id <= 0:
return R.failed("记录ID不能为空")
# 唯一性校验(排除自身)
if db.query(Level).filter(and_(Level.name == data.name, Level.id != data.id, Level.is_delete == 0)).first():
if level_repo.filter(Level.name == data.name, Level.id != data.id, Level.is_delete == 0).first():
return R.failed("职级名称不能重复")
# 根据ID查询记录
level = db.query(Level).filter(and_(Level.id == data.id, Level.is_delete == 0)).first()
# 查询结果判空
if not level:
if not level_repo.get_by_id(data.id):
return R.failed("记录不存在")
# 构造更新数据(排除 id)
updData = data.model_dump(exclude={'id'})
updData['update_user'] = get_user_id(request)
updData['update_time'] = datetime.now(tz=timezone.utc)
result = db.query(Level).filter_by(id=data.id).update(updData)
result = level_repo.update(data.id, updData)
# 提交数据
if not result:
return R.failed("更新失败")
@@ -164,15 +156,12 @@ def delete_level(level_id):
# 设置状态
def update_level_status(request, data: LevelStatusForm):
db = get_db_session()
# 根据ID查询记录
level = db.query(Level).filter(and_(Level.id == data.id, Level.is_delete == 0)).first()
# 查询结果判空
if not level:
if not level_repo.get_by_id(data.id):
return R.failed("记录不存在")
# 更新记录
result = db.query(Level).filter_by(id=data.id).update({
result = level_repo.update(data.id, {
"status": data.status,
"update_user": get_user_id(request),
"update_time": datetime.now(tz=timezone.utc)