Files
ss-tools/backend/tests/test_core/test_matching.py
root 632b730fff chore: migrate GRACE-Poly anchors to hierarchical dotted naming
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
2026-07-22 11:48:15 +03:00

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