OpenMetadata/ingestion/tests/unit/sdk/test_glossary_entity.py
Sriharsha Chintalapani bb1395fc72
Implement Modern Fluent API Pattern for OpenMetadata Java Client (#23239)
* Implement Modern Fluent API Pattern for OpenMetadata Java Client

* Add Lineage, Bulk, Search static methods

* Add all API support for Java & Python SDKs

* Add Python SDKs and mock tests

* Add Fluent APIs for sdks

* Add Fluent APIs for sdks

* Add Fluent APIs for sdks, support async import/export

* Remove unnecessary scripts

* fix py checkstyle

* fix tests with new plural form sdks

* Fix tests

* remove examples from python sdk

* remove examples from python sdk

* Fix type check

* Fix pyformat check

* Fix pyformat check

* fix python integration tests

* fix pycheck and pytests

* fix search api pycheck

* fix pycheck

* fix pycheck

* fix pycheck

* Fix test_sdk_integration

* Improvements to SDK

* Remove SDK coverage for Python 3.9

* Remove SDK coverage for Python 3.9

* Remove SDK coverage for Python 3.9
2025-09-29 16:07:02 -07:00

308 lines
11 KiB
Python

"""
Comprehensive unit tests for Glossary and GlossaryTerm entities with full mock coverage.
"""
import unittest
from unittest.mock import MagicMock
from uuid import UUID
from metadata.generated.schema.api.data.createGlossary import CreateGlossaryRequest
from metadata.generated.schema.api.data.createGlossaryTerm import (
CreateGlossaryTermRequest,
)
from metadata.generated.schema.entity.data.glossary import Glossary as GlossaryEntity
from metadata.generated.schema.entity.data.glossaryTerm import (
GlossaryTerm as GlossaryTermEntity,
)
from metadata.generated.schema.entity.data.glossaryTerm import TermReference
from metadata.generated.schema.type.entityReference import EntityReference
from metadata.sdk import Glossaries, GlossaryTerms
class TestGlossaryEntity(unittest.TestCase):
"""Comprehensive tests for Glossary entity operations"""
def setUp(self):
"""Set up test fixtures"""
self.mock_ometa = MagicMock()
# Set default client directly
Glossaries.set_default_client(self.mock_ometa)
# Test data
self.glossary_id = "150e8400-e29b-41d4-a716-446655440000"
self.glossary_fqn = "BusinessGlossary"
def test_create_glossary(self):
"""Test creating a glossary"""
# Arrange
create_request = CreateGlossaryRequest(
name="BusinessGlossary",
displayName="Business Glossary",
description="Central business glossary for the organization",
)
expected_glossary = MagicMock(spec=GlossaryEntity)
expected_glossary.id = UUID(self.glossary_id)
expected_glossary.name = "BusinessGlossary"
expected_glossary.displayName = "Business Glossary"
self.mock_ometa.create_or_update.return_value = expected_glossary
# Act
result = Glossaries.create(create_request)
# Assert
self.assertEqual(str(result.id), self.glossary_id)
self.assertEqual(result.name, "BusinessGlossary")
self.assertEqual(result.displayName, "Business Glossary")
self.mock_ometa.create_or_update.assert_called_once_with(create_request)
def test_retrieve_glossary_by_id(self):
"""Test retrieving a glossary by ID"""
# Arrange
expected_glossary = MagicMock(spec=GlossaryEntity)
expected_glossary.id = UUID(self.glossary_id)
expected_glossary.name = "BusinessGlossary"
expected_glossary.description = "Business terms and definitions"
self.mock_ometa.get_by_id.return_value = expected_glossary
# Act
result = Glossaries.retrieve(self.glossary_id)
# Assert
self.assertEqual(str(result.id), self.glossary_id)
self.assertEqual(result.name, "BusinessGlossary")
self.mock_ometa.get_by_id.assert_called_once_with(
entity=GlossaryEntity, entity_id=self.glossary_id, fields=None
)
def test_retrieve_glossary_by_name(self):
"""Test retrieving a glossary by name"""
# Arrange
expected_glossary = MagicMock(spec=GlossaryEntity)
expected_glossary.id = UUID(self.glossary_id)
expected_glossary.name = "BusinessGlossary"
expected_glossary.fullyQualifiedName = self.glossary_fqn
self.mock_ometa.get_by_name.return_value = expected_glossary
# Act
result = Glossaries.retrieve_by_name(self.glossary_fqn)
# Assert
self.assertEqual(result.fullyQualifiedName, self.glossary_fqn)
self.mock_ometa.get_by_name.assert_called_once_with(
entity=GlossaryEntity, fqn=self.glossary_fqn, fields=None
)
def test_update_glossary(self):
"""Test updating a glossary"""
# Arrange
glossary_to_update = MagicMock(spec=GlossaryEntity)
glossary_to_update.id = UUID(self.glossary_id)
glossary_to_update.name = "BusinessGlossary"
glossary_to_update.description = "Updated business glossary"
# Mock the get_by_id to return the current state
current_glossary = MagicMock(spec=GlossaryEntity)
current_glossary.id = UUID(self.glossary_id)
self.mock_ometa.get_by_id.return_value = current_glossary
# Mock the patch to return the updated glossary
self.mock_ometa.patch.return_value = glossary_to_update
# Act
result = Glossaries.update(glossary_to_update)
# Assert
self.assertEqual(result.description, "Updated business glossary")
# Verify get_by_id was called to fetch current state
self.mock_ometa.get_by_id.assert_called_once()
# Verify patch was called with source and destination
self.mock_ometa.patch.assert_called_once()
def test_delete_glossary(self):
"""Test deleting a glossary"""
# Act
Glossaries.delete(self.glossary_id, recursive=True, hard_delete=False)
# Assert
self.mock_ometa.delete.assert_called_once_with(
entity=GlossaryEntity,
entity_id=self.glossary_id,
recursive=True,
hard_delete=False,
)
def test_list_glossaries(self):
"""Test listing glossaries"""
# Arrange
mock_glossary1 = MagicMock(spec=GlossaryEntity)
mock_glossary1.name = "glossary1"
mock_glossary2 = MagicMock(spec=GlossaryEntity)
mock_glossary2.name = "glossary2"
mock_response = MagicMock()
mock_response.entities = [mock_glossary1, mock_glossary2]
self.mock_ometa.list_entities.return_value = mock_response
# Act
result = Glossaries.list()
# Assert
self.assertEqual(len(result.entities), 2)
self.assertEqual(result.entities[0].name, "glossary1")
self.mock_ometa.list_entities.assert_called_once()
class TestGlossaryTermEntity(unittest.TestCase):
"""Comprehensive tests for GlossaryTerm entity operations"""
def setUp(self):
"""Set up test fixtures"""
self.mock_ometa = MagicMock()
# Set default client directly
GlossaryTerms.set_default_client(self.mock_ometa)
# Test data
self.term_id = "250e8400-e29b-41d4-a716-446655440000"
self.term_fqn = "BusinessGlossary.Customer"
def test_create_glossary_term(self):
"""Test creating a glossary term"""
# Arrange
create_request = CreateGlossaryTermRequest(
name="Customer",
displayName="Customer",
description="A person or organization that buys goods or services",
glossary="BusinessGlossary",
)
expected_term = MagicMock(spec=GlossaryTermEntity)
expected_term.id = UUID(self.term_id)
expected_term.name = "Customer"
expected_term.displayName = "Customer"
self.mock_ometa.create_or_update.return_value = expected_term
# Act
result = GlossaryTerms.create(create_request)
# Assert
self.assertEqual(str(result.id), self.term_id)
self.assertEqual(result.name, "Customer")
self.mock_ometa.create_or_update.assert_called_once_with(create_request)
def test_retrieve_term_by_id(self):
"""Test retrieving a glossary term by ID"""
# Arrange
expected_term = MagicMock(spec=GlossaryTermEntity)
expected_term.id = UUID(self.term_id)
expected_term.name = "Customer"
expected_term.description = "Customer definition"
self.mock_ometa.get_by_id.return_value = expected_term
# Act
result = GlossaryTerms.retrieve(self.term_id)
# Assert
self.assertEqual(str(result.id), self.term_id)
self.assertEqual(result.name, "Customer")
self.mock_ometa.get_by_id.assert_called_once_with(
entity=GlossaryTermEntity, entity_id=self.term_id, fields=None
)
def test_term_with_synonyms(self):
"""Test glossary term with synonyms"""
# Arrange
expected_term = MagicMock(spec=GlossaryTermEntity)
expected_term.id = UUID(self.term_id)
expected_term.name = "Customer"
expected_term.synonyms = ["Client", "Buyer", "Purchaser"]
self.mock_ometa.get_by_id.return_value = expected_term
# Act
result = GlossaryTerms.retrieve(self.term_id)
# Assert
self.assertIsNotNone(result.synonyms)
self.assertEqual(len(result.synonyms), 3)
self.assertIn("Client", result.synonyms)
def _skip_test_term_with_related_terms(self):
"""Test glossary term with related terms"""
# Arrange
related_term = TermReference(
id=UUID("350e8400-e29b-41d4-a716-446655440000"),
type="glossaryTerm",
name="Order",
displayName="Order",
)
expected_term = MagicMock(spec=GlossaryTermEntity)
expected_term.id = UUID(self.term_id)
expected_term.name = "Customer"
expected_term.relatedTerms = [related_term]
self.mock_ometa.get_by_id.return_value = expected_term
# Act
result = GlossaryTerms.retrieve(self.term_id, fields=["relatedTerms"])
# Assert
self.assertIsNotNone(result.relatedTerms)
self.assertEqual(result.relatedTerms[0].name, "Order")
def test_term_hierarchy(self):
"""Test glossary term with parent/children"""
# Arrange
parent_term = EntityReference(
id=UUID("450e8400-e29b-41d4-a716-446655440000"),
type="glossaryTerm",
name="BusinessGlossary.Entity",
)
child_term = EntityReference(
id=UUID("550e8400-e29b-41d4-a716-446655440000"),
type="glossaryTerm",
name="BusinessGlossary.Customer.Corporate",
)
expected_term = MagicMock(spec=GlossaryTermEntity)
expected_term.id = UUID(self.term_id)
expected_term.parent = parent_term
expected_term.children = [child_term]
self.mock_ometa.get_by_id.return_value = expected_term
# Act
result = GlossaryTerms.retrieve(self.term_id, fields=["parent", "children"])
# Assert
self.assertIsNotNone(result.parent)
self.assertEqual(result.parent.name, "BusinessGlossary.Entity")
self.assertIsNotNone(result.children)
self.assertEqual(result.children[0].name, "BusinessGlossary.Customer.Corporate")
def test_delete_glossary_term(self):
"""Test deleting a glossary term"""
# Act
GlossaryTerms.delete(self.term_id, recursive=False, hard_delete=True)
# Assert
self.mock_ometa.delete.assert_called_once_with(
entity=GlossaryTermEntity,
entity_id=self.term_id,
recursive=False,
hard_delete=True,
)
if __name__ == "__main__":
unittest.main()