- profile_utils: 40 tests, 100% coverage (sanitize, normalize, mask, validate payload) - security_badge_service: 17 tests, 100% coverage (role/permission extraction, security summary) - services_mapping: 4 tests, 100% coverage (client resolution, get_suggestions) - superset_lookup_service: 10 tests, 100% coverage (resolve environment, lookup success/degraded) - notification_providers: 16 tests, 95% coverage (SMTP, Telegram, Slack providers) - llm_provider: 25 tests, 91% coverage (mask_api_key, CRUD with encrypted API keys) - rbac_permission_catalog: 12 tests, 79% coverage (route scanning, sync to DB)
91 lines
3.6 KiB
Python
91 lines
3.6 KiB
Python
# #region Test.Services.Mapping [C:3] [TYPE Module] [SEMANTICS test,mapping,superset,suggestions]
|
|
# @BRIEF Tests for mapping_service.py (services/mapping_service.py) — get_client, get_suggestions.
|
|
# @RELATION BINDS_TO -> [MappingService]
|
|
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
|
|
|
|
from unittest.mock import AsyncMock, MagicMock, patch
|
|
import pytest
|
|
|
|
|
|
class MockEnvironment:
|
|
def __init__(self, env_id, name="test-env"):
|
|
self.id = env_id
|
|
self.name = name
|
|
self.username = "admin"
|
|
self.password = "pass"
|
|
self.url = "http://localhost:8080"
|
|
self.verify_ssl = False
|
|
self.timeout = 30
|
|
|
|
|
|
class TestGetMappingService:
|
|
"""MappingService — orchestrates DB fetching and fuzzy matching suggestions."""
|
|
|
|
@pytest.fixture
|
|
def config_manager(self):
|
|
cm = MagicMock()
|
|
cm.get_environments.return_value = [
|
|
MockEnvironment("source-1", "Source"),
|
|
MockEnvironment("target-1", "Target"),
|
|
]
|
|
return cm
|
|
|
|
@pytest.fixture
|
|
def service(self, config_manager):
|
|
from src.services.mapping_service import MappingService
|
|
return MappingService(config_manager)
|
|
|
|
def test_init(self, config_manager):
|
|
from src.services.mapping_service import MappingService
|
|
svc = MappingService(config_manager)
|
|
assert svc.config_manager is config_manager
|
|
|
|
def test_get_client_success(self, service):
|
|
from src.core.superset_client import SupersetClient
|
|
client = service._get_client("source-1")
|
|
assert isinstance(client, SupersetClient)
|
|
assert client.env.id == "source-1"
|
|
|
|
def test_get_client_not_found(self, service):
|
|
with pytest.raises(ValueError, match="Environment unknown-env not found"):
|
|
service._get_client("unknown-env")
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_get_suggestions_success(self, service):
|
|
from src.services.mapping_service import MappingService
|
|
source_dbs = [{"database_name": "sales_db", "id": 1}]
|
|
target_dbs = [{"database_name": "sales", "id": 2}]
|
|
|
|
with (
|
|
patch.object(MappingService, "_get_client") as mock_get_client,
|
|
patch("src.services.mapping_service.suggest_mappings") as mock_suggest,
|
|
):
|
|
mock_source_client = MagicMock()
|
|
mock_target_client = MagicMock()
|
|
mock_source_client.get_databases_summary.return_value = source_dbs
|
|
mock_target_client.get_databases_summary.return_value = target_dbs
|
|
mock_get_client.side_effect = [mock_source_client, mock_target_client]
|
|
mock_suggest.return_value = [{"source": "sales_db", "target": "sales", "score": 0.9}]
|
|
|
|
result = await service.get_suggestions("source-1", "target-1")
|
|
assert result == [{"source": "sales_db", "target": "sales", "score": 0.9}]
|
|
mock_suggest.assert_called_once_with(source_dbs, target_dbs)
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_get_suggestions_passes_envs_to_client(self, service):
|
|
from src.services.mapping_service import MappingService
|
|
with patch.object(MappingService, "_get_client") as mock_get_client:
|
|
mock_client = MagicMock()
|
|
mock_client.get_databases_summary.return_value = []
|
|
mock_get_client.return_value = mock_client
|
|
|
|
with patch("src.services.mapping_service.suggest_mappings", return_value=[]):
|
|
result = await service.get_suggestions("source-1", "target-1")
|
|
assert result == []
|
|
assert mock_get_client.call_count == 2
|
|
# #endregion Test.MappingService
|