Files
gti d95165fc8f Add 'gerenciador/' from commit '34cc9c75a57dedbf61a6e6a1ba1f35f76e72434b'
git-subtree-dir: gerenciador
git-subtree-mainline: f4f546c928
git-subtree-split: 34cc9c75a5
2026-09-29 14:43:12 -03:00

135 lines
5.5 KiB
Python

import pytest
from fastapi import FastAPI
from fastapi.testclient import TestClient
from app.auth import UsuarioLogado, exigir_login
from app.routers import log as router_log
app_teste = FastAPI()
app_teste.include_router(router_log.router)
app_teste.dependency_overrides[exigir_login] = lambda: UsuarioLogado(login="admin", nome="Admin", perfil="ADMIN")
client = TestClient(app_teste, follow_redirects=False)
CSRF_TESTE = "teste-csrf-token"
client.cookies.set("csrf_token", CSRF_TESTE)
@pytest.fixture(autouse=True)
def _admin_como_padrao():
"""Todo teste roda como admin por padrão (override acima). Testes que
querem simular usuário padrão sobrescrevem de novo dentro do próprio
teste e restauram no fim via yield."""
yield
app_teste.dependency_overrides[exigir_login] = lambda: UsuarioLogado(login="admin", nome="Admin", perfil="ADMIN")
@pytest.fixture(autouse=True)
def _sem_log_real(monkeypatch):
monkeypatch.setattr(router_log.db_log, "registrar", lambda *args, **kwargs: None)
def test_pagina_log_mostra_acoes_do_painel(monkeypatch):
capturado = {}
monkeypatch.setattr(
router_log.db_log,
"listar",
lambda limite=100: capturado.setdefault("limite", limite) and [
{
"ID": 1, "CRIADO_EM": "2026-08-13 10:00:00", "USUARIO": "admin", "ACAO": "criar",
"ENTIDADE": "cliente", "ENTIDADE_ID": "000001", "SUCESSO": 1, "DETALHE": None,
}
],
)
monkeypatch.setattr(router_log.n8n_client, "listar_envios", lambda limite=50: [])
monkeypatch.setattr(router_log.n8n_client, "configurado", lambda: False)
resposta = client.get("/log")
assert resposta.status_code == 200
assert "admin" in resposta.text
assert "criar" in resposta.text
assert "N8N_API_URL" in resposta.text # aviso de integração não configurada
assert capturado["limite"] == 20
def test_pagina_log_mostra_envios_quando_configurado(monkeypatch):
monkeypatch.setattr(router_log.db_log, "listar", lambda limite=20: [])
monkeypatch.setattr(
router_log.n8n_client,
"listar_envios",
lambda limite=50: [
{
"data_processamento": "2026-08-13T10:00:00", "nome_cliente": "Cliente Teste",
"codigo_cliente": "000001", "competencia": "2026-08", "status": "enviado",
"telefones_enviados": "5575999090000", "telefones_com_erro": "",
}
],
)
monkeypatch.setattr(router_log.n8n_client, "configurado", lambda: True)
resposta = client.get("/log")
assert resposta.status_code == 200
assert "Cliente Teste" in resposta.text
assert "enviado" in resposta.text
def test_pagina_log_admin_ve_botao_de_limpar(monkeypatch):
monkeypatch.setattr(router_log.db_log, "listar", lambda limite=20: [])
monkeypatch.setattr(router_log.n8n_client, "listar_envios", lambda limite=50: [])
monkeypatch.setattr(router_log.n8n_client, "configurado", lambda: False)
resposta = client.get("/log")
assert resposta.status_code == 200
assert "/log/limpar" in resposta.text
def test_pagina_log_usuario_padrao_nao_ve_botao_de_limpar(monkeypatch):
app_teste.dependency_overrides[exigir_login] = lambda: UsuarioLogado(login="fulano", nome="Fulano", perfil="PADRAO")
monkeypatch.setattr(router_log.db_log, "listar", lambda limite=20: [])
monkeypatch.setattr(router_log.n8n_client, "listar_envios", lambda limite=50: [])
monkeypatch.setattr(router_log.n8n_client, "configurado", lambda: False)
resposta = client.get("/log")
assert resposta.status_code == 200
assert "/log/limpar" not in resposta.text
def test_limpar_log_admin_funciona(monkeypatch):
chamou = {}
monkeypatch.setattr(router_log.db_log, "limpar", lambda: chamou.setdefault("limpou", True))
resposta = client.post("/log/limpar", data={"csrf_token": CSRF_TESTE})
assert resposta.status_code == 303
assert resposta.headers["location"].startswith("/log?")
assert chamou.get("limpou") is True
def test_limpar_log_usuario_padrao_toma_403():
app_teste.dependency_overrides[exigir_login] = lambda: UsuarioLogado(login="fulano", nome="Fulano", perfil="PADRAO")
resposta = client.post("/log/limpar", data={"csrf_token": CSRF_TESTE})
assert resposta.status_code == 403
def test_pagina_log_secoes_comecam_fechadas(monkeypatch):
monkeypatch.setattr(router_log.db_log, "listar", lambda limite=20: [])
monkeypatch.setattr(router_log.n8n_client, "listar_envios", lambda limite=50: [])
monkeypatch.setattr(router_log.n8n_client, "configurado", lambda: False)
resposta = client.get("/log")
assert resposta.status_code == 200
texto = resposta.text
assert texto.count('<details class="secao-log">') == 2
assert "<details class=\"secao-log\" open>" not in texto
assert "<details class='secao-log' open>" not in texto
def test_pagina_log_botao_toggle_tem_handler_de_clique_proprio(monkeypatch):
"""Regressão: um <button> dentro de <summary> não propaga o clique para
o toggle nativo do <details> — precisa de um listener de clique
explícito que abre/fecha a seção manualmente (ver log.html)."""
monkeypatch.setattr(router_log.db_log, "listar", lambda limite=20: [])
monkeypatch.setattr(router_log.n8n_client, "listar_envios", lambda limite=50: [])
monkeypatch.setattr(router_log.n8n_client, "configurado", lambda: False)
resposta = client.get("/log")
assert resposta.status_code == 200
assert 'botao.addEventListener("click"' in resposta.text
assert "secao.open = !secao.open" in resposta.text