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).
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user