test_ontology_dynamic_api.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from __future__ import annotations
  2. import pytest
  3. class DynamicService:
  4. def generate(self, ontology_uid, payload, actor_uid):
  5. return [{"uid": "suggestion-1", "kind": "class", "confidence": 0.95, "evidence_uids": ["domain-1"]}]
  6. def decide(self, ontology_uid, change_set_uid, decisions, actor_uid):
  7. return {"uid": change_set_uid, "ontology_uid": ontology_uid, "decisions": decisions, "actor_uid": actor_uid}
  8. class ExchangeService:
  9. def export(self, ontology_uid, format_name):
  10. assert (ontology_uid, format_name) == ("ontology-1", "json")
  11. return b'{"ontology_uid":"ontology-1"}', "application/json", "ontology-1.json"
  12. def import_document(self, content, format_name, actor_uid):
  13. return {"ontology_uid": "ontology-2", "version": 1, "format": format_name, "actor_uid": actor_uid}
  14. class SemanticService:
  15. def trace_property(self, uid, *, allowed_domains, limit, after_uid):
  16. return {"items": [{"property_uid": uid, "business_domain_uid": next(iter(allowed_domains))}], "count": 1, "truncated": False, "next_cursor": None}
  17. @pytest.fixture()
  18. def client(monkeypatch):
  19. from flask import request
  20. from app import create_app
  21. from app.api.data_development import routes
  22. from app.core.system import permissions
  23. def identity():
  24. role = request.headers.get("Authorization", "").removeprefix("Bearer ")
  25. return {"id": f"{role}-1", "roles": [role]} if role in {"viewer", "editor", "admin"} else None
  26. monkeypatch.setattr(permissions, "authenticate_request", identity)
  27. monkeypatch.setattr(routes, "get_ontology_dynamic_service", lambda: DynamicService())
  28. monkeypatch.setattr(routes, "get_ontology_exchange_service", lambda: ExchangeService())
  29. monkeypatch.setattr(routes, "get_semantic_query_service", lambda: SemanticService())
  30. app = create_app()
  31. app.config.update(TESTING=True)
  32. return app.test_client()
  33. def test_dynamic_suggestion_and_audited_decision_endpoints(client):
  34. headers = {"Authorization": "Bearer editor"}
  35. generated = client.post(
  36. "/api/development/v1/ontologies/ontology-1/suggestions",
  37. headers=headers,
  38. json={"domains": [], "data_elements": [], "foreign_keys": []},
  39. )
  40. decided = client.post(
  41. "/api/development/v1/ontologies/ontology-1/change-sets/change-1/decisions",
  42. headers=headers,
  43. json={"decisions": [{"suggestion_uid": "suggestion-1", "decision": "accept"}]},
  44. )
  45. assert generated.get_json()["data"][0]["evidence_uids"] == ["domain-1"]
  46. assert decided.get_json()["data"]["actor_uid"] == "editor-1"
  47. def test_exchange_and_read_only_semantic_query_endpoints(client):
  48. exported = client.get(
  49. "/api/development/v1/ontologies/ontology-1/export?format=json",
  50. headers={"Authorization": "Bearer viewer"},
  51. )
  52. imported = client.post(
  53. "/api/development/v1/ontologies/import?format=json",
  54. headers={"Authorization": "Bearer editor"},
  55. data=b'{"ontology_uid":"ontology-2"}',
  56. content_type="application/json",
  57. )
  58. queried = client.get(
  59. "/api/development/v1/semantic/properties/property-1?business_domain_uid=sales&limit=20",
  60. headers={"Authorization": "Bearer viewer"},
  61. )
  62. assert exported.status_code == 200 and exported.mimetype == "application/json"
  63. assert imported.status_code == 201
  64. assert queried.get_json()["data"]["items"][0]["business_domain_uid"] == "sales"