Files
GTI_GERENCIADOR_FISCAL/tests/test_db_chaves.py
T
GustavoandClaude Sonnet 5 0d839949fe fix: validacao de formulario, auth fail-closed, loop de confirmacao, hardening e docs (achados da revisao final)
- Fix 1 (critico): cliente_form.html agora tem required/type por campo
  (date/number) e o router captura DataError/IntegrityError em
  criar/editar, reexibindo o form com erro_gravacao em vez de 500.
- Fix 2 (importante): auth.py falha fechado quando ADMIN_USER/
  ADMIN_PASSWORD nao estao configurados (nao tenta mais compare_digest
  com string vazia).
- Fix 3 (importante): avisos de codigo duplicado e DV invalido agora
  carregam a flag de confirmacao um do outro adiante, quebrando o loop
  quando ambos disparam no mesmo cliente.
- Fix 4 (menor): corrige precedencia 'or 42' -> 'and 42' no lambda de
  teste de criar_cliente.
- Fix 5 (menor): desabilita /docs, /redoc, /openapi.json no FastAPI().
- Fix 6 (menor): comentario explicando o valor de Prorrogacao no fixture
  de teste de chaves.
- Fix 7 (menor): .env.example usa host.docker.internal por padrao,
  docker-compose.yml ganha extra_hosts para Linux, README.md novo com
  quickstart real.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-13 10:46:23 -03:00

58 lines
1.8 KiB
Python

"""
Testes de integração. Clientes_Chaves é MyISAM, sem FK com CLIENTE — o
teste cria e limpa a linha diretamente por SQL.
"""
import pytest
from app.db import chaves as db_chaves
from app.db.connection import get_connection
CODIGO_TESTE = "999903"
def _linha_vazia(codigo: str, cliente: str) -> dict:
linha = {f"M{i}": "" for i in range(1, 13)}
linha["ID"] = codigo
linha["Cliente"] = cliente
# "0000-00-00" (o valor real usado no legado) é rejeitado pelo MySQL em modo estrito
# (NO_ZERO_DATE) — usamos uma data valida qualquer, só para satisfazer a coluna NOT NULL.
linha["Prorrogacao"] = "2099-12-31"
return linha
@pytest.fixture
def chave_teste():
conn = get_connection()
try:
with conn.cursor() as cur:
linha = _linha_vazia(CODIGO_TESTE, "TESTE PAINEL")
linha["M8"] = "0B62CF51CDCF3328107092"
colunas = ", ".join(linha.keys())
marcadores = ", ".join(["%s"] * len(linha))
cur.execute(
f"INSERT INTO Clientes_Chaves ({colunas}) VALUES ({marcadores})",
list(linha.values()),
)
finally:
conn.close()
yield CODIGO_TESTE
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute("DELETE FROM Clientes_Chaves WHERE ID = %s", (CODIGO_TESTE,))
finally:
conn.close()
def test_status_chaves_existente(chave_teste):
status = db_chaves.status_chaves(CODIGO_TESTE)
assert status is not None
assert status["codigo"] == CODIGO_TESTE
assert status["cliente"] == "TESTE PAINEL"
assert status["meses"]["M8"] == "0B62CF51CDCF3328107092"
assert status["meses"]["M1"] is None
def test_status_chaves_inexistente():
assert db_chaves.status_chaves("999999") is None