feat: filtro de status (ativos/inativos/todos) na rota de listagem

This commit is contained in:
Gustavo
2026-08-20 09:52:28 -03:00
parent 4fd4649edd
commit 710d688d38
3 changed files with 105 additions and 35 deletions
+6 -6
View File
@@ -25,8 +25,8 @@ def test_docs_desabilitado_retorna_404():
def test_raiz_redireciona_para_clientes_com_login(monkeypatch):
from app.routers import clientes as router_clientes
monkeypatch.setattr(router_clientes.db_clientes, "listar_clientes", lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": [])
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 0)
monkeypatch.setattr(router_clientes.db_clientes, "listar_clientes", lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: [])
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1: 0)
resposta = client.get("/", cookies=_cookie_sessao_admin(), follow_redirects=False)
assert resposta.status_code == 307
assert resposta.headers["location"] == "/clientes"
@@ -77,9 +77,9 @@ def test_pagina_clientes_tem_csrf_token_preenchido_no_botao_sair(monkeypatch):
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": [],
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: [],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 0)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1: 0)
client.cookies.clear()
resposta = client.get("/clientes", cookies=_cookie_sessao_admin())
@@ -105,9 +105,9 @@ def test_logout_funciona_depois_de_visitar_clientes(monkeypatch):
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": [],
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: [],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 0)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1: 0)
client.cookies.clear()
client.cookies.update(_cookie_sessao_admin())
+87 -26
View File
@@ -58,6 +58,7 @@ def _form_valido(codigo: str = "000001") -> dict:
"DATA_CONTRATO": "2026-01-01",
"VENCIMENTO_CONTRATO": "2027-01-01",
"DIA_VENCIMENTO": "10",
"ATIVO": "1",
"csrf_token": CSRF_TESTE,
}
)
@@ -103,9 +104,9 @@ def test_listar_clientes_por_pagina_padrao_e_15(monkeypatch):
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": capturado.setdefault("limite", limite) and [],
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: capturado.setdefault("limite", limite) and [],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 3)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:3)
resposta = client.get("/clientes")
assert resposta.status_code == 200
@@ -117,9 +118,9 @@ def test_listar_clientes_por_pagina_da_query_e_usada_e_grava_cookie(monkeypatch)
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": capturado.setdefault("limite", limite) and [],
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: capturado.setdefault("limite", limite) and [],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 3)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:3)
resposta = client.get("/clientes?por_pagina=50")
assert resposta.status_code == 200
@@ -132,9 +133,9 @@ def test_listar_clientes_usa_cookie_quando_sem_por_pagina_na_query(monkeypatch):
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": capturado.setdefault("limite", limite) and [],
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: capturado.setdefault("limite", limite) and [],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 3)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:3)
resposta = client.get("/clientes", cookies={router_clientes.POR_PAGINA_COOKIE: "30"})
assert resposta.status_code == 200
@@ -146,9 +147,9 @@ def test_listar_clientes_por_pagina_invalida_na_query_cai_no_padrao_e_nao_grava_
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": capturado.setdefault("limite", limite) and [],
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: capturado.setdefault("limite", limite) and [],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 3)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:3)
resposta = client.get("/clientes?por_pagina=999")
assert resposta.status_code == 200
@@ -156,15 +157,75 @@ def test_listar_clientes_por_pagina_invalida_na_query_cai_no_padrao_e_nao_grava_
assert router_clientes.POR_PAGINA_COOKIE not in resposta.cookies
def test_listar_clientes_status_padrao_e_ativos(monkeypatch):
capturado = {}
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: (capturado.__setitem__("filtro_ativo", filtro_ativo), [])[1],
)
monkeypatch.setattr(
router_clientes.db_clientes,
"contar_clientes",
lambda busca=None, ordenar_por="razao", filtro_ativo=1: 0,
)
resposta = client.get("/clientes")
assert resposta.status_code == 200
assert capturado["filtro_ativo"] == 1
def test_listar_clientes_status_inativos_usa_filtro_zero(monkeypatch):
capturado = {}
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: (capturado.__setitem__("filtro_ativo", filtro_ativo), [])[1],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1: 0)
resposta = client.get("/clientes?status=inativos")
assert resposta.status_code == 200
assert capturado["filtro_ativo"] == 0
def test_listar_clientes_status_todos_sem_filtro(monkeypatch):
capturado = {}
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: (capturado.__setitem__("filtro_ativo", filtro_ativo), [])[1],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1: 0)
resposta = client.get("/clientes?status=todos")
assert resposta.status_code == 200
assert capturado["filtro_ativo"] is None
def test_listar_clientes_status_invalido_cai_no_padrao(monkeypatch):
capturado = {}
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: (capturado.__setitem__("filtro_ativo", filtro_ativo), [])[1],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1: 0)
resposta = client.get("/clientes?status=lixo_qualquer")
assert resposta.status_code == 200
assert capturado["filtro_ativo"] == 1
def test_listar_clientes(monkeypatch):
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": [
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: [
{"ID": 1, "CODIGO": "000001", "RAZAO": "Cliente Um", "FANTASIA": "Um", "CNPJ": "11222333000181"}
],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 1)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:1)
resposta = client.get("/clientes")
assert resposta.status_code == 200
assert "Cliente Um" in resposta.text
@@ -174,9 +235,9 @@ def test_listar_clientes_inclui_csrf_token_no_contexto(monkeypatch):
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": [],
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: [],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 0)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:0)
resposta = client.get("/clientes")
assert resposta.status_code == 200
@@ -191,11 +252,11 @@ def test_listar_clientes_tem_botao_de_gerar_chave_por_linha(monkeypatch):
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": [
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: [
{"ID": 1, "CODIGO": "000042", "RAZAO": "Cliente Um", "FANTASIA": "Um", "CNPJ": "11222333000181"}
],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 1)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:1)
resposta = client.get("/clientes")
assert resposta.status_code == 200
@@ -208,12 +269,12 @@ def test_listar_clientes_pagina_com_controles_de_paginacao(monkeypatch):
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": [
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: [
{"ID": i, "CODIGO": f"{i:06d}", "RAZAO": f"Cliente {i}", "FANTASIA": f"C{i}", "CNPJ": "11222333000181"}
for i in range(1, 6)
],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 250)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:250)
resposta = client.get("/clientes?pagina=2&por_pagina=100")
assert resposta.status_code == 200
@@ -226,12 +287,12 @@ def test_listar_clientes_footer_com_selecao_de_por_pagina(monkeypatch):
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": [
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: [
{"ID": i, "CODIGO": f"{i:06d}", "RAZAO": f"Cliente {i}", "FANTASIA": f"C{i}", "CNPJ": "1"}
for i in range(1, 16)
],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 98)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:98)
resposta = client.get("/clientes?pagina=1")
assert resposta.status_code == 200
@@ -243,7 +304,7 @@ def test_listar_clientes_footer_com_selecao_de_por_pagina(monkeypatch):
def test_listar_clientes_paginacao_com_reticencias_quando_muitas_paginas(monkeypatch):
monkeypatch.setattr(router_clientes.db_clientes, "listar_clientes", lambda **kwargs: [])
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 500)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:500)
# 500 / 5 = 100 paginas, pedindo a pagina 10 (no meio) -> tem reticencias
resposta = client.get("/clientes?pagina=10&por_pagina=5")
@@ -254,12 +315,12 @@ def test_listar_clientes_paginacao_com_reticencias_quando_muitas_paginas(monkeyp
def test_listar_clientes_ordenar_por_invalido_cai_no_padrao(monkeypatch):
capturado = {}
def _listar_clientes(busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc"):
def _listar_clientes(busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1):
capturado["ordenar_por"] = ordenar_por
return []
monkeypatch.setattr(router_clientes.db_clientes, "listar_clientes", _listar_clientes)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 0)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:0)
client.get("/clientes?ordenar_por=coisa_invalida_qualquer")
assert capturado["ordenar_por"] == "razao"
@@ -272,7 +333,7 @@ def test_cabecalhos_da_lista_alternam_direcao(monkeypatch):
monkeypatch.setattr(
router_clientes.db_clientes, "listar_clientes", lambda **kwargs: []
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 0)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:0)
# Sem ordenar_por/direcao na URL: padrão é razao/asc. Clicar de novo em
# "Razão" deve levar pra desc; clicar em "Código" (coluna diferente da
@@ -296,12 +357,12 @@ def test_busca_com_e_comercial_nao_quebra_links_de_paginacao_e_ordenacao(monkeyp
monkeypatch.setattr(
router_clientes.db_clientes,
"listar_clientes",
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc": [
lambda busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1: [
{"ID": i, "CODIGO": f"{i:06d}", "RAZAO": f"Cliente {i}", "FANTASIA": f"C{i}", "CNPJ": "1"}
for i in range(1, 6)
],
)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 250)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:250)
resposta = client.get("/clientes?pagina=2&busca=A%26B")
assert resposta.status_code == 200
@@ -312,12 +373,12 @@ def test_busca_com_e_comercial_nao_quebra_links_de_paginacao_e_ordenacao(monkeyp
def test_listar_clientes_direcao_invalida_cai_no_padrao(monkeypatch):
capturado = {}
def _listar_clientes(busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc"):
def _listar_clientes(busca=None, limite=100, offset=0, ordenar_por="razao", direcao="asc", filtro_ativo=1):
capturado["direcao"] = direcao
return []
monkeypatch.setattr(router_clientes.db_clientes, "listar_clientes", _listar_clientes)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 0)
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao", filtro_ativo=1:0)
client.get("/clientes?direcao=coisa_invalida")
assert capturado["direcao"] == "asc"