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:
Frederico Castro
2025-12-29 08:06:08 -03:00
parent e0692ee49c
commit 143ec401f5
19 changed files with 2899 additions and 0 deletions

294
backend/tests/conftest.py Normal file
View File

@@ -0,0 +1,294 @@
import pytest
from datetime import datetime
from dateutil.relativedelta import relativedelta
from src.domain.entities.consultor import (
Consultor,
CoordenacaoCapes,
Consultoria,
Inscricao,
AvaliacaoComissao,
Premiacao,
BolsaCNPQ,
Participacao,
Orientacao,
MembroBanca,
)
from src.domain.value_objects.periodo import Periodo
@pytest.fixture
def data_referencia():
return datetime(2025, 1, 1)
@pytest.fixture
def hoje():
return datetime.now()
def criar_periodo(anos_atras: int, ativo: bool = False, duracao_anos: int = 0) -> Periodo:
inicio = datetime.now() - relativedelta(years=anos_atras)
if ativo:
fim = None
else:
fim = inicio + relativedelta(years=duracao_anos) if duracao_anos > 0 else datetime.now()
return Periodo(inicio=inicio, fim=fim)
@pytest.fixture
def periodo_ativo_5_anos():
return criar_periodo(anos_atras=5, ativo=True)
@pytest.fixture
def periodo_historico_3_anos():
return criar_periodo(anos_atras=5, duracao_anos=3)
@pytest.fixture
def periodo_historico_10_anos():
return criar_periodo(anos_atras=12, duracao_anos=10)
@pytest.fixture
def coordenacao_ca_ativa(periodo_ativo_5_anos):
return CoordenacaoCapes(
codigo="CA",
tipo="Coordenador de Área",
area_avaliacao="CIÊNCIAS AMBIENTAIS",
periodo=periodo_ativo_5_anos,
)
@pytest.fixture
def coordenacao_ca_historica(periodo_historico_3_anos):
return CoordenacaoCapes(
codigo="CA",
tipo="Coordenador de Área",
area_avaliacao="MEDICINA I",
periodo=periodo_historico_3_anos,
)
@pytest.fixture
def coordenacao_caj_ativa():
return CoordenacaoCapes(
codigo="CAJ",
tipo="Coordenador Adjunto",
area_avaliacao="ENGENHARIA I",
periodo=criar_periodo(anos_atras=3, ativo=True),
)
@pytest.fixture
def coordenacao_caj_mp_historica():
return CoordenacaoCapes(
codigo="CAJ_MP",
tipo="Coordenador Adjunto de Mestrado Profissionalizante",
area_avaliacao="ADMINISTRAÇÃO",
periodo=criar_periodo(anos_atras=6, duracao_anos=4),
)
@pytest.fixture
def coordenacao_cam_ativa():
return CoordenacaoCapes(
codigo="CAM",
tipo="Câmara Temática",
area_avaliacao="INTERDISCIPLINAR",
periodo=criar_periodo(anos_atras=2, ativo=True),
)
@pytest.fixture
def consultoria_ativa_8_anos():
return Consultoria(
codigo="CONS_ATIVO",
situacao="Atividade Contínua",
periodo=criar_periodo(anos_atras=8, ativo=True),
periodos=[criar_periodo(anos_atras=8, ativo=True)],
anos_consecutivos=8,
retornos=0,
)
@pytest.fixture
def consultoria_historica_5_anos():
return Consultoria(
codigo="CONS_HIST",
situacao="Inativo",
periodo=criar_periodo(anos_atras=7, duracao_anos=5),
periodos=[criar_periodo(anos_atras=7, duracao_anos=5)],
anos_consecutivos=5,
retornos=0,
)
@pytest.fixture
def consultoria_com_retorno():
periodo1 = criar_periodo(anos_atras=10, duracao_anos=3)
periodo2 = criar_periodo(anos_atras=4, ativo=True)
return Consultoria(
codigo="CONS_ATIVO",
situacao="Atividade Contínua",
periodo=periodo2,
periodos=[periodo1, periodo2],
anos_consecutivos=4,
retornos=1,
)
@pytest.fixture
def inscricao_autor():
return Inscricao(
codigo="INSC_AUTOR",
tipo="Autor",
premio="PCT",
ano=2024,
situacao="Aprovada",
)
@pytest.fixture
def inscricao_institucional():
return Inscricao(
codigo="INSC_INST_AUTOR",
tipo="Institucional",
premio="PCT",
ano=2024,
situacao="Aprovada",
)
@pytest.fixture
def avaliacao_comissao_premio():
return AvaliacaoComissao(
codigo="AVAL_COMIS_PREMIO",
tipo="Membro de Comissão",
premio="PCT",
ano=2024,
)
@pytest.fixture
def avaliacao_comissao_gp():
return AvaliacaoComissao(
codigo="AVAL_COMIS_GP",
tipo="Membro de Comissão",
premio="Grande Prêmio",
ano=2024,
)
@pytest.fixture
def coord_comissao_premio():
return AvaliacaoComissao(
codigo="COORD_COMIS_PREMIO",
tipo="Coordenador/Presidente",
premio="PCT",
ano=2024,
comissao_tipo="Coordenador",
)
@pytest.fixture
def premiacao_gp_autor():
return Premiacao(
codigo="PREMIACAO_GP_AUTOR",
tipo="Grande Prêmio",
nome_premio="Grande Prêmio CAPES de Tese",
ano=2024,
papel="Autor",
)
@pytest.fixture
def premiacao_autor():
return Premiacao(
codigo="PREMIACAO_AUTOR",
tipo="Prêmio",
nome_premio="Prêmio CAPES de Tese",
ano=2024,
papel="Autor",
)
@pytest.fixture
def mencao_autor():
return Premiacao(
codigo="MENCAO_AUTOR",
tipo="Menção Honrosa",
nome_premio="Prêmio CAPES de Tese",
ano=2024,
papel="Autor",
)
@pytest.fixture
def bolsa_cnpq():
return BolsaCNPQ(
codigo="BOL_BPQ_NIVEL",
nivel="1A",
area="Ciências Exatas",
)
@pytest.fixture
def participacao_evento():
return Participacao(
codigo="EVENTO",
tipo="Evento",
descricao="Seminário CAPES 2024",
ano=2024,
)
@pytest.fixture
def participacao_projeto():
return Participacao(
codigo="PROJ",
tipo="Projeto",
descricao="Projeto de Pesquisa",
ano=2024,
)
@pytest.fixture
def consultor_vazio():
return Consultor(
id_pessoa=1,
nome="Consultor Vazio",
)
@pytest.fixture
def consultor_coordenador_area(coordenacao_ca_ativa):
return Consultor(
id_pessoa=2,
nome="Coordenador de Área Ativo",
coordenacoes_capes=[coordenacao_ca_ativa],
)
@pytest.fixture
def consultor_completo(
coordenacao_ca_ativa,
consultoria_ativa_8_anos,
inscricao_autor,
avaliacao_comissao_premio,
premiacao_autor,
bolsa_cnpq,
participacao_evento,
):
return Consultor(
id_pessoa=3,
nome="Consultor Completo",
coordenacoes_capes=[coordenacao_ca_ativa],
consultoria=consultoria_ativa_8_anos,
inscricoes=[inscricao_autor],
avaliacoes_comissao=[avaliacao_comissao_premio],
premiacoes=[premiacao_autor],
bolsas_cnpq=[bolsa_cnpq],
participacoes=[participacao_evento],
)