test_service.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import pytest
  2. from ontorefactor_governance.db import Database
  3. from ontorefactor_governance.service import (
  4. GovernanceError,
  5. export_jsonld,
  6. impact,
  7. list_elements,
  8. require_project,
  9. seed_challenge_cup_demo,
  10. seed_tenant_isolation,
  11. )
  12. @pytest.fixture
  13. def db():
  14. value = Database("sqlite:///:memory:")
  15. yield value
  16. value.close()
  17. def test_reference_slice_is_valid_and_idempotent(db):
  18. first = seed_tenant_isolation(db, "tenant-a")
  19. second = seed_tenant_isolation(db, "tenant-a")
  20. assert first["validation"]["valid"] is True
  21. assert second["validation"]["valid"] is True
  22. assert second["overview"]["totals"] == {
  23. "elements": 48,
  24. "assertions": 56,
  25. "pending_reviews": 0,
  26. "evidence": 2,
  27. "rules": 5,
  28. "open_issues": 0,
  29. "agent_runs": 0,
  30. }
  31. assert second["overview"]["layers"] == {"M3": 8, "M2": 24, "M1": 13, "M0": 3}
  32. def test_tenant_scope_is_enforced(db):
  33. result = seed_tenant_isolation(db, "tenant-a")
  34. with pytest.raises(GovernanceError) as error:
  35. require_project(db, "tenant-b", result["project"]["id"])
  36. assert error.value.status == 404
  37. def test_impact_and_jsonld_export(db):
  38. result = seed_tenant_isolation(db, "tenant-a")
  39. project_id = result["project"]["id"]
  40. elements = list_elements(db, "tenant-a", project_id)["items"]
  41. tenant = next(item for item in elements if item["name"] == "Tenant")
  42. affected = impact(db, "tenant-a", tenant["id"], 3)
  43. exported = export_jsonld(db, "tenant-a", project_id)
  44. assert affected["center"]["name"] == "Tenant"
  45. assert any(node["name"] == "DcpTenantTable" for node in affected["nodes"])
  46. assert exported["@id"] == result["project"]["namespace"]
  47. assert len(exported["@graph"]) == 104
  48. def test_challenge_cup_demo_is_idempotent_and_has_a_field_impact_story(db):
  49. first = seed_challenge_cup_demo(db, "demo")
  50. second = seed_challenge_cup_demo(db, "demo")
  51. assert first["validation"]["valid"] is True
  52. assert second["overview"]["demo"]["decision_code"] == "BLOCKED"
  53. assert second["overview"]["demo"]["asset_id"]
  54. assert second["overview"]["totals"]["evidence"] == 6
  55. assert second["overview"]["totals"]["rules"] == 5
  56. assert second["overview"]["totals"]["open_issues"] == 4
  57. affected = impact(db, "demo", second["overview"]["demo"]["asset_id"], 3)
  58. names = {item["name"] for item in affected["nodes"]}
  59. assert "用户画像查询 API" in names
  60. assert "短信通知任务" in names
  61. assert "IAM 数据 Owner" in names
  62. assert "手机号个人信息保护策略" in names