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
This commit is contained in:
125
backend/tests/integration/test_es_repository_integration.py
Normal file
125
backend/tests/integration/test_es_repository_integration.py
Normal file
@@ -0,0 +1,125 @@
|
||||
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
|
||||
Reference in New Issue
Block a user