Группы исправлений: - Группа 1 (async/await misuse): MagicMock → AsyncMock для get_dashboards, export_dashboard, import_dashboard, sync_environment, get_run_detail, list_all_runs, create_task и др. — 23 теста - Группа 2 (runner.run deadlock): добавлены моки get_async_job_runner + IdMappingService/AsyncSupersetClient в migration plugin + API tests для предотвращения вечной блокировки future.result() — 16 тестов - Группа 3 (SyntaxError): исправлены 7 незакрытых скобок ')' в test_validation_tasks_comprehensive.py (QA-агент оставил AsyncMock без закрывающих скобок) - Группа 4 (mock verification): logger mock error→explore, scheduler tests skipped (удалён из production), dataset mapper — 11 тестов - Группа 5 (search/assistant): MagicMock → AsyncMock — 9 тестов - Группа 6 (extractor parsing): AsyncMock для async методов — 9 тестов Итого: 61 ранее FAILED → 274 passed, 4 skipped, 0 failed
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 = AsyncMock(return_value=source_dbs)
|
|
mock_target_client.get_databases_summary = AsyncMock(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 = AsyncMock(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
|