| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- from __future__ import annotations
- class RecordingKnowledgeSync:
- def __init__(self):
- self.snapshots = []
- def sync(self, snapshot):
- self.snapshots.append(snapshot)
- return {
- "status": "canonical_active",
- "source_uid": snapshot.source_uid,
- "source_revision": snapshot.source_revision,
- }
- def test_published_semantic_asset_projects_to_canonical_knowledge_snapshot():
- from app.core.data_research.semantic_knowledge import (
- SemanticKnowledgeSyncHandler,
- )
- uid = "01900000-0000-7000-8000-000000009001"
- semantic = type(
- "SemanticService",
- (),
- {
- "get_published_version": lambda self, asset_uid, version: {
- "uid": asset_uid,
- "asset_kind": "business_term",
- "code": "TERM_MATERIAL",
- "name": "物料",
- "owner_uid": "01900000-0000-7000-8000-000000009002",
- "business_domain_uid": "01900000-0000-7000-8000-000000009003",
- "status": "published",
- "current_version": version,
- "definition": {
- "definition": "统一采购、库存和维修语义。",
- "aliases": ["备件", "物资"],
- },
- }
- },
- )()
- knowledge = RecordingKnowledgeSync()
- handler = SemanticKnowledgeSyncHandler(semantic, knowledge)
- result = handler.handle({"uid": uid, "asset_kind": "business_term", "version": 3})
- assert result["status"] == "canonical_active"
- snapshot = knowledge.snapshots[0]
- assert snapshot.source_type == "BusinessTerm"
- assert snapshot.source_revision == 3
- assert {
- point.content
- for point in snapshot.points
- if "/aliases/" in point.point_key
- } == {"备件", "物资"}
- def test_semantic_knowledge_handler_rejects_kind_mismatch():
- import pytest
- from app.core.data_research.semantic_knowledge import (
- SemanticKnowledgeSyncHandler,
- )
- semantic = type(
- "SemanticService",
- (),
- {
- "get_published_version": lambda self, _uid, version: {
- "uid": "01900000-0000-7000-8000-000000009011",
- "asset_kind": "metric",
- "status": "published",
- "current_version": version,
- "definition": {
- "definition": "完整率。",
- "formula": "完整数 / 总数",
- "unit": "%",
- "dimensions": [{"code": "category", "name": "分类"}],
- },
- }
- },
- )()
- with pytest.raises(ValueError, match="kind"):
- SemanticKnowledgeSyncHandler(
- semantic,
- RecordingKnowledgeSync(),
- ).handle(
- {
- "uid": "01900000-0000-7000-8000-000000009011",
- "asset_kind": "business_term",
- "version": 1,
- }
- )
- def test_standard_and_ontology_publications_use_canonical_versioned_knowledge():
- from app.core.data_research.semantic_knowledge import (
- PublishedGovernanceKnowledgeHandler,
- )
- knowledge = RecordingKnowledgeSync()
- handler = PublishedGovernanceKnowledgeHandler(
- knowledge_sync=knowledge,
- standard_loader=lambda uid: {
- "uid": uid,
- "standard_uid": "01900000-0000-7000-8000-000000000810",
- "version": 3,
- "status": "published",
- "name": "客户主数据标准",
- "definition": "统一客户等级",
- "owner": "data-team",
- "business_domain_uid": (
- "01900000-0000-7000-8000-000000000811"
- ),
- "rules": [
- {
- "uid": "customer-level",
- "name": "客户等级代码约束",
- "definition": "必须引用已发布代码值",
- }
- ],
- },
- ontology_loader=lambda uid: {
- "uid": "01900000-0000-7000-8000-000000000820",
- "version_uid": uid,
- "version": 2,
- "status": "published",
- "name": "客户本体",
- "definition": "客户跨域语义关系",
- "owner": "ontology-team",
- "business_domain_uid": (
- "01900000-0000-7000-8000-000000000811"
- ),
- "classes": [
- {
- "uid": "01900000-0000-7000-8000-000000000821",
- "name": "客户",
- "definition": "企业服务对象",
- }
- ],
- },
- )
- standard = handler.handle_standard(
- {"version_uid": "01900000-0000-7000-8000-000000000812"}
- )
- ontology = handler.handle_ontology(
- {"version_uid": "01900000-0000-7000-8000-000000000822"}
- )
- assert standard["status"] == "canonical_active"
- assert ontology["status"] == "canonical_active"
- assert knowledge.snapshots[0].source_type == "DataStandard"
- assert knowledge.snapshots[0].source_revision == 3
- assert knowledge.snapshots[1].source_type == "Ontology"
- assert knowledge.snapshots[1].source_revision == 2
|