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:
0
backend/tests/domain/value_objects/__init__.py
Normal file
0
backend/tests/domain/value_objects/__init__.py
Normal file
169
backend/tests/domain/value_objects/test_periodo.py
Normal file
169
backend/tests/domain/value_objects/test_periodo.py
Normal file
@@ -0,0 +1,169 @@
|
||||
import pytest
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
from src.domain.value_objects.periodo import (
|
||||
Periodo,
|
||||
mesclar_periodos,
|
||||
anos_completos_periodos,
|
||||
)
|
||||
|
||||
|
||||
class TestPeriodo:
|
||||
|
||||
def test_periodo_ativo_sem_fim(self):
|
||||
inicio = datetime(2020, 1, 1)
|
||||
periodo = Periodo(inicio=inicio, fim=None)
|
||||
assert periodo.ativo is True
|
||||
|
||||
def test_periodo_inativo_com_fim(self):
|
||||
inicio = datetime(2020, 1, 1)
|
||||
fim = datetime(2023, 1, 1)
|
||||
periodo = Periodo(inicio=inicio, fim=fim)
|
||||
assert periodo.ativo is False
|
||||
|
||||
def test_anos_decorridos_3_anos(self):
|
||||
inicio = datetime.now() - relativedelta(years=3)
|
||||
fim = datetime.now()
|
||||
periodo = Periodo(inicio=inicio, fim=fim)
|
||||
assert periodo.anos_decorridos >= 2.9
|
||||
assert periodo.anos_decorridos <= 3.1
|
||||
|
||||
def test_anos_decorridos_periodo_ativo(self):
|
||||
inicio = datetime.now() - relativedelta(years=5)
|
||||
periodo = Periodo(inicio=inicio, fim=None)
|
||||
assert periodo.anos_decorridos >= 4.9
|
||||
assert periodo.anos_decorridos <= 5.1
|
||||
|
||||
def test_anos_completos_retorna_inteiro(self):
|
||||
inicio = datetime(2020, 1, 1)
|
||||
fim = datetime(2023, 6, 15)
|
||||
periodo = Periodo(inicio=inicio, fim=fim)
|
||||
assert periodo.anos_completos() == 3
|
||||
|
||||
def test_anos_completos_menos_de_um_ano(self):
|
||||
inicio = datetime.now() - relativedelta(months=6)
|
||||
fim = datetime.now()
|
||||
periodo = Periodo(inicio=inicio, fim=fim)
|
||||
assert periodo.anos_completos() == 0
|
||||
|
||||
def test_anos_completos_com_data_referencia(self):
|
||||
inicio = datetime(2020, 1, 1)
|
||||
periodo = Periodo(inicio=inicio, fim=None)
|
||||
data_ref = datetime(2025, 1, 1)
|
||||
assert periodo.anos_completos(data_ref) == 5
|
||||
|
||||
def test_fim_anterior_inicio_corrige_para_none(self):
|
||||
inicio = datetime(2023, 1, 1)
|
||||
fim = datetime(2020, 1, 1)
|
||||
periodo = Periodo(inicio=inicio, fim=fim)
|
||||
assert periodo.fim is None
|
||||
assert periodo.ativo is True
|
||||
|
||||
|
||||
class TestMesclarPeriodos:
|
||||
|
||||
def test_lista_vazia_retorna_vazia(self):
|
||||
resultado = mesclar_periodos([])
|
||||
assert resultado == []
|
||||
|
||||
def test_um_periodo_retorna_mesmo(self):
|
||||
periodo = Periodo(datetime(2020, 1, 1), datetime(2023, 1, 1))
|
||||
resultado = mesclar_periodos([periodo])
|
||||
assert len(resultado) == 1
|
||||
assert resultado[0].inicio == periodo.inicio
|
||||
|
||||
def test_periodos_consecutivos_mesclados(self):
|
||||
p1 = Periodo(datetime(2020, 1, 1), datetime(2022, 1, 1))
|
||||
p2 = Periodo(datetime(2021, 6, 1), datetime(2024, 1, 1))
|
||||
resultado = mesclar_periodos([p1, p2])
|
||||
assert len(resultado) == 1
|
||||
assert resultado[0].inicio == datetime(2020, 1, 1)
|
||||
assert resultado[0].fim == datetime(2024, 1, 1)
|
||||
|
||||
def test_periodos_separados_nao_mesclados(self):
|
||||
p1 = Periodo(datetime(2015, 1, 1), datetime(2017, 1, 1))
|
||||
p2 = Periodo(datetime(2020, 1, 1), datetime(2023, 1, 1))
|
||||
resultado = mesclar_periodos([p1, p2])
|
||||
assert len(resultado) == 2
|
||||
|
||||
def test_periodo_ativo_preservado(self):
|
||||
p1 = Periodo(datetime(2020, 1, 1), datetime(2022, 1, 1))
|
||||
p2 = Periodo(datetime(2021, 1, 1), None)
|
||||
resultado = mesclar_periodos([p1, p2])
|
||||
assert len(resultado) == 1
|
||||
assert resultado[0].ativo is True
|
||||
|
||||
def test_tres_periodos_mesclados(self):
|
||||
p1 = Periodo(datetime(2018, 1, 1), datetime(2020, 1, 1))
|
||||
p2 = Periodo(datetime(2019, 1, 1), datetime(2021, 1, 1))
|
||||
p3 = Periodo(datetime(2020, 6, 1), datetime(2023, 1, 1))
|
||||
resultado = mesclar_periodos([p1, p2, p3])
|
||||
assert len(resultado) == 1
|
||||
assert resultado[0].inicio == datetime(2018, 1, 1)
|
||||
assert resultado[0].fim == datetime(2023, 1, 1)
|
||||
|
||||
def test_ordenacao_automatica(self):
|
||||
p1 = Periodo(datetime(2022, 1, 1), datetime(2024, 1, 1))
|
||||
p2 = Periodo(datetime(2018, 1, 1), datetime(2020, 1, 1))
|
||||
resultado = mesclar_periodos([p1, p2])
|
||||
assert resultado[0].inicio == datetime(2018, 1, 1)
|
||||
|
||||
|
||||
class TestAnosCompletosPeriodos:
|
||||
|
||||
def test_lista_vazia_retorna_zero(self):
|
||||
resultado = anos_completos_periodos([])
|
||||
assert resultado == 0
|
||||
|
||||
def test_um_periodo_3_anos(self):
|
||||
periodo = Periodo(datetime(2020, 1, 1), datetime(2023, 1, 1))
|
||||
resultado = anos_completos_periodos([periodo])
|
||||
assert resultado == 3
|
||||
|
||||
def test_dois_periodos_soma(self):
|
||||
p1 = Periodo(datetime(2015, 1, 1), datetime(2017, 1, 1))
|
||||
p2 = Periodo(datetime(2020, 1, 1), datetime(2023, 1, 1))
|
||||
resultado = anos_completos_periodos([p1, p2])
|
||||
assert resultado == 5
|
||||
|
||||
def test_com_data_referencia(self):
|
||||
p1 = Periodo(datetime(2020, 1, 1), None)
|
||||
p2 = Periodo(datetime(2015, 1, 1), datetime(2017, 1, 1))
|
||||
data_ref = datetime(2025, 1, 1)
|
||||
resultado = anos_completos_periodos([p1, p2], data_ref)
|
||||
assert resultado == 7
|
||||
|
||||
|
||||
class TestCasosEspeciais:
|
||||
|
||||
def test_periodo_muito_curto(self):
|
||||
inicio = datetime.now() - relativedelta(days=30)
|
||||
fim = datetime.now()
|
||||
periodo = Periodo(inicio=inicio, fim=fim)
|
||||
assert periodo.anos_completos() == 0
|
||||
|
||||
def test_periodo_exatamente_um_ano(self):
|
||||
inicio = datetime(2023, 1, 1)
|
||||
fim = datetime(2024, 1, 1)
|
||||
periodo = Periodo(inicio=inicio, fim=fim)
|
||||
assert periodo.anos_completos() == 1
|
||||
|
||||
def test_periodo_quase_um_ano(self):
|
||||
inicio = datetime(2023, 1, 1)
|
||||
fim = datetime(2023, 12, 31)
|
||||
periodo = Periodo(inicio=inicio, fim=fim)
|
||||
assert periodo.anos_completos() == 0
|
||||
|
||||
def test_mesclagem_periodos_sobrepostos_complexos(self):
|
||||
periodos = [
|
||||
Periodo(datetime(2010, 1, 1), datetime(2012, 1, 1)),
|
||||
Periodo(datetime(2011, 6, 1), datetime(2014, 1, 1)),
|
||||
Periodo(datetime(2013, 1, 1), datetime(2015, 1, 1)),
|
||||
Periodo(datetime(2018, 1, 1), datetime(2020, 1, 1)),
|
||||
Periodo(datetime(2019, 6, 1), None),
|
||||
]
|
||||
resultado = mesclar_periodos(periodos)
|
||||
assert len(resultado) == 2
|
||||
assert resultado[0].fim == datetime(2015, 1, 1)
|
||||
assert resultado[1].ativo is True
|
||||
Reference in New Issue
Block a user