Files
ranking/backend/tests/infrastructure/oracle/test_ranking_repository.py
Frederico Castro 0a0a47ecc4 feat(tests): adicionar testes para filtro E_CONSULTOR e RankingStore
- Adicionar campo e_consultor nos testes de processar_ranking
- Adicionar testes de inserção com E_CONSULTOR no ranking_repository
- Criar test_ranking_store.py com testes de filtro ativo/inativo
- Garantir que filtros de ativo/inativo só afetam consultores
2025-12-30 23:32:02 -03:00

209 lines
6.5 KiB
Python

from datetime import datetime
from types import SimpleNamespace
from unittest.mock import MagicMock
import pytest
from src.infrastructure.oracle.ranking_repository import RankingOracleRepository
class DummyCLOB:
def __init__(self, value: str) -> None:
self._value = value
def read(self) -> str:
return self._value
@pytest.fixture
def oracle_client():
client = MagicMock()
client.executar_query.return_value = []
return client
@pytest.fixture
def repo(oracle_client):
return RankingOracleRepository(oracle_client)
def test_buscar_paginado_monta_params_e_parseia_json(repo, oracle_client):
oracle_client.executar_query.return_value = [
{
"ID_PESSOA": 1,
"NOME": "Teste",
"POSICAO": 10,
"PONTUACAO_TOTAL": 200,
"COMPONENTE_A": 10,
"COMPONENTE_B": 20,
"COMPONENTE_C": 30,
"COMPONENTE_D": 40,
"COMPONENTE_E": 0,
"ATIVO": "S",
"ANOS_ATUACAO": 5,
"DT_CALCULO": datetime(2025, 1, 1),
"JSON_DETALHES": DummyCLOB("{\"k\": 1}"),
}
]
resultado = repo.buscar_paginado(page=2, size=20, filtro_ativo=True, filtro_selos=["CA", "EVENTO"])
assert len(resultado) == 1
consultor = resultado[0]
assert consultor.id_pessoa == 1
assert consultor.ativo is True
assert consultor.json_detalhes == "{\"k\": 1}"
call_args = oracle_client.executar_query.call_args
params = call_args[0][1]
assert params["offset"] == 20
assert params["limit_end"] == 40
assert params["ativo"] == "S"
assert params["selo_0"] == "CA"
assert params["selo_1"] == "EVENTO"
def test_contar_total_com_filtros(repo, oracle_client):
oracle_client.executar_query.return_value = [{"TOTAL": 123}]
total = repo.contar_total(filtro_ativo=False, filtro_selos=["CONS_ATIVO"])
assert total == 123
call_args = oracle_client.executar_query.call_args
params = call_args[0][1]
assert params["ativo"] == "N"
assert params["selo_0"] == "CONS_ATIVO"
def test_buscar_por_nome_monta_query(repo, oracle_client):
oracle_client.executar_query.return_value = [{"ID_PESSOA": 1, "NOME": "JOAO", "POSICAO": 1, "PONTUACAO_TOTAL": 10}]
resultado = repo.buscar_por_nome("Joao Silva", limit=3)
assert resultado[0]["ID_PESSOA"] == 1
call_args = oracle_client.executar_query.call_args
params = call_args[0][1]
assert params["limit"] == 3
assert params["p0"] == "%JOAO%"
assert params["p1"] == "%SILVA%"
def test_buscar_por_id_parseia_json(repo, oracle_client):
oracle_client.executar_query.return_value = [
{
"ID_PESSOA": 5,
"NOME": "Teste",
"POSICAO": 20,
"PONTUACAO_TOTAL": 300,
"COMPONENTE_A": 10,
"COMPONENTE_B": 20,
"COMPONENTE_C": 30,
"COMPONENTE_D": 40,
"COMPONENTE_E": 0,
"ATIVO": "N",
"ANOS_ATUACAO": 2,
"DT_CALCULO": datetime(2024, 12, 31),
"JSON_DETALHES": DummyCLOB("{\"x\": true}"),
}
]
consultor = repo.buscar_por_id(5)
assert consultor is not None
assert consultor.id_pessoa == 5
assert consultor.ativo is False
assert consultor.json_detalhes == "{\"x\": true}"
def test_atualizar_posicoes_chama_procedure(repo, oracle_client):
cursor = MagicMock()
conn = MagicMock()
conn.cursor.return_value = cursor
oracle_client.get_connection.return_value.__enter__.return_value = conn
repo.atualizar_posicoes()
cursor.callproc.assert_called_once_with("SP_ATUALIZAR_POSICOES")
conn.commit.assert_called_once()
def test_obter_estatisticas(repo, oracle_client):
oracle_client.executar_query.return_value = [
{
"TOTAL_CONSULTORES": 10,
"TOTAL_ATIVOS": 7,
"TOTAL_INATIVOS": 3,
"ULTIMA_ATUALIZACAO": datetime(2025, 1, 2, 10, 0, 0),
"PONTUACAO_MEDIA": 100,
"PONTUACAO_MAXIMA": 200,
"PONTUACAO_MINIMA": 10,
"MEDIA_COMP_A": 10,
"MEDIA_COMP_B": 20,
"MEDIA_COMP_C": 30,
"MEDIA_COMP_D": 40,
"MEDIA_COMP_E": 0,
}
]
stats = repo.obter_estatisticas()
assert stats["total_consultores"] == 10
assert stats["total_ativos"] == 7
assert stats["ultima_atualizacao"].startswith("2025-01-02")
assert stats["media_componentes"]["a"] == 10
def test_obter_distribuicao(repo, oracle_client):
oracle_client.executar_query.return_value = [
{"FAIXA": "0-199", "QUANTIDADE": 5, "PERCENTUAL": 50},
{"FAIXA": "200-399", "QUANTIDADE": 5, "PERCENTUAL": 50},
]
dist = repo.obter_distribuicao()
assert dist[0]["faixa"] == "0-199"
assert dist[1]["percentual"] == 50.0
def test_buscar_para_exportacao_usa_cursor(repo, oracle_client):
cursor = MagicMock()
cursor.description = [("ID_PESSOA",), ("NOME",), ("JSON_DETALHES",)]
cursor.fetchmany.side_effect = [
[(1, "Teste", DummyCLOB("{\"k\":1}"))],
[],
]
conn = MagicMock()
conn.cursor.return_value = cursor
oracle_client.get_connection.return_value.__enter__.return_value = conn
registros = repo.buscar_para_exportacao(filtro_ativo=True, filtro_selos=["CA"], batch_size=1)
assert registros[0]["ID_PESSOA"] == 1
assert registros[0]["JSON_DETALHES"] == "{\"k\":1}"
def test_contar_para_exportacao_com_filtros(repo, oracle_client):
oracle_client.executar_query.return_value = [{"TOTAL": 42}]
total = repo.contar_para_exportacao(filtro_ativo=True, filtro_selos=["EVENTO", "PROJ"])
assert total == 42
call_args = oracle_client.executar_query.call_args
params = call_args[0][1]
assert params["ativo"] == "S"
assert params["selo_0"] == "EVENTO"
assert params["selo_1"] == "PROJ"
def test_filtro_ativo_filtra_apenas_consultores(repo, oracle_client):
oracle_client.executar_query.return_value = [{"TOTAL": 100}]
repo.contar_total(filtro_ativo=True)
call_args = oracle_client.executar_query.call_args
query = call_args[0][0]
assert "E_CONSULTOR = 'S'" in query
assert "ATIVO = :ativo" in query
def test_filtro_ativo_false_filtra_apenas_consultores(repo, oracle_client):
oracle_client.executar_query.return_value = [{"TOTAL": 100}]
repo.contar_total(filtro_ativo=False)
call_args = oracle_client.executar_query.call_args
query = call_args[0][0]
assert "E_CONSULTOR = 'S'" in query
assert "ATIVO = :ativo" in query
params = call_args[0][1]
assert params["ativo"] == "N"