- 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).
79 lines
2.7 KiB
Python
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
|