清理全局角色残留并修复项目权限判断

This commit is contained in:
Cheng Zhou
2026-05-29 10:20:42 +08:00
parent 63457aab11
commit 44d69c2d7b
63 changed files with 739 additions and 443 deletions
@@ -49,8 +49,8 @@ async def test_material_equipment_operations_are_grouped_under_materials_module(
@pytest.mark.asyncio
async def test_materials_module_only_contains_drug_flow_and_equipment_sections():
"""测试物资管理模块只包含药品流向管理和设备管理"""
async def test_materials_module_only_contains_drug_flow_attachments_and_equipment_sections():
"""测试物资管理模块只包含药品流向、药品流向附件和设备管理"""
data = await list_api_operations()
operations = data["operations"]
@@ -60,7 +60,7 @@ async def test_materials_module_only_contains_drug_flow_and_equipment_sections()
if op["module"] == "materials"
}
assert material_prefixes == {"drug_shipments", "material_equipments"}
assert material_prefixes == {"drug_shipments", "drug_shipments_attachments", "material_equipments"}
@pytest.mark.asyncio
@@ -90,6 +90,29 @@ def test_dashboard_summary_uses_project_overview_permission():
assert 'require_api_permission("dashboard:read")' not in source
def test_project_overview_dashboard_endpoints_require_project_overview_permission():
"""项目总览聚合接口应统一使用 project_overview:read,而不是仅要求项目成员。"""
source = Path(__file__).parents[1].joinpath("app/api/v1/dashboard.py").read_text()
progress_chunk = source[source.index("async def get_progress") : source.index("@router.get", source.index("async def get_progress"))]
lost_visits_chunk = source[source.index("async def list_lost_visits") : source.index("@router.get", source.index("async def list_lost_visits"))]
center_summary_chunk = source[source.index("async def get_center_summary") :]
assert 'require_api_permission("project_overview:read")' in progress_chunk
assert 'require_api_permission("project_overview:read")' in lost_visits_chunk
assert 'require_api_permission("project_overview:read")' in center_summary_chunk
assert "require_study_member()" not in progress_chunk
assert "require_study_member()" not in lost_visits_chunk
def test_finance_summary_requires_contract_fee_read_permission():
"""项目首页财务汇总应使用费用读取权限,避免绕过费用模块权限。"""
source = Path(__file__).parents[1].joinpath("app/api/v1/finance_dashboard.py").read_text()
summary_chunk = source[source.index("async def finance_summary") :]
assert 'require_api_permission("fees_contracts:read")' in summary_chunk
assert "require_study_member()" not in summary_chunk
@pytest.mark.asyncio
async def test_list_operation_prerequisites_endpoint():
"""测试获取所有操作的前置权限依赖"""