import pytest from unittest.mock import AsyncMock, MagicMock, patch from httpx import Response from src.infrastructure.elasticsearch.client import ElasticsearchClient from src.infrastructure.repositories.consultor_repository_impl import ConsultorRepositoryImpl from src.domain.services.calculador_pontuacao import CalculadorPontuacao def create_mock_response(json_data, status_code=200): response = MagicMock(spec=Response) response.json.return_value = json_data response.status_code = status_code response.raise_for_status = MagicMock() return response @pytest.fixture def es_client(): return ElasticsearchClient( url="http://localhost:9200", index="atuacapes_test", user="test", password="test" ) @pytest.fixture def repository(es_client): return ConsultorRepositoryImpl(es_client) class TestIntegracaoCoordenadorDeArea: @pytest.mark.asyncio async def test_coordenador_area_ativo_pontuacao_completa(self, es_client, repository): doc_es = { "id": 1001, "dadosPessoais": {"nome": "COORDENADOR ATIVO SILVA"}, "atuacoes": [{ "tipo": "Coordenação de Área de Avaliação", "inicio": "01/01/2020", "fim": None, "dadosCoordenacaoArea": { "tipo": "Coordenador de Área", "areaAvaliacao": {"nome": "CIÊNCIA DA COMPUTAÇÃO", "id": 1} } }] } with patch.object(es_client, '_client') as mock_client: mock_client.is_closed = False mock_client.post = AsyncMock(return_value=create_mock_response({ "hits": {"total": {"value": 1}, "hits": [{"_source": doc_es}]} })) consultor = await repository.buscar_por_id(1001) assert consultor is not None assert consultor.nome == "COORDENADOR ATIVO SILVA" assert len(consultor.coordenacoes_capes) == 1 pontuacao = CalculadorPontuacao.calcular_pontuacao_completa(consultor) assert pontuacao.bloco_a.total > 0 coord = consultor.coordenacoes_capes[0] assert coord.codigo == "CA" assert pontuacao.bloco_a.total >= 200 class TestCenariosBorda: @pytest.mark.asyncio async def test_consultor_sem_atuacoes(self, es_client, repository): doc_es = { "id": 8001, "dadosPessoais": {"nome": "SEM ATUACOES"}, "atuacoes": [] } with patch.object(es_client, '_client') as mock_client: mock_client.is_closed = False mock_client.post = AsyncMock(return_value=create_mock_response({ "hits": {"total": {"value": 1}, "hits": [{"_source": doc_es}]} })) consultor = await repository.buscar_por_id(8001) pontuacao = CalculadorPontuacao.calcular_pontuacao_completa(consultor) assert consultor.nome == "SEM ATUACOES" assert pontuacao.total == 0 @pytest.mark.asyncio async def test_atuacao_tipo_desconhecido(self, es_client, repository): doc_es = { "id": 8002, "dadosPessoais": {"nome": "TIPO ESTRANHO"}, "atuacoes": [{ "tipo": "Tipo Inexistente No Sistema", "dados": {"campo": "valor"} }] } with patch.object(es_client, '_client') as mock_client: mock_client.is_closed = False mock_client.post = AsyncMock(return_value=create_mock_response({ "hits": {"total": {"value": 1}, "hits": [{"_source": doc_es}]} })) consultor = await repository.buscar_por_id(8002) pontuacao = CalculadorPontuacao.calcular_pontuacao_completa(consultor) assert pontuacao.total == 0 @pytest.mark.asyncio async def test_consultor_nao_encontrado(self, es_client, repository): with patch.object(es_client, '_client') as mock_client: mock_client.is_closed = False mock_client.post = AsyncMock(return_value=create_mock_response({ "hits": {"total": {"value": 0}, "hits": []} })) consultor = await repository.buscar_por_id(99999) assert consultor is None