test_impact.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from __future__ import annotations
  2. def _dependency(from_key: str, to_key: str, relation: str = "uses"):
  3. from app.core.knowledge.contracts import KnowledgeDependencyDraft
  4. return KnowledgeDependencyDraft(
  5. from_point_key=from_key,
  6. to_point_key=to_key,
  7. relation_type=relation,
  8. source="governance",
  9. )
  10. def test_impact_propagates_reverse_dependencies_and_records_path():
  11. from app.core.knowledge.impact import propagate_impact
  12. root = "DataMeta/field-1/definition"
  13. standard = "DataStandard/std-1/rules/rule-1"
  14. flow = "DataFlow/flow-1/purpose"
  15. result = propagate_impact(
  16. {root},
  17. [_dependency(standard, root, "governs"), _dependency(flow, standard)],
  18. allowed_relations={"governs", "uses"},
  19. max_hops=3,
  20. max_points=20,
  21. max_objects=20,
  22. )
  23. assert result.impacted_point_keys == frozenset({standard, flow})
  24. assert result.paths[flow] == (root, standard, flow)
  25. assert result.truncated is False
  26. def test_impact_stops_cycles_and_ignores_disallowed_relations():
  27. from app.core.knowledge.impact import propagate_impact
  28. a = "DataMeta/a/definition"
  29. b = "DataFlow/b/purpose"
  30. c = "DataStandard/c/definition"
  31. result = propagate_impact(
  32. {a},
  33. [
  34. _dependency(b, a),
  35. _dependency(a, b),
  36. _dependency(c, b, "lightrag_extracted"),
  37. ],
  38. allowed_relations={"uses"},
  39. max_hops=5,
  40. max_points=20,
  41. max_objects=20,
  42. )
  43. assert result.impacted_point_keys == frozenset({b})
  44. assert result.truncated is False
  45. def test_impact_marks_result_truncated_instead_of_publishing_partial_scope():
  46. from app.core.knowledge.impact import propagate_impact
  47. root = "DataMeta/root/definition"
  48. dependencies = [
  49. _dependency(f"DataFlow/flow-{index}/purpose", root) for index in range(3)
  50. ]
  51. result = propagate_impact(
  52. {root},
  53. dependencies,
  54. allowed_relations={"uses"},
  55. max_hops=2,
  56. max_points=1,
  57. max_objects=10,
  58. )
  59. assert result.truncated is True
  60. assert len(result.impacted_point_keys) <= 1