Antes, digitar qualquer coisa na busca comparava com CODIGO, CNPJ, RAZAO e FANTASIA ao mesmo tempo (OR), entao escolher 'Ordenar por: Codigo' e buscar '242' trazia tambem clientes cujo CNPJ ou Razao continham '242' em outro lugar. Agora a busca usa so a coluna selecionada no dropdown (mesma whitelist ja usada pra ordenacao). listar_clientes()/contar_clientes() e o template ganharam o ajuste; o dropdown mudou de rotulo pra 'Buscar/ordenar por' pra deixar claro que controla os dois. 93/93 testes passando.
61 lines
2.1 KiB
Python
61 lines
2.1 KiB
Python
import base64
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
from app.main import app
|
|
|
|
client = TestClient(app)
|
|
_AUTH_HEADERS = {"Authorization": f"Basic {base64.b64encode(b'admin:teste123').decode()}"}
|
|
|
|
|
|
def test_raiz_sem_login_pede_credenciais():
|
|
resposta = client.get("/", follow_redirects=False)
|
|
assert resposta.status_code == 401
|
|
|
|
|
|
def test_docs_desabilitado_retorna_404():
|
|
assert client.get("/docs").status_code == 404
|
|
assert client.get("/redoc").status_code == 404
|
|
assert client.get("/openapi.json").status_code == 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: [])
|
|
monkeypatch.setattr(router_clientes.db_clientes, "contar_clientes", lambda busca=None, ordenar_por="razao": 0)
|
|
resposta = client.get("/", headers=_AUTH_HEADERS, follow_redirects=False)
|
|
assert resposta.status_code == 307
|
|
assert resposta.headers["location"] == "/clientes"
|
|
|
|
|
|
def test_csrf_middleware_define_cookie_em_qualquer_resposta():
|
|
client.cookies.clear()
|
|
resposta = client.get("/docs")
|
|
assert resposta.status_code == 404
|
|
assert "csrf_token" in resposta.cookies
|
|
|
|
|
|
def test_csrf_bloqueia_post_com_token_que_nao_bate_com_cookie():
|
|
client.cookies.clear()
|
|
resposta = client.post(
|
|
"/clientes/1/excluir", headers=_AUTH_HEADERS, data={"csrf_token": "token-forjado-sem-cookie"}
|
|
)
|
|
assert resposta.status_code == 403
|
|
|
|
|
|
def test_csrf_libera_post_quando_token_bate_com_cookie(monkeypatch):
|
|
from app.routers import clientes as router_clientes
|
|
|
|
monkeypatch.setattr(router_clientes.db_clientes, "excluir_cliente", lambda cliente_id: None)
|
|
|
|
client.cookies.clear()
|
|
client.get("/docs") # só para o middleware definir o cookie csrf_token no client de teste
|
|
token_cookie = client.cookies.get("csrf_token")
|
|
assert token_cookie
|
|
|
|
resposta = client.post(
|
|
"/clientes/1/excluir", headers=_AUTH_HEADERS, data={"csrf_token": token_cookie}, follow_redirects=False
|
|
)
|
|
assert resposta.status_code == 303
|