test_governance_audit_frontend_contract.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from pathlib import Path
  2. ROOT = Path(__file__).resolve().parents[2]
  3. def test_audit_workbench_exposes_security_coverage_events_and_seals():
  4. view = (
  5. ROOT / "frontend/src/views/systemManage/governanceAudit/index.vue"
  6. ).read_text(encoding="utf-8")
  7. api = (
  8. ROOT / "frontend/src/api/governanceAudit.js"
  9. ).read_text(encoding="utf-8")
  10. routes = (
  11. ROOT / "frontend/src/router/routes.js"
  12. ).read_text(encoding="utf-8")
  13. for text in (
  14. "审计与运行证据",
  15. "安全检查",
  16. "关键操作覆盖",
  17. "审计事件",
  18. "证据封存",
  19. "独立封存密钥已配置",
  20. "签名封存用于检测篡改,不等于阻止数据库管理员修改",
  21. ):
  22. assert text in view
  23. for path in (
  24. "/system/governance-audit/security-checks",
  25. "/system/governance-audit/coverage",
  26. "/system/governance-audit/events",
  27. "/system/governance-audit/seals",
  28. "/verify",
  29. ):
  30. assert path in api
  31. assert "systemManage/governanceAudit" in routes
  32. assert "governance-audit:read" in routes
  33. assert "governance-audit:seal" in routes
  34. def test_audit_workbench_never_requests_or_renders_unsafe_columns():
  35. view = (
  36. ROOT / "frontend/src/views/systemManage/governanceAudit/index.vue"
  37. ).read_text(encoding="utf-8")
  38. model = (
  39. ROOT
  40. / "frontend/src/views/systemManage/governanceAudit/"
  41. "governanceAuditModel.js"
  42. ).read_text(encoding="utf-8")
  43. combined = view + model
  44. for forbidden in (
  45. "ip_address",
  46. "user_agent",
  47. "raw_question",
  48. "remediation_note",
  49. "evidence_payload",
  50. "source_config",
  51. "encrypted_payload",
  52. ):
  53. assert forbidden not in combined