test_graph_projection.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from __future__ import annotations
  2. import pytest
  3. class FakeGraph:
  4. def __init__(self):
  5. self.calls = []
  6. def run(self, statement, **parameters):
  7. self.calls.append((statement, parameters))
  8. def test_published_element_projection_is_uid_based_and_idempotent():
  9. from app.core.data_research.graph_projection import DataElementGraphProjector
  10. graph = FakeGraph()
  11. projector = DataElementGraphProjector(graph)
  12. payload = {
  13. "uid": "element-1",
  14. "version": 3,
  15. "status": "published",
  16. "snapshot": {"code": "ORDER_ID", "name_zh": "订单编号"},
  17. }
  18. projector.project(payload)
  19. projector.project(payload)
  20. assert len(graph.calls) == 2
  21. assert "MERGE (element:DataElement {uid: $uid})" in graph.calls[0][0]
  22. assert graph.calls[0][1]["uid"] == "element-1"
  23. assert graph.calls[0][1]["version"] == 3
  24. def test_unpublished_element_is_never_projected():
  25. from app.core.data_research.graph_projection import DataElementGraphProjector
  26. from app.core.data_research.errors import DataElementProjectionInvalid
  27. graph = FakeGraph()
  28. with pytest.raises(DataElementProjectionInvalid, match="published"):
  29. DataElementGraphProjector(graph).project(
  30. {"uid": "element-1", "version": 2, "status": "in_review", "snapshot": {}}
  31. )
  32. assert graph.calls == []