Files
GTI_GERENCIADOR_FISCAL/tests/test_db_funcionarios.py
T
Gustavo 8d83122e98 feat: login individual por funcionario (cadastro, senha com hash, ativar/desativar)
- Tabela FUNCIONARIO_PAINEL (nova, ja criada no banco de dev) +
  app/db/funcionarios.py: nome/login/senha (hash scrypt, stdlib, sem
  dependencia nova) por funcionario, nunca excluido de verdade (so
  ativo/inativo).
- app/senha.py: gerar_hash/verificar_senha com hashlib.scrypt + salt
  aleatorio por senha.
- app/auth.py: login passa a checar duas fontes, nessa ordem -
  ADMIN_USER/ADMIN_PASSWORD (bootstrap, continua exigindo as duas
  preenchidas) e depois FUNCIONARIO_PAINEL (so contas ATIVO=1). O
  nome retornado (usado no log) passa a ser o nome de verdade do
  funcionario, nao mais sempre 'admin'.
- Tela /funcionarios: listar, criar (com confirmacao de senha e
  checagem de login duplicado), editar nome/login, redefinir senha
  (form separado) e ativar/desativar. Tudo logado em LOG_PAINEL.
- Testado ponta a ponta contra o app real: funcionario criado via
  tela consegue logar de verdade, e a acao aparece no /log com o
  nome de quem fez.

93/93 testes passando (23 novos).
2026-08-13 14:19:58 -03:00

79 lines
2.7 KiB
Python

"""Testes de integração contra o banco de dev (ver test_db_connection.py)."""
import pytest
from app.db import funcionarios as db_funcionarios
from app.db.connection import get_connection
LOGIN_TESTE = "teste.db.funcionarios"
def _limpar():
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute("DELETE FROM FUNCIONARIO_PAINEL WHERE LOGIN LIKE 'teste.db.funcionarios%'")
finally:
conn.close()
@pytest.fixture
def funcionario_id():
_limpar()
novo_id = db_funcionarios.criar_funcionario("Fulano Teste", LOGIN_TESTE, "senhaForte123")
yield novo_id
_limpar()
def test_criar_e_obter_funcionario(funcionario_id):
f = db_funcionarios.obter_funcionario(funcionario_id)
assert f is not None
assert f["NOME"] == "Fulano Teste"
assert f["LOGIN"] == LOGIN_TESTE
assert f["ATIVO"] == 1
assert "SENHA_HASH" not in f # obter_funcionario não expõe o hash
def test_obter_por_login_inclui_senha_hash(funcionario_id):
f = db_funcionarios.obter_por_login(LOGIN_TESTE)
assert f is not None
assert "SENHA_HASH" in f
assert f["SENHA_HASH"] != "senhaForte123" # nunca em texto puro
def test_obter_por_login_inexistente(funcionario_id):
assert db_funcionarios.obter_por_login("nao-existe-esse-login-xyz") is None
def test_login_em_uso(funcionario_id):
assert db_funcionarios.login_em_uso(LOGIN_TESTE) is True
assert db_funcionarios.login_em_uso(LOGIN_TESTE, ignorar_id=funcionario_id) is False
assert db_funcionarios.login_em_uso("login-que-nao-existe") is False
def test_listar_funcionarios_inclui_o_criado(funcionario_id):
logins = [f["LOGIN"] for f in db_funcionarios.listar_funcionarios()]
assert LOGIN_TESTE in logins
def test_atualizar_funcionario(funcionario_id):
novo_login = "teste.db.funcionarios.editado"
db_funcionarios.atualizar_funcionario(funcionario_id, "Fulano Editado", novo_login)
f = db_funcionarios.obter_funcionario(funcionario_id)
assert f["NOME"] == "Fulano Editado"
assert f["LOGIN"] == novo_login
def test_redefinir_senha(funcionario_id):
hash_antes = db_funcionarios.obter_por_login(LOGIN_TESTE)["SENHA_HASH"]
db_funcionarios.redefinir_senha(funcionario_id, "outraSenha456")
hash_depois = db_funcionarios.obter_por_login(LOGIN_TESTE)["SENHA_HASH"]
assert hash_antes != hash_depois
def test_alternar_ativo(funcionario_id):
assert db_funcionarios.obter_funcionario(funcionario_id)["ATIVO"] == 1
db_funcionarios.alternar_ativo(funcionario_id)
assert db_funcionarios.obter_funcionario(funcionario_id)["ATIVO"] == 0
db_funcionarios.alternar_ativo(funcionario_id)
assert db_funcionarios.obter_funcionario(funcionario_id)["ATIVO"] == 1