import pytest from fastapi import FastAPI from fastapi.testclient import TestClient from app.auth import UsuarioLogado, exigir_login from app.routers import minha_conta as router_minha_conta app_teste = FastAPI() app_teste.include_router(router_minha_conta.router) 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_minha_conta.db_log, "registrar", lambda *args, **kwargs: None) def _logar_como(login: str, nome: str, perfil: str = "PADRAO"): app_teste.dependency_overrides[exigir_login] = lambda: UsuarioLogado(login=login, nome=nome, perfil=perfil) def test_get_minha_conta_mostra_nome_e_login(monkeypatch): _logar_como("fulano", "Fulano da Silva") monkeypatch.setattr( router_minha_conta.db_funcionarios, "obter_por_login", lambda login: {"ID": 1, "NOME": "Fulano da Silva", "LOGIN": "fulano", "SENHA_HASH": "x", "PERFIL": "PADRAO", "ATIVO": 1}, ) resposta = client.get("/minha-conta") assert resposta.status_code == 200 assert "Fulano da Silva" in resposta.text assert "fulano" in resposta.text def test_get_minha_conta_admin_env_mostra_aviso(monkeypatch): import os monkeypatch.setenv("ADMIN_USER", "admin") _logar_como("admin", "admin") monkeypatch.setattr(router_minha_conta.db_funcionarios, "obter_por_login", lambda login: None) resposta = client.get("/minha-conta") assert resposta.status_code == 200 assert ".env" in resposta.text def test_post_trocar_senha_com_sucesso(monkeypatch): _logar_como("fulano", "Fulano da Silva") monkeypatch.setattr( router_minha_conta.db_funcionarios, "obter_por_login", lambda login: {"ID": 1, "NOME": "Fulano da Silva", "LOGIN": "fulano", "SENHA_HASH": "hash-atual", "PERFIL": "PADRAO", "ATIVO": 1}, ) monkeypatch.setattr(router_minha_conta, "verificar_senha", lambda senha, hash_: True) capturado = {} monkeypatch.setattr( router_minha_conta.db_funcionarios, "redefinir_senha", lambda fid, nova: capturado.setdefault("dados", (fid, nova)), ) resposta = client.post( "/minha-conta/senha", data={ "senha_atual": "senhaAtual123", "nova_senha": "senhaNova456", "confirmar_nova_senha": "senhaNova456", "csrf_token": CSRF_TESTE, }, follow_redirects=True, ) assert resposta.status_code == 200 assert capturado["dados"] == (1, "senhaNova456") def test_post_trocar_senha_atual_errada_bloqueia(monkeypatch): _logar_como("fulano", "Fulano da Silva") monkeypatch.setattr( router_minha_conta.db_funcionarios, "obter_por_login", lambda login: {"ID": 1, "NOME": "Fulano da Silva", "LOGIN": "fulano", "SENHA_HASH": "hash-atual", "PERFIL": "PADRAO", "ATIVO": 1}, ) monkeypatch.setattr(router_minha_conta, "verificar_senha", lambda senha, hash_: False) chamou = {} monkeypatch.setattr( router_minha_conta.db_funcionarios, "redefinir_senha", lambda fid, nova: chamou.setdefault("ok", True) ) resposta = client.post( "/minha-conta/senha", data={ "senha_atual": "senhaErrada", "nova_senha": "senhaNova456", "confirmar_nova_senha": "senhaNova456", "csrf_token": CSRF_TESTE, }, ) assert resposta.status_code == 200 assert "senha atual" in resposta.text.lower() assert "ok" not in chamou def test_post_trocar_senha_confirmacao_nao_bate_bloqueia(monkeypatch): _logar_como("fulano", "Fulano da Silva") monkeypatch.setattr( router_minha_conta.db_funcionarios, "obter_por_login", lambda login: {"ID": 1, "NOME": "Fulano da Silva", "LOGIN": "fulano", "SENHA_HASH": "hash-atual", "PERFIL": "PADRAO", "ATIVO": 1}, ) monkeypatch.setattr(router_minha_conta, "verificar_senha", lambda senha, hash_: True) chamou = {} monkeypatch.setattr( router_minha_conta.db_funcionarios, "redefinir_senha", lambda fid, nova: chamou.setdefault("ok", True) ) resposta = client.post( "/minha-conta/senha", data={ "senha_atual": "senhaAtual123", "nova_senha": "senhaNova456", "confirmar_nova_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_post_trocar_senha_admin_env_bloqueia(monkeypatch): _logar_como("admin", "admin") monkeypatch.setattr(router_minha_conta.db_funcionarios, "obter_por_login", lambda login: None) chamou = {} monkeypatch.setattr( router_minha_conta.db_funcionarios, "redefinir_senha", lambda fid, nova: chamou.setdefault("ok", True) ) resposta = client.post( "/minha-conta/senha", data={ "senha_atual": "qualquer", "nova_senha": "senhaNova456", "confirmar_nova_senha": "senhaNova456", "csrf_token": CSRF_TESTE, }, ) assert resposta.status_code == 200 assert ".env" in resposta.text assert "ok" not in chamou