- 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
126 lines
4.2 KiB
Python
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
|