test_ontology_change_sets.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from __future__ import annotations
  2. import pytest
  3. def suggestions():
  4. from app.core.data_research.ontology.suggestions import Suggestion
  5. return [
  6. Suggestion("s-1", "class", {"uid": "customer", "name": "Customer"}, ("domain-1",), 0.95, "rule"),
  7. Suggestion("s-2", "property", {"uid": "name", "name": "name", "class_uid": "customer"}, ("element-1",), 0.9, "rule"),
  8. ]
  9. def test_partial_decisions_apply_only_accepted_or_edited_changes():
  10. from app.core.data_research.ontology.change_sets import ChangeSetService
  11. service = ChangeSetService(uid_factory=lambda: "change-set-1")
  12. change_set = service.create("ontology-1", suggestions(), actor_uid="editor-1")
  13. decided = service.decide(
  14. change_set,
  15. [{"suggestion_uid": "s-1", "decision": "accept", "reason": "符合业务定义"}],
  16. actor_uid="reviewer-1",
  17. )
  18. graph = service.apply({"classes": [], "properties": []}, decided)
  19. assert graph["classes"][0]["uid"] == "customer"
  20. assert graph["properties"] == [] # undecided suggestions never apply
  21. assert decided.decisions[0].actor_uid == "reviewer-1"
  22. assert decided.decisions[0].reason == "符合业务定义"
  23. def test_edit_reject_and_conflict_detection_are_audited():
  24. from app.core.data_research.ontology.change_sets import ChangeSetConflict, ChangeSetService
  25. service = ChangeSetService(uid_factory=lambda: "change-set-1")
  26. change_set = service.create("ontology-1", suggestions(), actor_uid="editor-1")
  27. decided = service.decide(
  28. change_set,
  29. [
  30. {"suggestion_uid": "s-1", "decision": "edit", "payload": {"uid": "customer", "name": "Customer360"}, "reason": "统一命名"},
  31. {"suggestion_uid": "s-2", "decision": "reject", "reason": "定义不充分"},
  32. ],
  33. actor_uid="reviewer-1",
  34. )
  35. assert service.apply({"classes": [], "properties": []}, decided)["classes"][0]["name"] == "Customer360"
  36. duplicate = suggestions() + [replace_suggestion(suggestions()[0], uid="s-3")]
  37. with pytest.raises(ChangeSetConflict, match="target"):
  38. service.create("ontology-1", duplicate, actor_uid="editor-1")
  39. def replace_suggestion(value, *, uid):
  40. from dataclasses import replace
  41. return replace(value, uid=uid, payload={**value.payload, "name": "Conflicting"})