feat: formulario de edicao de contato na tela de detalhe do cliente
Adiciona UI (details/summary, sem JS) para editar nome/telefone/email
de um contato existente, usando a rota POST /clientes/{id}/contatos/{id}/editar
que ja existia no router e no db mas nunca tinha formulario associado.
Cobre com testes de rota (sucesso + telefone duplicado) e um teste
verificando que a tela de detalhe realmente renderiza o formulario.
This commit is contained in:
@@ -18,6 +18,18 @@
|
||||
<tr>
|
||||
<td>{{ ct.NOME }}</td><td>{{ ct.TELEFONE }}</td><td>{{ ct.EMAIL or "" }}</td>
|
||||
<td>
|
||||
<details style="display:inline-block">
|
||||
<summary class="botao" style="display:inline-block;cursor:pointer">Editar</summary>
|
||||
<form method="post" action="/clientes/{{ cliente.ID }}/contatos/{{ ct.ID }}/editar" style="margin-top:8px">
|
||||
<label for="nome-{{ ct.ID }}">Nome</label>
|
||||
<input type="text" id="nome-{{ ct.ID }}" name="nome" value="{{ ct.NOME or '' }}">
|
||||
<label for="telefone-{{ ct.ID }}">Telefone</label>
|
||||
<input type="text" id="telefone-{{ ct.ID }}" name="telefone" value="{{ ct.TELEFONE }}" required>
|
||||
<label for="email-{{ ct.ID }}">E-mail</label>
|
||||
<input type="text" id="email-{{ ct.ID }}" name="email" value="{{ ct.EMAIL or '' }}">
|
||||
<button type="submit">Salvar</button>
|
||||
</form>
|
||||
</details>
|
||||
<form method="post" action="/clientes/{{ cliente.ID }}/contatos/{{ ct.ID }}/excluir" style="display:inline">
|
||||
<button type="submit" onclick="return confirm('Excluir este contato?')">Excluir</button>
|
||||
</form>
|
||||
|
||||
@@ -29,6 +29,26 @@ def test_listar_clientes(monkeypatch):
|
||||
assert "Cliente Um" in resposta.text
|
||||
|
||||
|
||||
def test_detalhe_cliente_mostra_formulario_de_edicao_de_contato(monkeypatch):
|
||||
monkeypatch.setattr(
|
||||
router_clientes.db_clientes,
|
||||
"obter_cliente",
|
||||
lambda cid: {"ID": cid, "CODIGO": "000001", "RAZAO": "Cliente Um", "FANTASIA": "Um", "CNPJ": "11222333000181"},
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
router_clientes.db_contatos,
|
||||
"listar_contatos_por_cliente",
|
||||
lambda cid: [{"ID": 7, "NOME": "Fulano", "TELEFONE": "75999090001", "EMAIL": None}],
|
||||
)
|
||||
monkeypatch.setattr(router_clientes.db_chaves, "status_chaves", lambda codigo: None)
|
||||
|
||||
resposta = client.get("/clientes/1")
|
||||
assert resposta.status_code == 200
|
||||
assert '/clientes/1/contatos/7/editar' in resposta.text
|
||||
assert 'value="Fulano"' in resposta.text
|
||||
assert 'value="75999090001"' in resposta.text
|
||||
|
||||
|
||||
def test_criar_cliente_codigo_duplicado_exige_confirmacao(monkeypatch):
|
||||
monkeypatch.setattr(router_clientes.db_clientes, "codigo_em_uso", lambda codigo, ignorar_id=None: True)
|
||||
criado = {}
|
||||
|
||||
@@ -39,6 +39,39 @@ def test_adicionar_contato_duplicado_avisa(monkeypatch):
|
||||
assert "já está cadastrado" in resposta.text
|
||||
|
||||
|
||||
def test_editar_contato_com_sucesso(monkeypatch):
|
||||
monkeypatch.setattr(router_contatos.db_contatos, "contato_duplicado", lambda cid, tel, ignorar_id=None: False)
|
||||
chamadas = {}
|
||||
monkeypatch.setattr(
|
||||
router_contatos.db_contatos,
|
||||
"atualizar_contato",
|
||||
lambda contato_id, cid, nome, tel, email=None: chamadas.setdefault(
|
||||
"dados", (contato_id, cid, nome, tel, email)
|
||||
),
|
||||
)
|
||||
|
||||
resposta = client.post(
|
||||
"/clientes/1/contatos/5/editar",
|
||||
data={"nome": "Fulano Editado", "telefone": "(75) 99909-0002", "email": "fulano@example.com"},
|
||||
)
|
||||
assert resposta.status_code == 303
|
||||
assert chamadas["dados"] == (5, 1, "Fulano Editado", "75999090002", "fulano@example.com")
|
||||
|
||||
|
||||
def test_editar_contato_duplicado_avisa(monkeypatch):
|
||||
monkeypatch.setattr(router_contatos.db_contatos, "contato_duplicado", lambda cid, tel, ignorar_id=None: True)
|
||||
monkeypatch.setattr(router_clientes.db_clientes, "obter_cliente", lambda cid: {"ID": cid, "CODIGO": "000001", "RAZAO": "Cliente", "FANTASIA": "Cliente"})
|
||||
monkeypatch.setattr(router_clientes.db_contatos, "listar_contatos_por_cliente", lambda cid: [])
|
||||
monkeypatch.setattr(router_clientes.db_chaves, "status_chaves", lambda codigo: None)
|
||||
|
||||
resposta = client.post(
|
||||
"/clientes/1/contatos/5/editar",
|
||||
data={"nome": "Fulano", "telefone": "75999090001"},
|
||||
follow_redirects=True,
|
||||
)
|
||||
assert "já está cadastrado" in resposta.text
|
||||
|
||||
|
||||
def test_excluir_contato(monkeypatch):
|
||||
monkeypatch.setattr(router_contatos.db_clientes, "obter_cliente", lambda cid: {"ID": cid, "CODIGO": "000001"})
|
||||
chamadas = {}
|
||||
|
||||
Reference in New Issue
Block a user