test_semantic_knowledge_sync.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. from __future__ import annotations
  2. class RecordingKnowledgeSync:
  3. def __init__(self):
  4. self.snapshots = []
  5. def sync(self, snapshot):
  6. self.snapshots.append(snapshot)
  7. return {
  8. "status": "canonical_active",
  9. "source_uid": snapshot.source_uid,
  10. "source_revision": snapshot.source_revision,
  11. }
  12. def test_published_semantic_asset_projects_to_canonical_knowledge_snapshot():
  13. from app.core.data_research.semantic_knowledge import (
  14. SemanticKnowledgeSyncHandler,
  15. )
  16. uid = "01900000-0000-7000-8000-000000009001"
  17. semantic = type(
  18. "SemanticService",
  19. (),
  20. {
  21. "get_published_version": lambda self, asset_uid, version: {
  22. "uid": asset_uid,
  23. "asset_kind": "business_term",
  24. "code": "TERM_MATERIAL",
  25. "name": "物料",
  26. "owner_uid": "01900000-0000-7000-8000-000000009002",
  27. "business_domain_uid": "01900000-0000-7000-8000-000000009003",
  28. "status": "published",
  29. "current_version": version,
  30. "definition": {
  31. "definition": "统一采购、库存和维修语义。",
  32. "aliases": ["备件", "物资"],
  33. },
  34. }
  35. },
  36. )()
  37. knowledge = RecordingKnowledgeSync()
  38. handler = SemanticKnowledgeSyncHandler(semantic, knowledge)
  39. result = handler.handle({"uid": uid, "asset_kind": "business_term", "version": 3})
  40. assert result["status"] == "canonical_active"
  41. snapshot = knowledge.snapshots[0]
  42. assert snapshot.source_type == "BusinessTerm"
  43. assert snapshot.source_revision == 3
  44. assert {
  45. point.content
  46. for point in snapshot.points
  47. if "/aliases/" in point.point_key
  48. } == {"备件", "物资"}
  49. def test_semantic_knowledge_handler_rejects_kind_mismatch():
  50. import pytest
  51. from app.core.data_research.semantic_knowledge import (
  52. SemanticKnowledgeSyncHandler,
  53. )
  54. semantic = type(
  55. "SemanticService",
  56. (),
  57. {
  58. "get_published_version": lambda self, _uid, version: {
  59. "uid": "01900000-0000-7000-8000-000000009011",
  60. "asset_kind": "metric",
  61. "status": "published",
  62. "current_version": version,
  63. "definition": {
  64. "definition": "完整率。",
  65. "formula": "完整数 / 总数",
  66. "unit": "%",
  67. "dimensions": [{"code": "category", "name": "分类"}],
  68. },
  69. }
  70. },
  71. )()
  72. with pytest.raises(ValueError, match="kind"):
  73. SemanticKnowledgeSyncHandler(
  74. semantic,
  75. RecordingKnowledgeSync(),
  76. ).handle(
  77. {
  78. "uid": "01900000-0000-7000-8000-000000009011",
  79. "asset_kind": "business_term",
  80. "version": 1,
  81. }
  82. )
  83. def test_standard_and_ontology_publications_use_canonical_versioned_knowledge():
  84. from app.core.data_research.semantic_knowledge import (
  85. PublishedGovernanceKnowledgeHandler,
  86. )
  87. knowledge = RecordingKnowledgeSync()
  88. handler = PublishedGovernanceKnowledgeHandler(
  89. knowledge_sync=knowledge,
  90. standard_loader=lambda uid: {
  91. "uid": uid,
  92. "standard_uid": "01900000-0000-7000-8000-000000000810",
  93. "version": 3,
  94. "status": "published",
  95. "name": "客户主数据标准",
  96. "definition": "统一客户等级",
  97. "owner": "data-team",
  98. "business_domain_uid": (
  99. "01900000-0000-7000-8000-000000000811"
  100. ),
  101. "rules": [
  102. {
  103. "uid": "customer-level",
  104. "name": "客户等级代码约束",
  105. "definition": "必须引用已发布代码值",
  106. }
  107. ],
  108. },
  109. ontology_loader=lambda uid: {
  110. "uid": "01900000-0000-7000-8000-000000000820",
  111. "version_uid": uid,
  112. "version": 2,
  113. "status": "published",
  114. "name": "客户本体",
  115. "definition": "客户跨域语义关系",
  116. "owner": "ontology-team",
  117. "business_domain_uid": (
  118. "01900000-0000-7000-8000-000000000811"
  119. ),
  120. "classes": [
  121. {
  122. "uid": "01900000-0000-7000-8000-000000000821",
  123. "name": "客户",
  124. "definition": "企业服务对象",
  125. }
  126. ],
  127. },
  128. )
  129. standard = handler.handle_standard(
  130. {"version_uid": "01900000-0000-7000-8000-000000000812"}
  131. )
  132. ontology = handler.handle_ontology(
  133. {"version_uid": "01900000-0000-7000-8000-000000000822"}
  134. )
  135. assert standard["status"] == "canonical_active"
  136. assert ontology["status"] == "canonical_active"
  137. assert knowledge.snapshots[0].source_type == "DataStandard"
  138. assert knowledge.snapshots[0].source_revision == 3
  139. assert knowledge.snapshots[1].source_type == "Ontology"
  140. assert knowledge.snapshots[1].source_revision == 2