test_ontology_repository.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from __future__ import annotations
  2. import pytest
  3. def graph(name="Customer"):
  4. return {
  5. "classes": [{"uid": "class-1", "name": name}],
  6. "properties": [],
  7. "relations": [],
  8. "constraints": [],
  9. "domain_links": [
  10. {"domain_uid": "domain-a", "role": "owner"},
  11. {"domain_uid": "domain-b", "role": "contributor"},
  12. ],
  13. "element_mappings": [],
  14. }
  15. def test_unique_code_domain_roles_and_optimistic_draft_revision():
  16. from app.core.data_research.ontology.repository import MemoryOntologyRepository, OntologyConflict
  17. repository = MemoryOntologyRepository(uid_factory=iter(("ontology-1", "version-1")).__next__)
  18. ontology = repository.create(
  19. code="CUSTOMER_360",
  20. name="客户360本体",
  21. owner_uid="owner-1",
  22. domain_links=graph()["domain_links"],
  23. )
  24. assert ontology.uid == "ontology-1"
  25. assert len(ontology.domain_links) == 2
  26. with pytest.raises(OntologyConflict, match="code"):
  27. repository.create(code="CUSTOMER_360", name="重复", owner_uid="owner-2", domain_links=[])
  28. draft = repository.save_draft(
  29. ontology.uid, graph(), expected_revision=0, actor_uid="editor-1"
  30. )
  31. assert draft.parent_version_uid is None
  32. assert repository.get(ontology.uid).draft_revision == 1
  33. with pytest.raises(OntologyConflict, match="revision"):
  34. repository.save_draft(
  35. ontology.uid, graph("Changed"), expected_revision=0, actor_uid="editor-1"
  36. )
  37. def test_published_version_is_immutable_and_hash_is_canonical():
  38. from app.core.data_research.ontology.repository import (
  39. MemoryOntologyRepository,
  40. OntologyImmutable,
  41. canonical_graph_hash,
  42. )
  43. ids = iter(("ontology-1", "version-1", "version-2"))
  44. repository = MemoryOntologyRepository(uid_factory=ids.__next__)
  45. ontology = repository.create(
  46. code="CUSTOMER", name="客户", owner_uid="owner-1", domain_links=graph()["domain_links"]
  47. )
  48. version = repository.save_draft(ontology.uid, graph(), expected_revision=0, actor_uid="editor-1")
  49. published = repository.mark_published(version.uid)
  50. assert published.content_hash == canonical_graph_hash(graph())
  51. assert published.parent_version_uid is None
  52. with pytest.raises(OntologyImmutable, match="published"):
  53. repository.replace_version(version.uid, graph("Illegal"))
  54. next_version = repository.save_draft(
  55. ontology.uid, graph("CustomerAccount"), expected_revision=1, actor_uid="editor-1"
  56. )
  57. assert next_version.parent_version_uid == published.uid
  58. assert next_version.version == 2
  59. def test_versions_are_listed_newest_first():
  60. from app.core.data_research.ontology.repository import MemoryOntologyRepository
  61. ids = iter(("ontology-1", "version-1", "version-2"))
  62. repository = MemoryOntologyRepository(uid_factory=ids.__next__)
  63. ontology = repository.create(
  64. code="CUSTOMER",
  65. name="客户",
  66. owner_uid="owner-1",
  67. domain_links=graph()["domain_links"],
  68. )
  69. repository.save_draft(
  70. ontology.uid, graph(), expected_revision=0, actor_uid="editor-1"
  71. )
  72. repository.save_draft(
  73. ontology.uid,
  74. graph("CustomerAccount"),
  75. expected_revision=1,
  76. actor_uid="editor-1",
  77. )
  78. assert [item.uid for item in repository.list_versions(ontology.uid)] == [
  79. "version-2",
  80. "version-1",
  81. ]