from django.urls import reverse from django.test import override_settings from django.contrib import admin from apps.platform_ui.services import get_platform_demo_context from apps.platform_ui.models import FeishuNotifyConfig, OwnerMapping, WordTemplateMapping def test_knowledge_base_page_shows_governance_sections(client): response = client.get(reverse("platform_ui:knowledge-base")) content = response.content.decode("utf-8") assert response.status_code == 200 assert "法规规则包" in content assert "RAG 文档源" in content assert "RAG 切片" in content assert "字段 Schema" in content assert "责任人映射" in content assert "飞书通知配置" in content def test_knowledge_base_page_shows_owner_mapping_fields_and_notify_reasons(client): response = client.get(reverse("platform_ui:knowledge-base")) content = response.content.decode("utf-8") assert response.status_code == 200 assert "owner_role" in content assert "owner_name" in content assert "department" in content assert "chapter_scope" in content assert "risk_scope" in content assert "feishu_user_id" in content assert "feishu_open_id" in content assert "feishu_name" in content assert "notify_enabled" in content assert "task_completed" in content assert "task_failed" in content @override_settings(GOVERNANCE_CONFIG_PATH="") def test_get_platform_demo_context_reads_governance_yaml(tmp_path): config_path = tmp_path / "governance.yaml" config_path.write_text( """ owner_mappings: - owner_role: 临床注册负责人 owner_name: 王五 department: 临床事务部 chapter_scope: CH3-CH6 risk_scope: 高风险阻断 feishu_user_id: ou_test_owner feishu_open_id: on_test_owner feishu_name: 王五 notify_enabled: 是 feishu_configs: - config_name: Demo 完成通知 notify_reason: task_completed channel: 群机器人 message_template: 审核完成摘要 + @处理人 status: 启用 template_mappings: - template_name: 注册证导出模板 output_type: registration_word_export_report version: V1.0 placeholder_count: 12 status: 启用 field_mapping_summary: 产品名称 / 注册人 / 适用机型 """.strip(), encoding="utf-8", ) with override_settings(GOVERNANCE_CONFIG_PATH=config_path): context = get_platform_demo_context() assert context["owner_mappings"][0]["owner_name"] == "王五" assert context["feishu_configs"][0]["notify_reason"] == "task_completed" assert context["template_mappings"][0]["template_name"] == "注册证导出模板" assert context["template_mappings"][0]["field_mapping_summary"] == "产品名称 / 注册人 / 适用机型" @override_settings(GOVERNANCE_CONFIG_PATH="") def test_knowledge_base_page_shows_template_mappings_from_governance_config(client, tmp_path): config_path = tmp_path / "governance.yaml" config_path.write_text( """ template_mappings: - template_name: 风险摘要导出模板 output_type: registration_word_export_report version: V2.0 placeholder_count: 8 status: 灰度中 field_mapping_summary: 风险等级 / 产品名称 / 责任人 """.strip(), encoding="utf-8", ) with override_settings(GOVERNANCE_CONFIG_PATH=config_path): response = client.get(reverse("platform_ui:knowledge-base")) content = response.content.decode("utf-8") assert response.status_code == 200 assert "Word 模板与字段映射" in content assert "风险摘要导出模板" in content assert "风险等级 / 产品名称 / 责任人" in content def test_get_platform_demo_context_prefers_database_governance_entries(db): OwnerMapping.objects.create( owner_role="数据库负责人", owner_name="周八", department="注册事务部", chapter_scope="CH5", risk_scope="数据库覆盖", feishu_user_id="ou_db_1", feishu_open_id="on_db_1", feishu_name="周八", notify_enabled=True, is_active=True, ) FeishuNotifyConfig.objects.create( config_name="数据库通知配置", notify_reason="task_failed", channel="群机器人", message_template="异常摘要 + @处理人", status="启用", is_active=True, ) WordTemplateMapping.objects.create( template_name="数据库模板", output_type="registration_word_export_report", version="V3.0", placeholder_count=16, status="启用", field_mapping_summary="产品名称 / 规格 / 风险等级", is_active=True, ) context = get_platform_demo_context() assert context["owner_mappings"][0]["owner_name"] == "周八" assert context["feishu_configs"][0]["config_name"] == "数据库通知配置" assert context["template_mappings"][0]["template_name"] == "数据库模板" def test_governance_models_are_registered_in_admin(): assert OwnerMapping in admin.site._registry assert FeishuNotifyConfig in admin.site._registry assert WordTemplateMapping in admin.site._registry def test_knowledge_base_page_shows_governance_object_navigation_and_active_panel(client): response = client.get(reverse("platform_ui:knowledge-base"), {"view": "owner_mappings"}) content = response.content.decode("utf-8") assert response.status_code == 200 assert "治理对象导航" in content assert "法规规则包" in content assert "RAG 文档源" in content assert "Word 模板与字段映射" in content assert "责任人映射详情" in content assert "当前对象:责任人映射" in content assert "批量导入映射" in content def test_knowledge_base_page_exposes_governance_crud_entry_links(client): response = client.get(reverse("platform_ui:knowledge-base"), {"view": "template_mappings"}) content = response.content.decode("utf-8") assert response.status_code == 200 assert "上传模板" in content assert "编辑占位符映射" in content assert "预览模板" in content assert reverse("admin:platform_ui_wordtemplatemapping_changelist") in content def test_knowledge_base_page_shows_governance_action_hub_and_fixed_notify_policy(client): response = client.get(reverse("platform_ui:knowledge-base"), {"view": "feishu_configs"}) content = response.content.decode("utf-8") assert response.status_code == 200 assert "治理动作总览" in content assert "当前治理对象" in content assert "进入审核智能体" in content assert "查看资料包" in content assert "查看处理历史" in content assert "固定通知策略" in content assert "task_completed" in content assert "task_failed" in content assert reverse("audit:list") in content assert reverse("documents:list") in content