Systematic rename of all semantic anchors (#region, [DEF], @RELATION) across 1400+ files — backend Python, frontend Svelte/TS, specs, docs: - Flat anchors become Namespace.Module.Entity - @RELATION references updated to match new anchor paths - Zero business logic changes
100 lines
3.8 KiB
Python
100 lines
3.8 KiB
Python
# #region Test.FuzzyMatching [C:3] [TYPE Module] [SEMANTICS test,fuzzy,matching,rapidfuzz]
|
|
# @BRIEF Tests for core/utils/matching.py — suggest_mappings.
|
|
# @RELATION BINDS_TO -> [Core.Matching.FuzzyMatching]
|
|
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "src"))
|
|
|
|
import pytest
|
|
|
|
|
|
# #region Test.FuzzyMatching.TestSuggestMappings [C:2] [TYPE Function]
|
|
# @BRIEF Test suggest_mappings for various database name scenarios.
|
|
class TestSuggestMappings:
|
|
def test_empty_targets_returns_empty(self):
|
|
from src.core.utils.matching import suggest_mappings
|
|
result = suggest_mappings(
|
|
[{"uuid": "s1", "database_name": "db1"}],
|
|
[],
|
|
)
|
|
assert result == []
|
|
|
|
def test_exact_match_returns_high_confidence(self):
|
|
from src.core.utils.matching import suggest_mappings
|
|
result = suggest_mappings(
|
|
[{"uuid": "s1", "database_name": "sales_db"}],
|
|
[{"uuid": "t1", "database_name": "sales_db"}],
|
|
)
|
|
assert len(result) == 1
|
|
assert result[0]["confidence"] == 1.0
|
|
assert result[0]["source_db"] == "sales_db"
|
|
assert result[0]["target_db"] == "sales_db"
|
|
|
|
def test_fuzzy_match_above_threshold(self):
|
|
from src.core.utils.matching import suggest_mappings
|
|
result = suggest_mappings(
|
|
[{"uuid": "s1", "database_name": "sales_database"}],
|
|
[{"uuid": "t1", "database_name": "sales_db"}],
|
|
threshold=60,
|
|
)
|
|
assert len(result) == 1
|
|
assert result[0]["confidence"] > 0.6
|
|
|
|
def test_low_similarity_below_threshold(self):
|
|
from src.core.utils.matching import suggest_mappings
|
|
result = suggest_mappings(
|
|
[{"uuid": "s1", "database_name": "completely_different"}],
|
|
[{"uuid": "t1", "database_name": "sales_db"}],
|
|
threshold=90, # High threshold
|
|
)
|
|
assert len(result) == 0
|
|
|
|
def test_multiple_sources_multiple_targets(self):
|
|
from src.core.utils.matching import suggest_mappings
|
|
result = suggest_mappings(
|
|
[
|
|
{"uuid": "s1", "database_name": "customers"},
|
|
{"uuid": "s2", "database_name": "orders"},
|
|
],
|
|
[
|
|
{"uuid": "t1", "database_name": "customers"},
|
|
{"uuid": "t2", "database_name": "orders_db"},
|
|
{"uuid": "t3", "database_name": "products"},
|
|
],
|
|
threshold=60,
|
|
)
|
|
assert len(result) == 2
|
|
# customers should match customers exactly
|
|
assert result[0]["source_db"] == "customers"
|
|
# orders should fuzzy match orders_db
|
|
assert result[1]["source_db"] == "orders"
|
|
|
|
def test_empty_source_returns_empty(self):
|
|
from src.core.utils.matching import suggest_mappings
|
|
result = suggest_mappings([], [{"uuid": "t1", "database_name": "db"}])
|
|
assert result == []
|
|
|
|
def test_fuzzy_match_token_sort(self):
|
|
from src.core.utils.matching import suggest_mappings
|
|
# token_sort_ratio compares sorted tokens, so "sales db" vs "db sales" should match
|
|
result = suggest_mappings(
|
|
[{"uuid": "s1", "database_name": "sales_db"}],
|
|
[{"uuid": "t1", "database_name": "db_sales"}],
|
|
threshold=60,
|
|
)
|
|
# token_sort_ratio normalizes token order, so these should match well
|
|
assert len(result) == 1
|
|
assert result[0]["confidence"] > 0.5
|
|
|
|
def test_handles_missing_keys_gracefully(self):
|
|
from src.core.utils.matching import suggest_mappings
|
|
with pytest.raises(KeyError):
|
|
suggest_mappings(
|
|
[{"uuid": "s1"}], # missing database_name
|
|
[{"uuid": "t1", "database_name": "db"}],
|
|
)
|
|
# #endregion Test.FuzzyMatching.TestSuggestMappings
|
|
# #endregion Test.FuzzyMatching
|