import base64 import pytest from fastapi import Depends, FastAPI from fastapi.testclient import TestClient from app.auth import exigir_login from app.db import funcionarios as db_funcionarios from app.db.connection import get_connection app_teste = FastAPI() @app_teste.get("/protegido") def rota_protegida(usuario: str = Depends(exigir_login)): return {"usuario": usuario} client = TestClient(app_teste) def _basic(usuario: str, senha: str) -> dict: token = base64.b64encode(f"{usuario}:{senha}".encode()).decode() return {"Authorization": f"Basic {token}"} def test_sem_credenciais_retorna_401(): resposta = client.get("/protegido") assert resposta.status_code == 401 def test_credenciais_erradas_retorna_401(): resposta = client.get("/protegido", headers=_basic("admin", "senha_errada")) assert resposta.status_code == 401 def test_credenciais_corretas_retorna_200(): # ADMIN_USER/ADMIN_PASSWORD vêm de tests/conftest.py ("admin"/"teste123") resposta = client.get("/protegido", headers=_basic("admin", "teste123")) assert resposta.status_code == 200 assert resposta.json() == {"usuario": "admin"} def test_admin_user_e_senha_vazios_nao_autentica_com_credenciais_vazias(monkeypatch): # Sem ADMIN_USER/ADMIN_PASSWORD configurados, o painel não pode ficar # aberto para uma requisição com usuário/senha vazios (Basic Og==). monkeypatch.setenv("ADMIN_USER", "") monkeypatch.setenv("ADMIN_PASSWORD", "") resposta = client.get("/protegido", headers=_basic("", "")) assert resposta.status_code == 401 def _limpar_login(login: str) -> None: conn = get_connection() try: with conn.cursor() as cur: cur.execute("DELETE FROM FUNCIONARIO_PAINEL WHERE LOGIN = %s", (login,)) finally: conn.close() @pytest.fixture def funcionario_teste(): login = "teste.login.auth" _limpar_login(login) funcionario_id = db_funcionarios.criar_funcionario("Fulano de Teste", login, "senhaForte123") yield login _limpar_login(login) def test_funcionario_ativo_com_senha_correta_autentica(funcionario_teste): resposta = client.get("/protegido", headers=_basic(funcionario_teste, "senhaForte123")) assert resposta.status_code == 200 assert resposta.json() == {"usuario": "Fulano de Teste"} def test_funcionario_com_senha_errada_nao_autentica(funcionario_teste): resposta = client.get("/protegido", headers=_basic(funcionario_teste, "senhaErrada")) assert resposta.status_code == 401 def test_funcionario_inativo_nao_autentica(funcionario_teste): funcionario = db_funcionarios.obter_por_login(funcionario_teste) db_funcionarios.alternar_ativo(funcionario["ID"]) # desativa resposta = client.get("/protegido", headers=_basic(funcionario_teste, "senhaForte123")) assert resposta.status_code == 401 def test_login_inexistente_nao_autentica(): resposta = client.get("/protegido", headers=_basic("nao-existe-esse-login", "qualquer")) assert resposta.status_code == 401