- 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>
58 lines
1.8 KiB
Python
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
|