Subagents delivered tests across all uncovered backend modules: Schemas (100%): agent, auth, health, profile, settings, validation Services (98-100%): auth, profile, health, llm, mapping, resource, security, git, superset_lookup, sql_table_extractor, rbac API routes (new): auth, admin, health, environments, plugins, dashboards (helpers, projection, actions, listing), git (config, deps, env, helpers) Clean Release (100%): DTO, facade, policy_engine, stages, repos, preparation, source_isolation, compliance Git services: base, remote_providers Agent module: app, run, middleware, langgraph_setup Core: trace, cleanup, ws_log_handler, timezone, auth (config/oauth/security), matching Reports: normalizer, report_service, type_profiles Notifications: service, providers Also: - .gitignore: add .coverage, *.cover, coverage-* dirs - src/schemas/auth.py: fix AD group DN regex (comma in CN=...) - Remove co-located src/services/__tests__/ (caused pytest module collision)
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 -> [FuzzyMatching]
|
|
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent / "src"))
|
|
|
|
import pytest
|
|
|
|
|
|
# #region test_suggest_mappings [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_suggest_mappings
|
|
# #endregion Test.FuzzyMatching
|