Files
ranking/backend/tests/integration/test_es_repository_integration.py
Frederico Castro 143ec401f5 feat(tests): adicionar suite completa de testes automatizados
- 198 testes cobrindo todos os módulos do backend
- Testes unitários para calculador de pontuação (56 testes)
- Testes para value objects de período (23 testes)
- Testes para cliente Elasticsearch com mocks (27 testes)
- Testes para repository de consultores (48 testes)
- Testes de integração ES + Repository (6 testes)
- Testes para API routes FastAPI (23 testes)
- Testes para job de processamento (16 testes)
- Cobertura de 54% do código
2025-12-29 08:06:08 -03:00

126 lines
4.2 KiB
Python

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