import pytest from fastapi import FastAPI from fastapi.testclient import TestClient from app.auth import exigir_login from app.routers import funcionarios as router_funcionarios app_teste = FastAPI() app_teste.include_router(router_funcionarios.router) app_teste.dependency_overrides[exigir_login] = lambda: "teste" client = TestClient(app_teste, follow_redirects=False) CSRF_TESTE = "teste-csrf-token" client.cookies.set("csrf_token", CSRF_TESTE) @pytest.fixture(autouse=True) def _sem_log_real(monkeypatch): monkeypatch.setattr(router_funcionarios.db_log, "registrar", lambda *args, **kwargs: None) def test_listar_funcionarios(monkeypatch): monkeypatch.setattr( router_funcionarios.db_funcionarios, "listar_funcionarios", lambda: [{"ID": 1, "NOME": "Fulano", "LOGIN": "fulano", "ATIVO": 1, "CRIADO_EM": "2026-01-01"}], ) resposta = client.get("/funcionarios") assert resposta.status_code == 200 assert "Fulano" in resposta.text def test_criar_funcionario_com_sucesso(monkeypatch): monkeypatch.setattr(router_funcionarios.db_funcionarios, "login_em_uso", lambda login, ignorar_id=None: False) criado = {} monkeypatch.setattr( router_funcionarios.db_funcionarios, "criar_funcionario", lambda nome, login, senha: criado.setdefault("dados", (nome, login, senha)) and 1, ) resposta = client.post( "/funcionarios/novo", data={ "nome": "Fulano", "login": "fulano", "senha": "senhaForte123", "confirmar_senha": "senhaForte123", "csrf_token": CSRF_TESTE, }, ) assert resposta.status_code == 303 assert criado["dados"] == ("Fulano", "fulano", "senhaForte123") def test_criar_funcionario_senhas_diferentes_bloqueia(monkeypatch): monkeypatch.setattr(router_funcionarios.db_funcionarios, "login_em_uso", lambda login, ignorar_id=None: False) chamou = {} monkeypatch.setattr( router_funcionarios.db_funcionarios, "criar_funcionario", lambda nome, login, senha: chamou.setdefault("ok", True), ) resposta = client.post( "/funcionarios/novo", data={ "nome": "Fulano", "login": "fulano", "senha": "senhaForte123", "confirmar_senha": "outraCoisa", "csrf_token": CSRF_TESTE, }, ) assert resposta.status_code == 200 assert "não coincidem" in resposta.text assert "ok" not in chamou def test_criar_funcionario_login_duplicado_bloqueia(monkeypatch): monkeypatch.setattr(router_funcionarios.db_funcionarios, "login_em_uso", lambda login, ignorar_id=None: True) chamou = {} monkeypatch.setattr( router_funcionarios.db_funcionarios, "criar_funcionario", lambda nome, login, senha: chamou.setdefault("ok", True), ) resposta = client.post( "/funcionarios/novo", data={ "nome": "Fulano", "login": "fulano", "senha": "senhaForte123", "confirmar_senha": "senhaForte123", "csrf_token": CSRF_TESTE, }, ) assert resposta.status_code == 200 assert "já está em uso" in resposta.text assert "ok" not in chamou def test_editar_funcionario_com_sucesso(monkeypatch): monkeypatch.setattr(router_funcionarios.db_funcionarios, "login_em_uso", lambda login, ignorar_id=None: False) capturado = {} monkeypatch.setattr( router_funcionarios.db_funcionarios, "atualizar_funcionario", lambda fid, nome, login: capturado.setdefault("dados", (fid, nome, login)), ) resposta = client.post( "/funcionarios/1/editar", data={"nome": "Fulano Editado", "login": "fulano.editado", "csrf_token": CSRF_TESTE}, ) assert resposta.status_code == 303 assert capturado["dados"] == (1, "Fulano Editado", "fulano.editado") def test_redefinir_senha_com_sucesso(monkeypatch): capturado = {} monkeypatch.setattr( router_funcionarios.db_funcionarios, "redefinir_senha", lambda fid, senha: capturado.setdefault("dados", (fid, senha)), ) resposta = client.post( "/funcionarios/1/redefinir-senha", data={"nova_senha": "novaSenha123", "confirmar_nova_senha": "novaSenha123", "csrf_token": CSRF_TESTE}, ) assert resposta.status_code == 303 assert capturado["dados"] == (1, "novaSenha123") def test_redefinir_senha_nao_coincide_bloqueia(monkeypatch): chamou = {} monkeypatch.setattr( router_funcionarios.db_funcionarios, "redefinir_senha", lambda fid, senha: chamou.setdefault("ok", True) ) resposta = client.post( "/funcionarios/1/redefinir-senha", data={"nova_senha": "a", "confirmar_nova_senha": "b", "csrf_token": CSRF_TESTE}, follow_redirects=True, ) assert "não coincidem" in resposta.text assert "ok" not in chamou def test_alternar_ativo(monkeypatch): capturado = {} monkeypatch.setattr( router_funcionarios.db_funcionarios, "alternar_ativo", lambda fid: capturado.setdefault("id", fid) ) resposta = client.post("/funcionarios/1/alternar-ativo", data={"csrf_token": CSRF_TESTE}) assert resposta.status_code == 303 assert capturado["id"] == 1