feat: bloquear CNPJ com DV inválido, gravar telefone/UF/CEP normalizados

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Gustavo
2026-08-14 12:18:24 -03:00
co-authored by Claude Sonnet 5
parent 8b5e7e251e
commit 59f15d9ac0
3 changed files with 170 additions and 22 deletions
+117 -4
View File
@@ -295,8 +295,8 @@ def test_criar_cliente_normaliza_cnpj_e_telefones(monkeypatch):
resposta = client.post("/clientes/novo", data=dados_form)
assert resposta.status_code == 303
assert capturado["dados"]["CNPJ"] == "11222333000181"
assert capturado["dados"]["TELEFONE"] == "7533334444"
assert capturado["dados"]["CELULAR"] == "75999091780"
assert capturado["dados"]["TELEFONE"] == "557533334444"
assert capturado["dados"]["CELULAR"] == "5575999091780"
def test_editar_cliente_normaliza_cnpj_e_telefones(monkeypatch):
@@ -320,8 +320,8 @@ def test_editar_cliente_normaliza_cnpj_e_telefones(monkeypatch):
resposta = client.post("/clientes/1/editar", data=dados_form)
assert resposta.status_code == 303
assert capturado["dados"]["CNPJ"] == "11144477735"
assert capturado["dados"]["TELEFONE"] == "7533334444"
assert capturado["dados"]["CELULAR"] == "75999091780"
assert capturado["dados"]["TELEFONE"] == "557533334444"
assert capturado["dados"]["CELULAR"] == "5575999091780"
def test_editar_cliente_codigo_duplicado_bloqueia_sem_bypass(monkeypatch):
@@ -407,3 +407,116 @@ def test_criar_cliente_com_dv_invalido_exige_confirmacao(monkeypatch):
resposta = client.post("/clientes/novo", data=dados_form)
assert resposta.status_code == 303
assert criado.get("ok") is True
def test_criar_cliente_com_cnpj_dv_invalido_bloqueia_sempre(monkeypatch):
"""
Diferente de CPF: CNPJ com DV inválido bloqueia sempre, sem opção de
"cadastrar mesmo assim" — nem com confirmar_dv_invalido=1.
"""
monkeypatch.setattr(router_clientes.db_clientes, "codigo_em_uso", lambda codigo, ignorar_id=None: False)
criado = {}
monkeypatch.setattr(
router_clientes.db_clientes, "criar_cliente", lambda dados: criado.setdefault("ok", True) and 42
)
dados_form = _form_valido()
dados_form["CNPJ"] = "11222333000180" # último dígito trocado: DV inválido
resposta = client.post("/clientes/novo", data=dados_form)
assert resposta.status_code == 200
assert "não confere" in resposta.text
assert "ok" not in criado
# Mesmo confirmando, continua bloqueando (diferente do fluxo de CPF).
dados_form["confirmar_dv_invalido"] = "1"
resposta = client.post("/clientes/novo", data=dados_form)
assert resposta.status_code == 200
assert "ok" not in criado
def test_editar_cliente_com_cnpj_dv_invalido_bloqueia(monkeypatch):
monkeypatch.setattr(router_clientes.db_clientes, "codigo_em_uso", lambda codigo, ignorar_id=None: False)
atualizado = {}
monkeypatch.setattr(
router_clientes.db_clientes,
"atualizar_cliente",
lambda cliente_id, dados: atualizado.setdefault("ok", True),
)
dados_form = _form_valido()
dados_form["CNPJ"] = "11222333000180"
resposta = client.post("/clientes/1/editar", data=dados_form)
assert resposta.status_code == 200
assert "não confere" in resposta.text
assert "ok" not in atualizado
def test_criar_cliente_com_cpf_dv_invalido_continua_permitindo_confirmar(monkeypatch):
"""Regressão: CPF com DV inválido não muda de comportamento."""
monkeypatch.setattr(router_clientes.db_clientes, "codigo_em_uso", lambda codigo, ignorar_id=None: False)
criado = {}
monkeypatch.setattr(
router_clientes.db_clientes, "criar_cliente", lambda dados: criado.setdefault("ok", True) and 42
)
dados_form = _form_valido()
dados_form["CNPJ"] = "11144477734" # CPF com DV inválido
resposta = client.post("/clientes/novo", data=dados_form)
assert resposta.status_code == 200
assert "não confere" in resposta.text
assert "ok" not in criado
dados_form["confirmar_dv_invalido"] = "1"
resposta = client.post("/clientes/novo", data=dados_form)
assert resposta.status_code == 303
assert criado.get("ok") is True
def test_criar_cliente_grava_telefone_com_ddi_55(monkeypatch):
monkeypatch.setattr(router_clientes.db_clientes, "codigo_em_uso", lambda codigo, ignorar_id=None: False)
capturado = {}
monkeypatch.setattr(
router_clientes.db_clientes, "criar_cliente", lambda dados: capturado.setdefault("dados", dados) and 42
)
dados_form = _form_valido()
dados_form.update({"TELEFONE": "(75) 3333-4444", "CELULAR": "(75) 99909-1780"})
resposta = client.post("/clientes/novo", data=dados_form)
assert resposta.status_code == 303
assert capturado["dados"]["TELEFONE"] == "557533334444"
assert capturado["dados"]["CELULAR"] == "5575999091780"
def test_criar_cliente_telefone_ja_com_55_nao_duplica(monkeypatch):
monkeypatch.setattr(router_clientes.db_clientes, "codigo_em_uso", lambda codigo, ignorar_id=None: False)
capturado = {}
monkeypatch.setattr(
router_clientes.db_clientes, "criar_cliente", lambda dados: capturado.setdefault("dados", dados) and 42
)
dados_form = _form_valido()
dados_form["CELULAR"] = "5575999091780"
resposta = client.post("/clientes/novo", data=dados_form)
assert resposta.status_code == 303
assert capturado["dados"]["CELULAR"] == "5575999091780"
def test_criar_cliente_grava_uf_maiuscula_e_cep_sem_traco(monkeypatch):
monkeypatch.setattr(router_clientes.db_clientes, "codigo_em_uso", lambda codigo, ignorar_id=None: False)
capturado = {}
monkeypatch.setattr(
router_clientes.db_clientes, "criar_cliente", lambda dados: capturado.setdefault("dados", dados) and 42
)
dados_form = _form_valido()
dados_form.update({"UF": "ba", "CEP": "44430-174"})
resposta = client.post("/clientes/novo", data=dados_form)
assert resposta.status_code == 303
assert capturado["dados"]["UF"] == "BA"
assert capturado["dados"]["CEP"] == "44430174"